为何出现AttributeError?Snake类代码运行报错求助
蛇游戏代码错误修复
错误原因
你遇到的AttributeError: 'Snake' object has no attribute 'body'是因为类的构造函数定义错误:Python中类的构造函数必须是__init__(前后各两个下划线),而你写的是_init_(前后各一个下划线),导致这个方法不会被自动调用,self.body等属性根本没被初始化。
另外还有一个小错误:绘制蛇头时你用了Snake.head(类属性),但应该用snake.head(实例属性),否则会报错找不到这个类属性。
修复后的完整代码
import pygame import sys import random pygame.init() SW, SH = 800, 800 block_size = 50 FONT = pygame.font.Font("Nasa21-l23X.ttf", block_size * 2) screen = pygame.display.set_mode((800, 800)) pygame.display.set_caption("Snake!") clock = pygame.time.Clock() class Snake: def __init__(self): # 修正为双下划线的__init__ self.x, self.y = block_size, block_size self.xdir = 1 self.ydir = 0 self.head = pygame.Rect(self.x, self.y, block_size, block_size) self.body = [pygame.Rect(self.x - block_size, self.y, block_size, block_size)] self.dead = False def drawGrid(): for x in range(0, SW, block_size): for y in range(0, SH, block_size): rect = pygame.Rect(x, y, block_size, block_size) pygame.draw.rect(screen, "#ffffff", rect, 1) # 将蛇实例化移到循环外,避免每次循环重建蛇 snake = Snake() while True: screen.fill("black") # 填充背景,避免画面残留 drawGrid() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() pygame.draw.rect(screen, "green", snake.head) # 修正为实例属性snake.head for square in snake.body: pygame.draw.rect(screen, "green", square) pygame.display.update() clock.tick(10)
额外说明
- 添加了
screen.fill("black")在循环开头,否则每次绘制的蛇会叠加在之前的画面上,导致视觉混乱。 - 将
snake = Snake()移到了循环外,否则每次循环都会创建新的蛇实例,后续无法实现移动逻辑。
内容的提问来源于stack exchange,提问作者TheGoldenBlock
相关产品推荐
相关产品推荐

