Python开发Pygame贪吃蛇报错'str' object is not callable求助
问题原因
你在snake类中定义了名为direction()的实例方法,同时在该方法内部给self.direction赋值为字符串类型的方向值。Python中实例属性的优先级高于实例方法,第一次调用direction()方法后,self.direction就从方法对象被覆盖为字符串,第二次再调用body[i].direction()时,相当于尝试对字符串加括号执行,自然触发TypeError: 'str' object is not callable报错。
解决方案
1. 修复snake类的命名冲突
将存储方向的实例属性改名,避免和方法名重名即可解决当前报错,修改后的snake类代码如下:
class snake(object): def __init__(self,x,y,h_dir,b_dir): self.X=x self.Y=y self.h_dir=h_dir self.b_dir=b_dir self.current_direction = h_dir # 新增独立属性存储当前方向 def direction(self): global head_direction self.current_direction=head_direction if(self.X==turn_X and self.Y==turn_Y): self.current_direction=head_direction return self.current_direction
2. 修复其他关联报错
- 分数拼接类型错误:代码中直接用
'SCORE '+score拼接字符串和整数会触发类型错误,需要将score转为字符串,修改两处代码:displayScore方法内改为score_surface=score_font.render('SCORE '+str(score), True, white)gameOver方法内改为score_surface=score_font.render('YOUR FINAL SCORE IS '+str(score), True, white)
- 代码结构优化:不要把类定义、pygame初始化、常量定义放在最外层的
while running循环内部,否则每次游戏重开都会重复执行初始化逻辑,浪费性能还可能引发未知问题。
3. 可选逻辑优化
当前蛇身移动逻辑存在逻辑问题:所有蛇身都会和蛇头同步转向,不符合贪吃蛇蛇身跟随的预期效果。建议改为每帧记录所有节点的上一帧位置,后一个节点直接移动到前一个节点的上一位置,逻辑更简单也更符合游戏规则。
内容的提问来源于stack exchange,提问作者Léo Lepage
相关产品推荐
相关产品推荐

