- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python实现推箱子游戏由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了python实现推箱子游戏的具体代码,供大家参考,具体内容如下 。
题目描述:
最短路径为:
uurrdddduuuulldrurdddrddllrruluuulldrurdddrdl 。
u表示向上,d表示向下,l表示向左,r表示向右.
大写表示人推着箱子一起动,小写表示人自己走.
代码用bfs实现。状态要分推着箱子一起走和人单独走,这两种状态转移是不同的.
由于代码中注释较详细,这里不过多解释.
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
# -*- coding: utf-8 -*-
# @time : 2017/8/10 上午9:42
# @author : qi mo
# @file : bfs.py
# @software: pycharm community edition
level_file_path
=
'../数据/level_file.txt'
class
gameshortest:
def
__init__(
self
,line, col
=
10
):
"""
给一个图,长度为100的字符串表示。
0空地 1墙 2箱子起始位置 3箱子终点位置 4人的起始位置
:param line: 地图,用字符串表示。如代码最后的每一行表示每一关的地图。
:param col: 地图的长宽,由于设定为10*10,默认为10
"""
self
.line
=
line
# sta和en 表示开始的状态,结束的状态
# sta只有2,4,0 2表示箱子开始位置,4表示人的位置,0表示其他。
# en只有1,3,0 1表示墙,3表示箱子结束位置,0表示其他。
# 现在只需要把sta状态中的2位置移动到en的3的位置即满足条件
self
.sta
=
''
self
.en
=
''
self
.col
=
col
# px, py表示4的位置
self
.px,
self
.py
=
-
1
,
-
1
# paths记录最短路径(可能有多条)
self
.paths
=
[]
# len记录最短路径长度 如
self
.
len
=
-
1
self
.pre()
self
.bfs()
print
(
self
.paths)
def
pre(
self
):
"""
1.获得sta开始状态和en结束状态
2.获得人的起始位置px,py
代码最后的第一关的地图可视化为
1111111111
1111111111
1110001111
1110221111
1114201111
1111100111
1111300111
1113300111
1111111111
1111111111
:return:
"""
mp
=
[]
for
pos
in
range
(
0
,
100
,
10
):
mp.append(
self
.line[pos:pos
+
10
])
# print(self.line)
# for x in mp:
# print(x)
for
pos, enum
in
enumerate
(
self
.line):
cx, cy
=
pos
/
/
10
, pos
%
10
if
enum
=
=
'4'
:
self
.px,
self
.py
=
cx, cy
# 现在只需要把sta开始的状态中的2位置移动到en的3的位置即满足条件
stadic
=
{
'0'
:
'0'
,
'1'
:
'0'
,
'2'
:
'2'
,
'3'
:
'0'
,
'4'
:
'4'
}
endic
=
{
'0'
:
'0'
,
'1'
:
'1'
,
'2'
:
'0'
,
'3'
:
'3'
,
'4'
:
'0'
}
for
x
in
self
.line:
self
.sta
+
=
stadic[x]
self
.en
+
=
endic[x]
# print(self.sta)
# print(self.en)
def
is_ok(
self
,sta):
"""
sta状态中的2位置移动到en的3的位置。
:param sta:
:return:
"""
for
s,e
in
zip
(sta,
self
.en):
if
e
=
=
'3'
and
s !
=
'2'
:
return
false
return
true
def
bfs(
self
):
"""
bfs获得最短路径保存到paths中
:return:
"""
# 4个方向,小写代表只是人移动,大写表示人推着箱子一起移动
dirs
=
[[
-
1
,
0
,
'u'
,
'u'
],[
1
,
0
,
'd'
,
'd'
],[
0
,
1
,
'r'
,
'r'
],[
0
,
-
1
,
'l'
,
'l'
]]
# 把开始的状态进入队列(list模拟),状态包括字符串表示的当前状态、当前的路径、当前人的位置
states
=
[[
self
.sta,'',
self
.px,
self
.py]]
# 访问数组(dict模拟),访问过的状态(字符串)不再访问
visi
=
{}
visi[
self
.sta]
=
1
s_len
=
1000
while
len
(states)>
0
:
sta, path, px, py
=
states[
0
]
# 4状态的位置
ppos
=
px
*
self
.col
+
py
states
=
states[
1
:]
if
len
(path)>s_len:
break
# 保存最短路径到paths中
if
self
.is_ok(sta):
if
self
.
len
=
=
-
1
or
len
(path)
=
=
self
.
len
:
self
.paths.append(path)
self
.
len
=
len
(path)
continue
for
dir
in
dirs:
cx, cy
=
px
+
dir
[
0
], py
+
dir
[
1
]
# 4挨着的状态的位置
pos
=
cx
*
self
.col
+
cy
nx, ny
=
px
+
2
*
dir
[
0
], py
+
2
*
dir
[
1
]
# 4挨着挨着的状态的位置
npos
=
nx
*
self
.col
+
ny
if
not
(nx>
=
0
and
nx<
self
.col
and
ny>
=
0
and
ny<
self
.col):
continue
# python中字符串不可更改,于是把字符串变成list更改状态后再转换为字符串
if
sta[pos]
=
=
'2'
and
sta[npos]
=
=
'0'
and
self
.en[npos] !
=
'1'
:
# 人和箱子一起推动,sta中连着的状态为4 2 0,en中第三个不能为1。推完之后sta变为0 4 2
digits
=
[
int
(x)
for
x
in
sta]
digits[ppos],digits[pos],digits[npos]
=
0
,
4
,
2
new_sta
=
''.join(
str
(x)
for
x
in
digits)
if
new_sta
not
in
visi:
visi[new_sta]
=
1
states.append([new_sta, path
+
dir
[
3
], cx, cy])
elif
sta[pos]
=
=
'0'
and
self
.en[pos] !
=
'1'
:
# 人动箱子不动,sta中连着的状态为4 0,en中第二个不能为1。
digits
=
[
int
(x)
for
x
in
sta]
digits[ppos], digits[pos]
=
0
,
4
new_sta
=
''.join(
str
(x)
for
x
in
digits)
if
new_sta
not
in
visi:
visi[new_sta]
=
1
states.append([new_sta, path
+
dir
[
2
], cx, cy])
if
__name__
=
=
'__main__'
:
f
=
open
(level_file_path, encoding
=
'utf-8'
)
cnt
=
0
while
(
1
):
line
=
f.readline()
line
=
line.strip(
'\n'
)
if
len
(line)
=
=
0
:
break
gs
=
gameshortest(line)
"""
level_file.txt中内容:
1111111111111111111111100011111110221111111420111111111001111111300111111330011111111111111111111111
1111111111104000000110000200111001101011100100101110010010111001011001110030000111111111111111111111
1111111111111111111111111111111110311111140020001110230020111111311111111111111111111111111111111111
1111111111111111111111100011111110221111111013311111102301111110040111111111111111111111111111111111
1111111111111111111111111111111100000111112111001113030020111400100011111111111111111111111111111111
1111111111111111111111111111111110011111100000011111001220111140300311111111111111111111111111111111
1111111111110040001110000000111001110011110011001111020130111100002011111311111111111111111111111111
1111111111111111111111111111111100111111100320001110131210111000000411111111111111111111111111111111
1111111111111111111111111111111100000111100111011110002020111000133411111111111111111111111111111111
1111111111111111111111100111111110004111111101011111312100111132001011113000201111111111111111111111
1111111111111111111111000001111131103111110402011111001201111100100111111111111111111111111111111111
1111111111111111111111100001111113112011110234001111001000111100001111111111111111111111111111111111
1111111111111111111111111001111110204111111020011111300101111130000111111111111111111111111111111111
1111111111111111111111143001111100000111110010211111001203111111101011111110001111111111111111111111
1111111111111111111111111111111100001111110202111111033420111111130011111111111111111111111111111111
1111111111111111111111110001111100230111114032301111110120111111000111111111111111111111111111111111
1111111111111111111111110031111102010111110020011111031401111100001111111111111111111111111111111111
1111111111111111111111111104111113110011110330201111021200111100001111111111111111111111111111111111
1111111111111111111111000111111100330111110011211111100100111112000411111001111111111111111111111111
1111111111111111111111100001111103032111110024001111111010111111100011111111111111111111111111111111
每一关的最短路径:
['uurrdddduuuulldrurdddrddllrruluuulldrurdddrdl']
['drrrrurdddddrdlll']
['rrdrurrrdlluldullldr']
['llurrdrullluuurrdduulldrurd']
['urrrrdrruululllldurrrrdrddllulllrrrdrrulll']
['uurrrrdulllddrrruuldrdl']
['drrdddrdllluldluuulurrrrurddd']
['uullllddrrudlllluururdrrddrruulll']
['lullldlluururrrrddrdlullldllurrrrllluurrrrdd']
['ddrddllulldlurrrdrruuluulldduurrddrddllllrrull']
['luurrrdrdlllrrrddluruuullllddrddluurrrdru']
['ddlluluruurrrdrddllulrdrrullddlluu']
['dddlluluurdrruuldrdlluldrdlurrrddlll']
['drrddrrddlluuuuruldrdldr', 'drrddrrddlluuuurdldruuul']
['drrullluulldrurdurdd']
['urrdddrruullulldrururrd']
['ulrddlluluurdrrruulldldrrdruu']
['dddlullllddruuddrrurullrrruuldrdll']
['llldluuuluurdrrrddrdlllululurrlddrddluuulur']
['ulldrurdrrddlluuluurrdlldrddrruulrddlluu']
"""
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/coraline_m/article/details/77075371 。
最后此篇关于python实现推箱子游戏的文章就讲到这里了,如果你想了解更多关于python实现推箱子游戏的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!