Python Minesweeper递归算法超出递归限制

时间:2018-10-07 22:37:01

标签: python python-3.x recursion minesweeper

我正在尝试使用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()

代码检查数组中是否有隐藏的相邻图块显示为零。 (隐藏的图块用'?'表示)。如果存在任何满足这些参数的零,则将显示所有与该零相邻的图块。然后重新启动该功能。一旦在整个数组中没有满足参数的零,函数循环将中断,代码将继续流动。这超出了递归限制。有什么建议么?

1 个答案:

答案 0 :(得分:0)

您对'?' test 不能防止在板子外面建立索引。在低索引边缘,这会产生环绕的负索引。但是,清除 '?'的代码确实会检查其索引,因此是否有跨边缘0-?对持续存在并产生无限递归。

在木板的高索引边缘处,读取会因IndexError而失败(假设没有填充“重影单元”),但是该算法当然会因其搜索顺序而偏向较小的索引,所以它通常不会走那么远。