修复扫雷游戏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)
三、关键修复点说明
- 优先标记已展开:必须在处理格子的最开始就设置
revealed = True,否则递归调用时会重复进入同一格子,触发终止条件导致递归中断。 - 正确的终止条件:只有超出边界、已展开、是地雷这三种情况才停止递归,不要额外添加多余的返回逻辑。
- 完整遍历8方向:遍历周围所有相邻格子时,要跳过自身,同时确保边界判断正确,避免索引越界。
四、调试方法
- 打印递归路径:在show()函数开头添加打印语句,跟踪递归调用的格子坐标和状态:
运行后查看控制台输出,就能清楚看到递归是否进入了深层格子。def show(row, col): print(f"处理格子 ({row}, {col}) - 已展开: {grid[row][col].revealed}, 是地雷: {grid[row][col].mine}") # 后续代码... - 断点调试:用PyCharm、VSCode等IDE的断点功能,在show()函数内设置断点,逐步执行每一步,观察
revealed状态、地雷计数、递归调用的触发情况,定位哪一步导致递归终止。
内容的提问来源于stack exchange,提问作者Koder
相关产品推荐
相关产品推荐

