Python 基于另一个列表修改列表的问题?
您好,我是python新手,目前正在尝试构建一个扫雷游戏。我列出了两个列表,一个显示在玩家区,一个包含地雷区。我要求玩家选择坐标,然后程序检查周围是否有地雷,洪水会使用以下代码填充地雷周围的地图:Python 基于另一个列表修改列表的问题?,python,list,flood-fill,minesweeper,Python,List,Flood Fill,Minesweeper,您好,我是python新手,目前正在尝试构建一个扫雷游戏。我列出了两个列表,一个显示在玩家区,一个包含地雷区。我要求玩家选择坐标,然后程序检查周围是否有地雷,洪水会使用以下代码填充地雷周围的地图: def floodfill(field, minefield, x, y) list1 = [(x, y)] while True: a, b = list1.pop() field[b][a] = 'W' list2 = [(a, b
def floodfill(field, minefield, x, y)
list1 = [(x, y)]
while True:
a, b = list1.pop()
field[b][a] = 'W'
list2 = [(a, b - 1), (a, b + 1), (a - 1, b), (a + 1, b)]
for element in list2:
x2 = element[0]
y2 = element[1]
if y2 >= len(field) or x2 >= len(field[0]) or y2 < 0 or x2 < 0:
continue
if minefield[y2][x2] == 'O':
list1.append(element)
if not list1:
break
return field
但有了这些:
minefield = [['O', 'x'], ['x', 'x']] # field is the same without xs
x = 0
y = 0
它返回以下内容:
field = [['W', 'O'], ['O', 'O']] # Os are covered mines
问题似乎出现了
if minefield[y2][x2] == 'O':
因为在循环中不修改雷场数组,所以它将始终有一个“O”,并且在每个for循环中,一个坐标将附加到列表1。
您可以检查雷区和雷区在y2和x2处的值,如果两者都是“O”,则将其附加到列表1:
if minefield[y2][x2] == 'O' and field[y2][x2] == 'O':
运行经过上述修改的代码和此数据后:
field = [['O', 'O'], ['O', 'O']]
minefield = [['O', 'O'], ['x', 'x']]
x = 0
y = 0
print floodfill(field, minefield, x, y)
它返回:
[['W', 'W'], ['O', 'O']]
而且,仅仅这样做是非常危险的
while True:
...
因为,正如所观察到的,程序可以进入无限循环。应该有某种类型的迭代限制器,当然大到算法可以进行正确的计算,小到如果代码中有错误,一段时间后它就会出现。因此,在这种情况下,如果整个雷场中没有地雷,则应将限制设置为至少与整个雷场大小相同的值。另外,如果超过了迭代限制,可能会打印一个适当的警告-调试和信息用途
def floodfill(field, minefield, x, y):
list1 = [(x, y)]
max_iters = 100 # it should be at least as big as the size of whole minefield
# or more dynamic/generic approach based on actual minefield size:
# max_iters = len(minefield) * len(minefield[0])
while True and max_iters > 0:
max_iters -=1
a, b = list1.pop()
field[b][a] = 'W'
list2 = [(a, b - 1), (a, b + 1), (a - 1, b), (a + 1, b)]
for element in list2:
x2 = element[0]
y2 = element[1]
if y2 >= len(field) or x2 >= len(field[0]) or y2 < 0 or x2 < 0:
continue
if minefield[y2][x2] == 'O' and field[y2][x2] == 'O':
list1.append(element)
if not list1:
break
if max_iters <= 0:
print "Iterations limit exceeded"
return field
堵车到底意味着什么?你能提供一个复制这种行为的例子吗。给自己的变量列表命名是个坏主意;它会隐藏内置的。尝试添加示例并更改列表的名称。希望现在更清楚
def floodfill(field, minefield, x, y):
list1 = [(x, y)]
max_iters = 100 # it should be at least as big as the size of whole minefield
# or more dynamic/generic approach based on actual minefield size:
# max_iters = len(minefield) * len(minefield[0])
while True and max_iters > 0:
max_iters -=1
a, b = list1.pop()
field[b][a] = 'W'
list2 = [(a, b - 1), (a, b + 1), (a - 1, b), (a + 1, b)]
for element in list2:
x2 = element[0]
y2 = element[1]
if y2 >= len(field) or x2 >= len(field[0]) or y2 < 0 or x2 < 0:
continue
if minefield[y2][x2] == 'O' and field[y2][x2] == 'O':
list1.append(element)
if not list1:
break
if max_iters <= 0:
print "Iterations limit exceeded"
return field