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

Pygame游戏重启问题求助:TNT下落速度未重置及按键响应异常

MacPhee Minecraft游戏问题修复

问题总结

  • Game Over界面的「Press a Key to Play」提示偶尔无法响应按键
  • 重启游戏后,TNT下落速度未重置为初始慢速,反而持续加快

修复方案

1. 按键无响应问题修复

原代码中showTextScreen和checkForKeyPress函数重复设置了INC_SPEED定时器,且checkForKeyPress对KEYDOWN事件处理错误,导致按键事件被忽略。

修改点:

  • 删除showTextScreen函数内的INC_SPEED定时器设置
  • 删除checkForKeyPress函数内的INC_SPEED定时器设置,检测到KEYDOWN时直接返回按键值,不再跳过

2. 速度不重置问题修复

全局变量SPEED在游戏过程中持续累加,重启时未重置;同时TNT的位置也没有回到初始状态。

修改点:

  • 在碰撞触发Game Over后,重置SPEED为初始值5
  • 给Enemy类添加reset_pos方法,用于重置TNT到屏幕顶部随机坐标
  • 把背景图加载代码移到游戏循环外,避免重复加载浪费性能
  • 同时重置玩家的位置到初始点

修改后的完整代码

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

# 初始化
pygame.init()

# 设置帧率
FPS = 60
FramePerSec = pygame.time.Clock()

# 颜色定义
BLUE        = (0, 0, 255)
RED         = (255, 0, 0)
GREEN       = (0, 255, 0)
DARKGREEN   = (21,  89, 30)
BLACK       = (0, 0, 0)
WHITE       = (255, 255, 255)
ORANGE      = (255, 204, 51)
GRAY        = (185, 185, 185)

BORDERCOLOR = BLUE
BGCOLOR = DARKGREEN
BASICFONT = pygame.font.Font('freesansbold.ttf', 36)
BIGFONT = pygame.font.Font('freesansbold.ttf', 80) 
TEXTCOLOR = WHITE
TEXTSHADOWCOLOR = GRAY

# 全局变量
SCREEN_WIDTH = 1500
SCREEN_HEIGHT = 800
SPEED = 5

# 创建屏幕
DISPLAYSURF = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))

def showTextScreen(text):
    DISPLAYSURF.fill(BGCOLOR)
    # 绘制文字阴影
    titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTSHADOWCOLOR)
    titleRect.center = (int(SCREEN_WIDTH / 2), int(SCREEN_HEIGHT / 2))
    DISPLAYSURF.blit(titleSurf, titleRect)

    # 绘制主文字
    titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTCOLOR)
    titleRect.center = (int(SCREEN_WIDTH / 2) - 3, int(SCREEN_HEIGHT / 2) - 3)
    DISPLAYSURF.blit(titleSurf, titleRect)

    # 绘制提示文字
    pressKeySurf, pressKeyRect = makeTextObjs('Press a key to play.', BASICFONT, TEXTCOLOR)
    pressKeyRect.center = (int(SCREEN_WIDTH / 2), int(SCREEN_HEIGHT / 2) + 100)
    DISPLAYSURF.blit(pressKeySurf, pressKeyRect)
    pygame.display.flip()

    while checkForKeyPress() == None:
        pygame.display.update()
        FramePerSec.tick()

def makeTextObjs(text, font, color):
    surf = font.render(text, True, color)
    return surf, surf.get_rect()

def checkForKeyPress():
    checkForQuit()

    for event in pygame.event.get([KEYDOWN, KEYUP]):
        if event.type == KEYDOWN:
            return event.key
        return event.key
    return None

def checkForQuit():
    for event in pygame.event.get(QUIT):
        terminate()
    
    for event in pygame.event.get(KEYUP):
        if event.key == K_ESCAPE:
            terminate()
        pygame.event.post(event)

def terminate():
    pygame.quit()
    sys.exit()

# 预加载背景图,避免循环内重复加载
background = pygame.image.load("minecraftbackground.jpg").convert_alpha()
background = pygame.transform.scale(background, (1500,800))
DISPLAYSURF.fill((0,0,0))
DISPLAYSURF.blit(background, (0,0))
pygame.display.update()

pygame.display.set_caption("MacPhee Minecraft")
showTextScreen('MacPhee Minecraft')

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        self.image = pygame.image.load("TNT.jpg")
        self.image=pygame.transform.scale(self.image,(70,70))        
        self.rect = self.image.get_rect()
        self.reset_pos()

    def reset_pos(self):
        self.rect.center = (random.randint(40,SCREEN_WIDTH-40), 0)    

    def move(self):
        self.rect.move_ip(0,SPEED)
        if (self.rect.top > 800):
            self.reset_pos()
            pygame.display.update()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        self.image = pygame.image.load("Steve4.png")
        self.image=pygame.transform.scale(self.image,(140,200))
        self.rect = self.image.get_rect()
        self.rect.center = (260, 480)
    
    def move(self):
        pressed_keys = pygame.key.get_pressed()
     
        if self.rect.left > 0:
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-55, 0)
        if self.rect.right < SCREEN_WIDTH:        
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(55, 0)

# 创建精灵
P1 = Player()
E1 = Enemy()

# 精灵组
enemies = pygame.sprite.Group()
enemies.add(E1)
all_sprites = pygame.sprite.Group()
all_sprites.add(P1)
all_sprites.add(E1)

# 设置速度增加定时器
INC_SPEED = pygame.USEREVENT + 1
pygame.time.set_timer(INC_SPEED, 1000)

# 游戏主循环
while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == INC_SPEED:
            SPEED += 1
        if event.type == QUIT:
            terminate()

    # 绘制背景
    DISPLAYSURF.fill((0,0,0))
    DISPLAYSURF.blit(background, (0,0))

    # 更新所有精灵
    for entity in all_sprites:
        DISPLAYSURF.blit(entity.image, entity.rect)
        entity.move()

    # 碰撞检测与重置
    if pygame.sprite.spritecollideany(P1, enemies):
        showTextScreen('Game Over')
        # 重置游戏状态
        SPEED = 5
        E1.reset_pos()
        P1.rect.center = (260, 480)
        pygame.time.delay(500)

    pygame.display.flip()
    FramePerSec.tick(FPS)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:32:18