You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复扫雷游戏show()函数递归深度不足问题求助

扫雷递归展开问题修复方案

一、核心问题排查方向

递归仅执行1层,大概率是以下几个原因:

  • 未标记格子已展开,导致递归时重复触发终止条件
  • 递归终止条件逻辑错误,提前返回
  • 空白格子未触发周围8方向的递归调用
  • 边界遍历范围错误,遗漏部分方向

二、修复后的show()函数示例

假设你的棋盘格子对象包含revealed(是否已展开)、mine(是否是地雷)属性,修复后的递归函数如下:

def show(row, col):
    # 1. 边界判断:超出棋盘直接返回
    if row < 0 or row >= rows or col < 0 or col >= cols:
        return
    # 2. 终止条件:已展开或是地雷,停止递归
    current_cell = grid[row][col]
    if current_cell.revealed or current_cell.mine:
        return
    
    # 3. 标记当前格子为已展开(必须优先执行,避免重复递归)
    current_cell.revealed = True
    
    # 4. 计算周围地雷数量
    def count_adjacent_mines(r, c):
        count = 0
        for dr in (-1, 0, 1):
            for dc in (-1, 0, 1):
                if dr == 0 and dc == 0:
                    continue
                nr, nc = r + dr, c + dc
                if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc].mine:
                    count += 1
        return count
    
    mine_count = count_adjacent_mines(row, col)
    
    # 5. 空白格子(周围无雷),递归遍历所有相邻格子
    if mine_count == 0:
        for dr in (-1, 0, 1):
            for dc in (-1, 0, 1):
                if dr == 0 and dc == 0:
                    continue
                show(row + dr, col + dc)

三、关键修复点说明

  1. 优先标记已展开:必须在处理格子的最开始就设置revealed = True,否则递归调用时会重复进入同一格子,触发终止条件导致递归中断。
  2. 正确的终止条件:只有超出边界、已展开、是地雷这三种情况才停止递归,不要额外添加多余的返回逻辑。
  3. 完整遍历8方向:遍历周围所有相邻格子时,要跳过自身,同时确保边界判断正确,避免索引越界。

四、调试方法

  1. 打印递归路径:在show()函数开头添加打印语句,跟踪递归调用的格子坐标和状态:
    def show(row, col):
        print(f"处理格子 ({row}, {col}) - 已展开: {grid[row][col].revealed}, 是地雷: {grid[row][col].mine}")
        # 后续代码...
    
    运行后查看控制台输出,就能清楚看到递归是否进入了深层格子。
  2. 断点调试:用PyCharm、VSCode等IDE的断点功能,在show()函数内设置断点,逐步执行每一步,观察revealed状态、地雷计数、递归调用的触发情况,定位哪一步导致递归终止。

内容的提问来源于stack exchange,提问作者Koder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:15:40