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
相关产品推荐
相关产品推荐

