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

如何在Pygame中实现生命值归0时显示游戏结束界面并终止游戏?

问题描述

参照YouTube教程制作2D Python游戏,教程未实现死亡功能与游戏结束界面。已自行完成游戏结束界面开发,但无法在player.py中玩家self.health<=0时触发该界面,不清楚如何关联player.py与main.py实现此逻辑。

相关代码

main.py

import pygame
import sys
from settings import WIDTH, HEIGTH, WATER_COLOR, FPS
from level import Level
from button import Button

def get_font(size):
    return pygame.font.SysFont(None, size)

def main_menu():
    pass

class Game:
    
    def __init__(self):
        # general setup
        pygame.init()
        self.screen = pygame.display.set_mode((WIDTH, HEIGTH))
        pygame.display.set_caption('Zelda')
        self.clock = pygame.time.Clock()

        self.level = Level()
        self.playing = False

    def run(self):
        main_sound = pygame.mixer.Sound('../audio/zelda.ogg')
        main_sound.set_volume(0.4)
        main_sound.play(loops=-1)

        while not self.playing:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_m:
                        self.level.toggle_menu()
                if self.playing == True:
                    main_sound.stop()
                    pygame.display.update()
                    self.game_over()

            self.screen.fill(WATER_COLOR)
            self.level.run()
            pygame.display.update()
            self.clock.tick(FPS)

    def game_over(self):
        Over_sound = pygame.mixer.Sound('../audio/Retro-Game.ogg')
        Over_sound.set_volume(0.5)
        Over_sound.play()

        while True:
            Game_Over_MOUSE_POS = pygame.mouse.get_pos()

            SCREEN.fill("black")

            Game_Over_TEXT = get_font(90).render(
                "Game Over", True, "Red")
            Game_Over_RECT = Game_Over_TEXT.get_rect(center=(640, 260))
            SCREEN.blit(Game_Over_TEXT, Game_Over_RECT)

            Game_Over_BACK = Button(image=None, pos=(640, 460),
                                    text_input="Main menu", font=get_font(75), base_color="White", hovering_color="Green")

            Game_Over_BACK.changeColor(Game_Over_MOUSE_POS)
            Game_Over_BACK.update(SCREEN)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if Game_Over_BACK.checkForInput(Game_Over_MOUSE_POS):
                        Over_sound.stop()
                        main_menu()

            pygame.display.update()

if __name__ == '__main__':
    while True:
        game = Game()
        game.run()
        game.game_over()

player.py

import pygame
from settings import *
from support import import_folder
from entity import Entity

class Player(Entity):
    def __init__(self):
        super().__init__()
        self.stats = {'health': 20, 'energy': 60,
                      'attack': 10, 'magic': 4, 'speed': 5}
        self.health = self.stats['health']

    def death(self):
        if self.health <= 0:
            self.playing = True
        else:
            self.playing = False

    def update(self):
        self.input()
        self.cooldowns()
        self.get_status()
        self.animate()
        self.move(self.stats['speed'])
        self.energy_recovery()
        self.death()
解决方案

1. 修正Player类的死亡状态标记

Player类中的self.playing属于Game类的属性,无法直接影响Game的运行状态。给Player添加独立的死亡状态属性,用来标记玩家是否死亡:

class Player(Entity):
    def __init__(self):
        super().__init__()
        self.stats = {'health': 20, 'energy': 60,
                      'attack': 10, 'magic': 4, 'speed': 5}
        self.health = self.stats['health']
        self.is_dead = False  # 新增死亡状态标记

    def death(self):
        if self.health <= 0:
            self.is_dead = True
            # 可在此添加死亡动画、停止玩家动作等逻辑
        else:
            self.is_dead = False

    def update(self):
        self.input()
        self.cooldowns()
        self.get_status()
        self.animate()
        if not self.is_dead:  # 死亡后停止移动
            self.move(self.stats['speed'])
        self.energy_recovery()
        self.death()

2. 在Game类中检测玩家死亡状态

假设Level类内部持有Player实例(如self.player = Player()),在Game的主循环中实时检查玩家的is_dead状态,触发游戏结束界面:

def run(self):
    main_sound = pygame.mixer.Sound('../audio/zelda.ogg')
    main_sound.set_volume(0.4)
    main_sound.play(loops=-1)

    while not self.playing:
        # 每次循环优先检查玩家是否死亡
        if self.level.player.is_dead:
            self.playing = True
            main_sound.stop()
            self.game_over()
            break

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_m:
                    self.level.toggle_menu()

        self.screen.fill(WATER_COLOR)
        self.level.run()
        pygame.display.update()
        self.clock.tick(FPS)

3. 修复Game Over界面的屏幕引用问题

game_over方法中使用的SCREEN未定义,需替换为Game类的self.screen属性:

def game_over(self):
    Over_sound = pygame.mixer.Sound('../audio/Retro-Game.ogg')
    Over_sound.set_volume(0.5)
    Over_sound.play()

    while True:
        Game_Over_MOUSE_POS = pygame.mouse.get_pos()

        self.screen.fill("black")

        Game_Over_TEXT = get_font(90).render(
            "Game Over", True, "Red")
        Game_Over_RECT = Game_Over_TEXT.get_rect(center=(640, 260))
        self.screen.blit(Game_Over_TEXT, Game_Over_RECT)

        Game_Over_BACK = Button(image=None, pos=(640, 460),
                                text_input="Main menu", font=get_font(75), base_color="White", hovering_color="Green")

        Game_Over_BACK.changeColor(Game_Over_MOUSE_POS)
        Game_Over_BACK.update(self.screen)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if Game_Over_BACK.checkForInput(Game_Over_MOUSE_POS):
                    Over_sound.stop()
                    main_menu()

        pygame.display.update()

4. 确保Level类能访问Player实例

在Level类的初始化方法中创建Player实例并保存为类属性:

class Level:
    def __init__(self):
        self.player = Player()
        # 其他关卡初始化逻辑

    def run(self):
        self.player.update()
        # 其他关卡逻辑(绘制玩家、敌人等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:51:36