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

Pygame贪吃蛇游戏敌人显示异常问题求助

Pygame贪吃蛇Enemy类显示问题修复

核心问题与修复点

  • 敌人生成事件触发逻辑错误:原代码把SPAWNENEMY事件判断放在KEYDOWN分支内部,导致只有按下按键时才会生成敌人,移出分支后即可实现每隔1秒自动生成敌人。
  • 敌人绘制时机错误:create_enemy方法中直接调用display.blit绘制敌人,但随后的fill_screen会清空屏幕,导致绘制的敌人被覆盖,改为在统一的绘制阶段批量绘制所有敌人。
  • 无效临时实例调用:循环中每次创建新的Enemys()实例调用draw,改为用类方法统一管理敌人逻辑,避免冗余。
  • move_enemy方法逻辑缺失:原方法引用未定义的self.enemy_position,改为遍历enemy_list中的每个Rect,实现敌人追踪蛇的移动逻辑。
  • 重复创建对象浪费资源:循环中每次新建snake、food实例,改为提前创建一次复用。

修正后的完整代码

import pygame,sys,random
from pygame.locals import *

pygame.init()
clock=pygame.time.Clock()

movement="nil"

enemy_list = []
enemy_img = pygame.image.load(r'C:\Users\hudso\Documents\PyGame\__pycache__\Images\mele_enemy.png')
SPAWNENEMY = pygame.USEREVENT
pygame.time.set_timer(SPAWNENEMY,1000)

cooled=False

food_created=False
food_counter=0

cooldown_tracker=0

window_size=[1000,1000]

screen=pygame.display.set_mode((window_size[0],window_size[1]),RESIZABLE)
display=pygame.Surface((400,400))

snake_health=100
snake_pos=[188,188]

snake_img=pygame.image.load(r"C:\Users\hudso\Documents\PyGame\__pycache__\Images\snake.png")
food_img=pygame.image.load(r"C:\Users\hudso\Documents\PyGame\__pycache__\Images\apple.png")

def new_food_pos():
    food_x=random.randint(25,350)
    food_y=random.randint(25,350)
    food_coords=[food_x,food_y]
    return food_coords

class Snake():
    def __init__(self,snake_position,snake_hitpoints):
        self.snake_position=snake_position
        self.snake_hp=snake_hitpoints

      
    def create_snake(self):
        display.blit(snake_img,(self.snake_position[0],self.snake_position[1]))
        pygame.draw.rect(display,(0,0,0),[self.snake_position[0]-3,self.snake_position[1]-7,31,5])
        pygame.draw.rect(display,(212,23,48),[self.snake_position[0]-1,self.snake_position[1]-6,27,3])
        sub_hp=self.snake_hp-100
        take_health=abs(sub_hp)
        gray_health=(take_health*0.27)
        pygame.draw.rect(display,(40,40,40),[self.snake_position[0]+self.snake_hp*.27,self.snake_position[1]-6,gray_health,3])
    
    def move_snake(self,moving):
        if moving=="up":
            self.snake_position[1]-=1
        if moving=="down":
            self.snake_position[1]+=1
        if moving=="right":
            self.snake_position[0]+=1
        if moving=="left":
            self.snake_position[0]-=1

class Food():
    def __init__(self):
        self.food_location=new_food_pos()
        
    def create_food(self):
        display.blit(food_img,(self.food_location[0],self.food_location[1]))
    
    def reset_pos(self):
        self.food_location=new_food_pos()

class Enemys:
    @classmethod
    def create_enemy(cls):
        size = random.randint(50,50)
        enemy_rect = pygame.Rect(random.randint(20, 380), random.randint(20, 380), size, size)
        enemy_list.append(enemy_rect)
    
    @classmethod
    def draw_enemies(cls):
        for e in enemy_list:
            display.blit(enemy_img, e)
    
    @classmethod
    def move_enemies(cls):
        for e in enemy_list:
            # 追踪蛇的位置移动
            if e.centerx != snake_pos[0]:
                if e.centerx > snake_pos[0]:
                    e.x -= 0.5
                else:
                    e.x += 0.5
            if abs(e.centerx - snake_pos[0]) < 16:
                if e.centery != snake_pos[1]:
                    if e.centery > snake_pos[1]:
                        e.y -= 0.5
                    else:
                        e.y += 0.5
        
def fill_screen():
    display.fill((0,0,0))
    pygame.draw.rect(display,(29,10,200),[2,2,396,396])
    pygame.draw.rect(display,(43,7,230),[3,3,394,394])

# 提前创建实例,避免循环中重复创建
player_snake = Snake(snake_pos, snake_health)
player_food = Food()

while True:    
    fill_screen()
    
    player_food.create_food()
    food_rect=pygame.Rect((player_food.food_location[0],player_food.food_location[1]),(25,25))
    
    player_snake.create_snake()
    
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type==pygame.KEYDOWN:
            if event.key==K_RIGHT:
                movement="right"
            if event.key==K_LEFT:
                movement="left"
            if event.key==K_UP:
                movement="up"
            if event.key==K_DOWN:
                movement="down"
        # 独立处理敌人生成事件
        if event.type == SPAWNENEMY:
            Enemys.create_enemy()
    
    player_snake.move_snake(movement)
    
    snake_rect=pygame.Rect((player_snake.snake_position[0],player_snake.snake_position[1]),(25,25))
    
    food_eaten=snake_rect.colliderect(food_rect)
    
    if player_snake.snake_hp<=0:
        pygame.quit()
        sys.exit()
    
    if food_eaten:
        player_food.reset_pos()
        food_counter+=1
        player_snake.snake_hp+=5
    
    if player_snake.snake_hp>=100:
        player_snake.snake_hp=100
    
    # 统一绘制和移动敌人
    Enemys.draw_enemies()
    Enemys.move_enemies()
    
    surf=pygame.transform.scale(display,window_size)
    screen.blit(surf,(0,0))
    
    pygame.display.update()
    clock.tick(60)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:27:27