开发扫雷游戏时Tile类已定义bomb属性却触发AttributeError求助
AttributeError: 'Tile' object has no attribute 'bomb' 扫雷游戏代码修复
你的核心问题是Tile类的构造函数名写错了——你写的是_init__,少了一个开头的下划线,正确的Python构造函数应该是__init__(前后各两个下划线)。这个错误导致Tile实例被创建时,初始化方法根本没被执行,所以你的Tile对象并没有bomb、revealed、value这些实例属性,访问时自然触发AttributeError。
除了构造函数的问题,你的代码还有几个其他bug需要修正,否则运行后还会出现索引越界、逻辑错误等问题:
- Minesweeper的
board是类属性,会被所有实例共享,应该改为实例属性 - 随机生成炸弹坐标时,
random.randint(0,10)会超出10x10棋盘的索引范围(棋盘索引是0-9) - 遍历炸弹周围格子时,循环范围错误且未做边界检查,会导致索引越界
- 内层循环变量名用
bomb容易混淆,建议改为col
修正后的完整代码
import random class Tile: bomb: bool value: int revealed: bool def __init__(self): # 修复构造函数名 self.bomb = False self.revealed = False self.value = 0 class Minesweeper: def __init__(self): self.board = [] # 改为实例属性 self.create_board() def add_bombs_and_values(self) -> None: # 生成10个不重复的炸弹位置 for _ in range(10): # 修正坐标范围为0-9 x, y = random.randint(0, 9), random.randint(0, 9) while self.board[x][y].bomb: x, y = random.randint(0, 9), random.randint(0, 9) self.board[x][y].bomb = True # 遍历炸弹周围3x3区域,修正循环范围并做边界检查 for row in range(max(0, x-1), min(10, x+2)): for col in range(max(0, y-1), min(10, y+2)): # 跳过炸弹本身 if row == x and col == y: continue self.board[row][col].value += 1 def create_board(self) -> None: for i in range(10): self.board.append([]) for j in range(10): self.board[i].append(Tile()) self.add_bombs_and_values() game1 = Minesweeper()
关键修复点说明
- 构造函数修复:把
_init__改为__init__,确保Tile实例创建时自动初始化bomb等属性。 - 实例属性修正:将
board从类属性移到__init__中作为实例属性,避免多个Minesweeper实例共享同一个棋盘。 - 坐标范围修正:
random.randint(0,9)保证生成的坐标在棋盘索引范围内(0到9)。 - 边界检查:使用
max(0, x-1)和min(10, x+2)确保遍历周围格子时不会超出棋盘边界,避免索引越界错误。 - 循环变量名优化:将内层循环变量
bomb改为col,提升代码可读性,避免语义混淆。
内容的提问来源于stack exchange,提问作者SomberOzzy2012
相关产品推荐
相关产品推荐

