pygame 文本不更新或接受输入

问题描述

我的代码是一款基于 nes 时代经典日本角色扮演游戏的简单回合制游戏。显示主要由静态图像和两个文本框组成,一个显示玩家当前的生命值和魔法值,另一个描述每个参与者在采取行动时的动作。

这是我打算让它工作的方式:程序开始,转弯计数器设置为“1”。每当回合计数器为“1”时,就是玩家回合,并且文本框中会显示编号的命令列表。玩家通过按下对应于该动作的数字键来选择他们想要的那个,调用相应的函数,回合计数器设置为“2”,敌人轮到他们,回合计数器设置回“1” ”。这一直持续到某人的 HP 达到 0 或更低,此时会显示一条消息宣布获胜者。

我遇到的两个问题如下:在 main 中早期声明的带有占位符值的消息文本在 turn == 1 时没有更新到它应该的内容。第二个问题是代码没有似乎正在接受任何输入,因为我已经设置了一些文本来显示“turn”变量的当前值,这让我相信有什么东西阻止了输入被接受,或者有什么东西阻止了 all 被更新的文本,而不仅仅是文本框。

以下是我的代码的主要功能,如果有帮助,可以在此处找到整个内容以及使用的 bmp 和 wav 文件https://www.mediafire.com/file/nr151r4ysg4shmz/Code.zip/file

def main():
    pygame.init()

    size = [640,480]
    window = pygame.display.set_mode(size)

    black = pygame.color.Color('#000000')
    white = pygame.color.Color('#FFFFFF')
    font = pygame.font.SysFont("Arial",36)

    bg = pygame.image.load('Background.bmp')
    bg = pygame.transform.scale(bg,(640,480))

    nme = pygame.image.load('GreenDragon.bmp')
    nme = pygame.transform.scale(nme,(200,150))

    sound = pygame.mixer.sound('Battle_music.wav')
    sound.play()

    statusBoxX = 10
    statusBoxY = 10
    statusBoxWidth = 140
    statusBoxHeight = 140
    statusBorderX = 0
    ststusBorderY = 0
    statusBorderWidth = 160
    ststusBorderHeight = 160

    textBoxX = 10
    textBoxY = 330
    textBoxW = 620
    textBoxH = 140
    textBorderX = 0
    textBorderY = 320
    textBorderW = 640
    textBorderH = 160

    turn = 1
    message1 = "1"
    message2 = "2"    

    playerName = "Hero"
    playerMaxHP = 300
    playerCurHP = 300
    playerMaxMP = 120
    playerCurMP = 120
    playerBaseStr = 50
    playerCurStr = 50
    playerBaseDef = 45
    playerCurDef = 45
    playerMagPwr = 35
    playerMagDef = 40
    playerSpeed = 40
    playerdamage = 0
        
    enemyName = "Green Dragon"
    enemyMaxHP = 300
    enemyCurHP = 300
    enemyMaxMP = 120
    enemyCurMP = 120
    enemyBaseStr = 50
    enemyCurStr = 50
    enemyBaseDef = 45
    enemyCurDef = 45
    enemyMagPwr = 35
    enemyMagDef = 40
    enemySpeed = 40
    enemydamage = 0
    
    keys = [False,False,False]  
    
    while True:

        window.fill((255,255,255))
        window.blit(bg,(0,0))
        window.blit(nme,(230,160))

        pygame.draw.rect(window,white,[textBorderX,textBorderY,textBorderW,textBorderH],border_radius=10)
        pygame.draw.rect(window,black,[textBoxX,textBoxY,textBoxW,textBoxH],border_radius=10)

        messageText1 = font.render(message1,white)
        messageText2 = font.render(message2,white)

        window.blit(messageText1,(20,345))
        window.blit(messageText2,385))

        pygame.draw.rect(window,[statusBorderX,ststusBorderY,statusBorderWidth,ststusBorderHeight],[statusBoxX,statusBoxY,statusBoxWidth,statusBoxHeight],border_radius=10)

        name = font.render(playerName,white)
        playerHealth = font.render("HP: " + str(playerCurHP),white)
        playerMagic = font.render("MP: " + str(playerCurMP),white)

        window.blit(name,(45,20))
        window.blit(playerHealth,(25,60))
        window.blit(playerMagic,100))
        
        debug = font.render(str(turn),white)
        window.blit(debug,20))

        pygame.display.flip()

        while playerCurHP > 0 and enemyCurHP > 0:
            if turn == 1:
                loopx = False
                while loopx == False:
                    playerCurDef = playerBaseDef
                    pygame.display.update()
                    message1 = "1. Attack 2. Heal 3. Fireball"
                    message2 = "4. Buff 5. Item 6. Defend"
                    
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            pygame.quit()
                            sys.exit(0)
                        if event.type == pygame.KEYDOWN:
                            if event.key == pygame.K_1:
                                keys[0] = True
                            elif event.key == pygame.K_2:
                                keys[1] = True
                            elif event.key == pygame.K_3:
                                keys[2] = True
                            elif event.key == pygame.K_4:
                                keys[3] = True
                            elif event.key == pygame.K_5:
                                keys[4] = True
                            elif event.key == pygame.K_6:
                                keys[5] = True

                        if event.type == pygame.KEYUP:
                            if event.key == pygame.K_1:
                                keys[0] = False
                            elif event.key == pygame.K_2:
                                keys[1] = False
                            elif event.key == pygame.K_3:
                                keys[2] = False
                            elif event.key == pygame.K_4:
                                keys[3] = False
                            elif event.key == pygame.K_5:
                                keys[4] = False
                            elif event.key == pygame.K_6:
                                keys[5] = False

                if keys[0] == True:
                    playerAttack(playerName,playerCurStr,enemyName,enemyCurHP,enemyCurDef,playerdamage)
                    loopx = True
                elif keys[1] == True:
                    playerHeal(playerName,playerCurHP,playerMaxHP,playerCurMP)
                    loopx = True
                elif keys[2] == True:
                    playerFireball(playerName,playerMagPwr,enemyMagDef,playerdamage)
                    loopx = True
                elif keys[3] == True:
                    playerBuff(playerName,playerCurMP,playerCurStr)
                    loopx = True
                elif keys[4] == True:
                    item(playerName,playerMaxMP)
                    loopx = True
                elif keys[5] == True:
                    defend(enemyAttack,enemydamage)
                    loopx = True
                turn = 2                        

            if turn == 2:
                action = random.randint(1,100)
                if action < 41:
                    enemyAttack(enemyName,enemyCurStr,playerName,playerCurDef,enemydamage)
                elif action < 81:
                    magic = random.randint(1,100)
                    if magic < 26:
                        enemyHeal(enemyName,enemyMaxHP,enemyCurMP,enemyMagPwr)
                    elif magic < 66:
                        enemyFirebreath(enemyName,enemyMagPwr,enemydamage)
                    else:
                        enemyDeMagic(enemyName,playerBaseStr,playerCurStr)
                else:
                    enemyDefend(enemyCurHP,playerdamage)

                     
                turn = 1
                continue

        if playerCurHP < 1:
            message1 = "Game Over!"
            message2 = " "
            break
        elif enemyCurHP < 1:
            message1 = enemyName + " was defeated!"
            message2 = " "
            break

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)