Python开发终端版扫雷:周边炸弹计数错误、生成数量不符问题排查
问题排查与修正
炸弹数量不足的成因
- 随机位置生成参数错误:
random.randrange(0, dim_size-1)的stop参数不包含边界,dim_size=5时仅能生成0~3的索引,遗漏最后一行/列的位置。正确参数应为random.randrange(0, dim_size),覆盖全部0~dim_size-1的索引范围。 - 无去重逻辑:若随机到已存在炸弹的位置,直接覆盖原有标记,导致实际炸弹数小于预设值。需在放置炸弹前判断位置是否已被占用,重复则重新生成随机位置。
相邻计数错误的成因(含右上格子)
所有相邻方向的边界判断逻辑均存在问题:
- 右上格子(行-1、列+1)的判断条件写反:原代码为
random_column > dim_size,该条件永远不成立(列索引最大为dim_size-1),导致右上计数从未执行。 - 其余方向的边界判断未考虑偏移后不越界的要求:
- 右(列+1):原条件
random_column < dim_size,易导致索引越界,需改为random_column < dim_size -1 - 右下(行+1、列+1):原条件
random_row < dim_size and random_column < dim_size,需改为random_row < dim_size -1 and random_column < dim_size -1 - 下(行+1):原条件
random_row < dim_size,需改为random_row < dim_size -1
- 右(列+1):原条件
- 计数逻辑顺序错误:原代码每放置一个炸弹就为周围格子加1,若后续在这些格子上放置炸弹,会覆盖之前的计数,导致统计错误。正确逻辑为:先全部生成炸弹位置并标记,再统一遍历所有非炸弹格子,统计周围的炸弹数量。
修正后代码
import random def minesweeper(dim_size, num_bombs): # 初始化棋盘 board = [[0 for _ in range(dim_size)] for _ in range(dim_size)] bomb_pos = set() # 生成不重复的炸弹位置 while len(bomb_pos) < num_bombs: row = random.randrange(0, dim_size) col = random.randrange(0, dim_size) bomb_pos.add((row, col)) # 标记炸弹位置 for r, c in bomb_pos: board[r][c] = 'X' # 统一统计相邻炸弹数 for row in range(dim_size): for col in range(dim_size): if board[row][col] == 'X': continue count = 0 # 遍历8个相邻方向 for dr in (-1, 0, 1): for dc in (-1, 0, 1): if dr == 0 and dc == 0: continue nr, nc = row + dr, col + dc # 仅统计棋盘范围内的炸弹 if 0 <= nr < dim_size and 0 <= nc < dim_size and board[nr][nc] == 'X': count += 1 board[row][col] = count # 打印棋盘 for row in range(dim_size): print('\t'.join(map(str, board[row]))) if __name__ == '__main__': minesweeper(5,5)
内容的提问来源于stack exchange,提问作者user15427949
相关产品推荐
相关产品推荐

