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

如何阻止Pygame游戏中的食物元素四处跳动?

问题根源

第二个食物持续跳动的原因有两点:

  1. addfood变量在生成完2个食物后未被重置为False,导致每帧都会重复调用AddFood()函数;
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:51