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

Pong游戏无法显示获胜提示 窗口直接返回主菜单求助

Pong游戏获胜提示不显示问题修复

我开发了一款先获得5分即结束的简易Pong游戏,但无法在游戏结束时显示“获胜者是player1/player2”的提示信息,窗口会直接关闭并返回主菜单。以下是该游戏的Igra类代码:

import pygame
from random import randint
from stick import Stick
from loptica import Loptica
from rezultati import Rezultati
import sqlite3

pygame.init()

class Igra:
    def __init__(self, duzinaProzora, sirinaProzora, brIgraca, igrac1, igrac2, igra):
        def resetLoptice():
            loptica.rect.x = duzinaProzora/2
            loptica.rect.y = sirinaProzora/2
            loptica.brzina = [4*randint(-1,1),4*randint(-1,1)]
            while loptica.brzina[0] == 0:
                loptica.brzina = [4*randint(-1,1),4*randint(-1,1)]
        self.duzinaProzora = duzinaProzora
        self.sirinaProzora = sirinaProzora
        self.brIgraca = brIgraca
        self.igrac1 = igrac1
        self.igrac2 = igrac2
        self.igra = igra

        prozor = pygame.display.set_mode((self.duzinaProzora, self.sirinaProzora))
        pygame.display.set_caption("VDPong")
        pygame.display.set_icon(pygame.image.load('ball.jpg'))

        stick1 = Stick ((255,255,0),10,100)
        stick1.rect.x = 25
        stick1.rect.y = sirinaProzora / 2 - 50

        stick2 = Stick ((255,255,0),10,100)
        stick2.rect.x = duzinaProzora - 35
        stick2.rect.y = sirinaProzora / 2 - 200
        
        loptica = Loptica((0,0,0),10,10)
        loptica.rect.x = duzinaProzora/2
        loptica.rect.y = sirinaProzora/2

        lista_spriteova = pygame.sprite.Group()
        lista_spriteova.add(stick1)
        lista_spriteova.add(stick2)
        lista_spriteova.add(loptica)

        rezultat = ""
        
        vrijeme = pygame.time.Clock()

        bodoviA = 0
        bodoviB = 0

        while self.igra:

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.igra = False
            
            kontrole = pygame.key.get_pressed()

            if self.brIgraca == 2:
                if kontrole[pygame.K_w]:
                    stick1.moveUp(5)
                if kontrole[pygame.K_s]:
                    stick1.moveDown(5,sirinaProzora)
            else:
                if loptica.rect.y <= stick1.rect.y + 50:
                    stick1.moveUp(4)
                if loptica.rect.y >= stick2.rect.y + 50:
                    stick1.moveDown(4,sirinaProzora)
                igrac1 = "COM"
            if kontrole[pygame.K_UP]:
                stick2.moveUp(5)
            if kontrole[pygame.K_DOWN]:
                stick2.moveDown(5,sirinaProzora)
            
            lista_spriteova.update()

            if loptica.rect.x >= duzinaProzora - 10:
                bodoviA +=1
                resetLoptice()
            if loptica.rect.x <= 0:
                bodoviB +=1
                resetLoptice()
            if loptica.rect.y >= sirinaProzora - 10:
                loptica.brzina[1] = -loptica.brzina[1]
            if loptica.rect.y<=0:
                loptica.brzina[1] = -loptica.brzina[1]
            
            if pygame.sprite.collide_mask(loptica, stick1) or pygame.sprite.collide_mask(loptica, stick2):
                loptica.bounce()
                loptica.brzina[0] *= 1.1
                if loptica.brzina[0] >= 9:
                    loptica.brzina[0] == 9
            
            prozor.fill((0,0,255))

            pygame.draw.line(prozor, (255,255,0) , [duzinaProzora/2, 0], [duzinaProzora/2, sirinaProzora], 5)

            lista_spriteova.draw(prozor)

            font = pygame.font.Font(None, 50)
            text = font.render(str(bodoviA), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora/2-60,255))
            text = font.render(str(bodoviB), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora - duzinaProzora/2 + 40,255))
            text = font.render(str(igrac1), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora/4,20))
            text = font.render(str(igrac2), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora - duzinaProzora/4-40,20))

            pygame.display.flip()

            vrijeme.tick(60)


            if bodoviA == 5 or bodoviB == 5:
                rezultat = str(bodoviA) + ":" + str(bodoviB)
                break
        
        rez = Rezultati(igrac1, igrac2, rezultat)
        
        rez.bazaRezultata(igrac1,igrac2,rezultat)
'''
        with sqlite3.connect("Baza.db") as conn:
            interface = conn.cursor()

        upis = f"INSERT INTO Rezultati(Igrac1,Igrac2,Rezultat) VALUES ('{self.igrac1}','{self.igrac2}','{rezultat}');"
        interface.execute(upis)
'''

pygame.quit()

问题原因

当前代码在玩家得分达到5分时,直接通过break跳出主游戏循环,随后立即执行数据库存储操作并调用pygame.quit()关闭窗口,没有预留任何显示获胜提示并等待用户交互的逻辑,导致窗口直接关闭。

修复方案

在跳出主循环后,添加一个新的循环来显示获胜提示,等待用户操作(如按下任意键或关闭窗口)后再退出:

修改后的关键代码片段

if bodoviA == 5 or bodoviB == 5:
            rezultat = str(bodoviA) + ":" + str(bodoviB)
            break
        
        # --- 新增:显示获胜提示的循环 ---
        winner = igrac1 if bodoviA ==5 else igrac2
        font_large = pygame.font.Font(None, 80)
        winner_text = font_large.render(f"获胜者是 {winner}", 1, (255, 0, 0))
        text_rect = winner_text.get_rect(center=(duzinaProzora/2, sirinaProzora/2))
        
        waiting = True
        while waiting:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    waiting = False
                    self.igra = False
                if event.type == pygame.KEYDOWN:
                    waiting = False
            
            # 绘制背景和原有元素
            prozor.fill((0,0,255))
            pygame.draw.line(prozor, (255,255,0) , [duzinaProzora/2, 0], [duzinaProzora/2, sirinaProzora], 5)
            lista_spriteova.draw(prozor)
            
            # 绘制分数和玩家名称
            font = pygame.font.Font(None, 50)
            text = font.render(str(bodoviA), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora/2-60,255))
            text = font.render(str(bodoviB), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora - duzinaProzora/2 + 40,255))
            text = font.render(str(igrac1), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora/4,20))
            text = font.render(str(igrac2), 1, (255,255,0))
            prozor.blit(text, (duzinaProzora - duzinaProzora/4-40,20))
            
            # 绘制获胜提示
            prozor.blit(winner_text, text_rect)
            
            pygame.display.flip()
            vrijeme.tick(60)
        # --- 结束新增部分 ---
        
        rez = Rezultati(igrac1, igrac2, rezultat)
        rez.bazaRezultata(igrac1,igrac2,rezultat)

pygame.quit()

修复说明

  1. 确定获胜者:通过判断bodoviA或bodoviB是否等于5,确定获胜玩家。
  2. 创建提示文本:用更大的字体生成获胜提示,并居中显示在窗口。
  3. 等待循环:新增一个循环,处理退出事件和按键事件,只有当用户关闭窗口或按下任意键时,才结束循环继续后续流程。
  4. 完整绘制:在等待循环中重新绘制游戏界面的所有元素(背景、分数、玩家名称、球和挡板),再叠加获胜提示,保证界面完整。

内容的提问来源于stack exchange,提问作者Python Beginner CR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:37:06