You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何出现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)

额外说明

  1. 添加了screen.fill("black")在循环开头,否则每次绘制的蛇会叠加在之前的画面上,导致视觉混乱。
  2. 将snake = Snake()移到了循环外,否则每次循环都会创建新的蛇实例,后续无法实现移动逻辑。

内容的提问来源于stack exchange,提问作者TheGoldenBlock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:13:25