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()
修复说明
- 确定获胜者:通过判断
bodoviA或bodoviB是否等于5,确定获胜玩家。 - 创建提示文本:用更大的字体生成获胜提示,并居中显示在窗口。
- 等待循环:新增一个循环,处理退出事件和按键事件,只有当用户关闭窗口或按下任意键时,才结束循环继续后续流程。
- 完整绘制:在等待循环中重新绘制游戏界面的所有元素(背景、分数、玩家名称、球和挡板),再叠加获胜提示,保证界面完整。
内容的提问来源于stack exchange,提问作者Python Beginner CR
相关产品推荐
相关产品推荐

