我正在尝试使用Python数组制作Minesweeper,并成功生成了木板和炸弹。但是,我对Minesweeper的“零递归”存在困难。如果您在Minesweeper中选择0,它将显示所有相邻的图块,如果任何相邻的图块为0,则将显示所有与该0相邻的图块,依此类推。最终,显示的图块的边缘上不会有0,因为所有与显示的0相邻的图块都将被显示。我的递归算法超出了python的最大递归深度。这是代码:
def zero():
for y in range(height):
for x in range(width-1):
if hidden[y][x] == 0 and (hidden[y+1][x] == '?' or hidden[y-1][x] == '?' or hidden[y+1][x+1] == '?' or hidden[y-1][x-1] == '?' or hidden[y+1][x-1] == '?' or hidden[y-1][x+1] == '?' or hidden[y][x+1] == '?' or hidden[y][x-1] == '?'):
if y+1 < height:
hidden[y+1][x] = board[y+1][x]
if y-1 >= 0:
hidden[y-1][x] = board[y-1][x]
if y+1 < height and x+1 < width:
hidden[y+1][x+1] = board[y+1][x+1]
if y-1 >= 0 and x+1 < width:
hidden[y-1][x+1] = board[y-1][x+1]
if y-1 >= 0 and x-1 >= 0:
hidden[y-1][x-1] = board[y-1][x-1]
if x+1 < width:
hidden[y][x+1] = board[y][x+1]
if x-1 >= 0:
hidden[y][x-1] = board[y][x-1]
if y+1 < height and x-1 >= 0:
hidden[y+1][x-1] = board[y+1][x-1]
zero()
代码检查数组中是否有隐藏的相邻图块显示为零。 (隐藏的图块用'?'表示)。如果存在任何满足这些参数的零,则将显示所有与该零相邻的图块。然后重新启动该功能。一旦在整个数组中没有满足参数的零,函数循环将中断,代码将继续流动。这超出了递归限制。有什么建议么?
答案 0 :(得分:0)
您对'?'
的 test 不能防止在板子外面建立索引。在低索引边缘,这会产生环绕的负索引。但是,清除 '?'
的代码确实会检查其索引,因此是否有跨边缘0-?对持续存在并产生无限递归。
在木板的高索引边缘处,读取会因IndexError
而失败(假设没有填充“重影单元”),但是该算法当然会因其搜索顺序而偏向较小的索引,所以它通常不会走那么远。