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

您好,我是python新手,目前正在尝试构建一个扫雷游戏。我列出了两个列表,一个显示在玩家区,一个包含地雷区。我要求玩家选择坐标,然后程序检查周围是否有地雷,洪水会使用以下代码填充地雷周围的地图:

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