Python扫雷游戏中相邻地雷计数递增功能实现问题求助
Python扫雷游戏中相邻地雷计数递增功能实现问题求助
嗨,我帮你看看这个问题!你的代码里确实有几个关键逻辑问题,导致相邻地雷的计数没有正确更新到new_grid里,咱们一步步梳理并修正:
问题分析
- 嵌套函数与递归逻辑混乱:你在
border_check里嵌套定义了increment函数还进行递归调用,这不仅让执行流程变得混乱,而且根本没有正确触发计数的更新逻辑。 - 边界检查范围错误:代码里用
range(len(value))来判断行的合法性,但value是单个格子的内容(比如"-"或"#"),len(value)永远是1,这完全错误,应该用整个网格的行长度len(grid)和每行的列长度len(row)来做边界判断。 - 计数逻辑颠倒:当前代码的逻辑是“如果周围格子是地雷,就给当前格子加1”,但扫雷的正确逻辑应该是“当当前格子是地雷时,给周围所有非地雷的格子各加1”,这才是相邻地雷计数的正确方式。
- 初始化的小问题:
new_grid的列表推导式写法不够清晰,而且容易出错,建议先初始化全0网格,再填充地雷位置。
修正后的代码
positions = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]] mine = "#" grid = [ ["-", "-", "-", "#", "#"], ["-", "#", "-", "-", "-"], ["-", "-", "#", "-", "-"], ["-", "#", "#", "-", "-"], ["-", "-", "-", "-", "-"], ] def minesweeper(grid): # 初始化new_grid为全0的二维数组,行数和列数和原网格一致 rows = len(grid) cols = len(grid[0]) if rows > 0 else 0 new_grid = [[0 for _ in range(cols)] for _ in range(rows)] # 先把地雷位置填充到new_grid里 for row_i in range(rows): for col_i in range(cols): if grid[row_i][col_i] == mine: new_grid[row_i][col_i] = mine # 遍历每个格子,处理地雷周围的计数 for row_i in range(rows): for col_i in range(cols): # 如果当前格子是地雷,就给周围8个方向的格子加1 if grid[row_i][col_i] == mine: for dr, dc in positions: # 计算周围格子的坐标 neighbor_row = row_i + dr neighbor_col = col_i + dc # 检查坐标是否在合法范围内,且不是地雷 if 0 <= neighbor_row < rows and 0 <= neighbor_col < cols: if new_grid[neighbor_row][neighbor_col] != mine: new_grid[neighbor_row][neighbor_col] += 1 # 输出结果 def minesweeper_output(): for row in new_grid: # 把每个元素转成字符串,用空格分隔输出 print(" ".join(str(item) for item in row)) minesweeper_output() minesweeper(grid)
运行结果
执行上面的代码后,会输出你需要的正确结果:
1 1 2 # # 1 # 3 3 2 2 4 # 2 0 1 # # 2 0 1 2 2 1 0
备注:内容来源于stack exchange,提问作者mworthington1
相关产品推荐
相关产品推荐

