【问题标题】:Python Minesweeper Recursion Algorithm Exceeding Recursion LimitPython扫雷递归算法超出递归限制
【发布时间】:2019-03-12 14:35:34
【问题描述】:

我正在尝试使用 Python 数组制作扫雷,并成功生成了棋盘和炸弹。但是,我对扫雷的“零递归”有困难。如果您在扫雷中选择 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()

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

【问题讨论】:

  • 不是最好的方法,但应该可以工作:在 for 循环之前设置一个变量 modified = False。如果您真的修改(显示)一个字段,请将其设置为 true。如果设置了modified,则在for循环之后调用zero()。这当然可以在一个简单的循环中完成,而不是递归方法。
  • 你没有返回语句,所以每次你点击zero(),它都会无限递归。您需要为zero() 上方的return 语句找到合适的位置。
  • 老实说,递归是解决某些问题的好方法,但我想我会考虑在这种情况下不使用它。也许让 zero() 返回显示的整数平方数,并将其包装在一个持续运行 zero() 直到返回为 0 的 while 语句中。
  • @UtahJarhead:递归调用受到if 的保护:hidden 可能会删除其所有 0/? 对以终止递归,这在本质上并非不可信。跨度>

标签: python python-3.x recursion minesweeper


【解决方案1】:

您对'?'测试 不受板外索引保护。在低指数边缘,这会产生环绕的负指数。但是,清除 '?'s 的代码会检查它的索引,所以任何交叉边缘 0-?对持续存在和无限递归结果。

在电路板的高索引边缘,读取将失败并显示IndexError(假设没有使用“幽灵单元”填充),但当然该算法因其搜索顺序而偏向较小的索引,因此它通常不会走那么远。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多