如何阻止Pygame游戏中的食物元素四处跳动?
问题根源
第二个食物持续跳动的原因有两点:
addfood变量在生成完2个食物后未被重置为False,导致每帧都会重复调用AddFood()函数;AddFood()的逻辑存在漏洞——只要Food1已生成,就会直接重置Food2Pos的坐标,哪怕Food2已经存在,每次调用都会给它分配新的随机位置。
第一个食物能保持静止,是因为Food1被设为True后,后续调用AddFood()不会再进入if not Food1分支,它的位置不会被重复修改。
修复方案
步骤1:修正AddFood()函数逻辑
仅在Food2未生成时才设置它的位置,同时在食物数量达到2时关闭生成开关:
def AddFood(): global Food1, Food2, TotalFood, addfood if not Food1: Food1Pos[0] = random.randint(0,1230) Food1Pos[1] = random.randint(0,750) Food1 = True elif not Food2: # 改为elif,仅当Food2不存在时执行 Food2Pos[0] = random.randint(0,1230) Food2Pos[1] = random.randint(0,750) Food2 = True TotalFood += 1 # 食物数量达标后,关闭生成触发 if TotalFood >= 2: addfood = False
步骤2:确保全局变量正确引用
在AddFood()函数的global声明中加入addfood,保证能在函数内修改这个全局开关变量。
修复后的完整代码
import pygame import time import random pygame.init() White = (255, 255, 255) WindowWidth = 1280 WindowHeight = 800 CharacterSize = 30 characterYpos = 400 characterXpos = 640 keysdown = 0 TotalFood = 0 Food1Pos = [0,0] Food2Pos = [0,0] Food1 = False Food2 = False GoingUp = False GoingLeft = False GoingDown = False GoingRight = False running = True addfood = False keys = pygame.key.get_pressed() screen = pygame.display.set_mode((WindowWidth, WindowHeight)) pygame.display.set_caption("Name") screen.fill(White) Food1 = False Food2 = False def AddFood(): global Food1, Food2, TotalFood, addfood if not Food1: Food1Pos[0] = random.randint(0,1230) Food1Pos[1] = random.randint(0,750) Food1 = True elif not Food2: Food2Pos[0] = random.randint(0,1230) Food2Pos[1] = random.randint(0,750) Food2 = True TotalFood += 1 if TotalFood >= 2: addfood = False while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() if keys[pygame.K_w] and characterYpos > 0: keysdown += 1 GoingUp = True if keys[pygame.K_a] and characterXpos > 0: keysdown += 1 GoingLeft = True if keys[pygame.K_s] and characterYpos < WindowHeight-CharacterSize: keysdown += 1 GoingDown = True if keys[pygame.K_d] and characterXpos < WindowWidth-CharacterSize: keysdown += 1 GoingRight = True if GoingUp: characterYpos -= 12/keysdown GoingUp = False if GoingLeft: characterXpos -= 12/keysdown GoingLeft = False if GoingDown: characterYpos += 12/keysdown GoingDown = False if GoingRight: characterXpos += 12/keysdown GoingRight = False if TotalFood < 2: addfood = True if addfood: AddFood() screen.fill(White) pygame.draw.rect(screen, (41, 216, 93), (characterXpos, characterYpos, CharacterSize, CharacterSize)) if Food1: pygame.draw.rect(screen,(227,243,0),(Food1Pos[0],Food1Pos[1],50,50)) if Food2: pygame.draw.rect(screen,(227,243,0),(Food2Pos[0],Food2Pos[1],50,50)) pygame.display.flip() keysdown = 0 time.sleep(1/90) print(TotalFood) pygame.quit()
额外优化提示
- 可以移除函数外冗余的
global声明(比如开头的global TotalFood,全局变量在函数外不需要该关键字); - 当前角色移动的
keysdown逻辑存在多键按下时速度变慢的问题,可根据需求调整移动速度的计算方式。
内容的提问来源于stack exchange,提问作者Edvard Berger
相关产品推荐
相关产品推荐

