如何解决贪吃蛇游戏开发中的AttributeError: 'Snake' object has no attribute 'segments'错误?
解决贪吃蛇游戏中的AttributeError: 'Snake' object has no attribute 'segments'问题
我来帮你排查这个问题,其实错误的根源很明确,咱们一步步来修复:
错误原因分析
你遇到的AttributeError是因为在Snake类的__init__方法里,你把segments定义成了局部变量(直接写segments = []),而不是类的实例属性(应该用self.segments = [])。这就导致后续create_snake和move方法尝试访问self.segments时,这个属性根本不存在,自然就抛出了错误。
除此之外,代码里还有两个小问题需要一并修复:
__init__方法里初始化时就调用了self.move(),这会导致蛇在游戏循环启动前就提前移动一次,和后续的循环调用重复,可能造成移动逻辑混乱。- 常量
STARTING_POSITIOBS拼写错误,应该是STARTING_POSITIONS,虽然当前没触发错误,但后续扩展功能时可能出问题。
修复后的snake.py代码
import time STARTING_POSITIONS = [(0, 0), (-20, 0), (-40, 0)] # 修正拼写错误 MOVE_DISTANCE = 20 class Snake: def __init__(self): self.segments = [] # 定义为实例属性,而非局部变量 self.create_snake() # 移除这里的self.move()调用,交给main.py的游戏循环处理 def create_snake(self): for position in STARTING_POSITIONS: new_segment = Turtle("square") new_segment.color('white') new_segment.penup() new_segment.goto(position) self.segments.append(new_segment) def move(self): for seg_num in range(len(self.segments) - 1, 0, -1): new_x = self.segments[seg_num - 1].xcor() new_y = self.segments[seg_num - 1].ycor() self.segments[seg_num].goto(new_x, new_y) self.segments[0].forward(MOVE_DISTANCE)
修复点说明
- 将segments改为实例属性:把
__init__里的segments = []改成self.segments = [],这样整个类的方法都能通过self.segments访问这个列表,解决了属性不存在的错误。 - 移除初始化时的move调用:让main.py的游戏循环单独负责调用
snake.move(),保证移动逻辑的一致性。 - 修正常量拼写:把
STARTING_POSITIOBS改为STARTING_POSITIONS,避免后续可能的拼写错误问题。
现在运行你的main.py代码,应该就能正常启动贪吃蛇游戏了!
内容的提问来源于stack exchange,提问作者Jessica Lai
相关产品推荐
相关产品推荐

