while 循环和字典问题

while loop and dictionary issue

提问人:Toby 提问时间:8/30/2023 更新时间:8/30/2023 访问量:51

问:

我正在尝试使用 Python 创建一个基于文本的游戏。

我目前的问题涉及我试图构建战斗系统。一开始,它会显示你和敌人的统计数据(技能/耐力),然后是你的选项(攻击/物品/逃跑)。

当你选择攻击时,成功命中应该会从被击中的人身上移除 2 点耐力。

我的问题是整体耐力似乎不想降低:

tempSkill = skill
tempStamina = stamina
tempLuck = luck

enemyName = Creature.goblin['enemy_name']
enemySkillTemp = Creature.goblin['skill']
enemyStamina = Creature.goblin['stamina']

while enemyStamina and tempStamina > 0:
        print(f"\nyou encountered {enemyName}!")
        print(f"{enemyName} | SKILL: {enemySkillTemp} | STAMINA: {enemyStamina}")
        print(f"{name.upper()} | SKILL: {tempSkill} | STAMINA: {tempStamina}")

        print("1. ATTACK")
        print("2. ITEM")
        print("3. FLEE")

        choice = input("\nMake your choice: (1, 2, 3): ")
        choice = int(choice)
        if choice == 1:
            playerAS = Combat.attackSkillRoll(tempSkill)
            enemyAS = Combat.attackSkillRoll(enemySkillTemp)
            print("\nATTACK!")
            print(f"{enemyName} rolled {enemyAS - enemySkillTemp}! | Attack Strength: {enemyAS}")
            print(f"{name.upper()} rolled {playerAS - tempSkill}! | Attack Strength: {playerAS}")
            if enemyAS > playerAS:
                 print(f"{name.upper} wounded! (-2 STAMINA)")
                 print(Combat.wound(tempStamina))
            elif playerAS > enemyAS:
                 print(f"{enemyName} wounded! (-2 STAMINA)")
                 print(Combat.wound(enemyStamina))
                 print("1. Continue")
                 print("2. Test your LUCK?")
                 choice2 = input ("Make your choice: (1, 2): ")
                 choice2 = int(choice2)
                 if choice2 == 1:
                      continue
                 elif choice2 == 2:
                      pass
                 else:
                      print("Try that again...")
                      
        elif choice == 2:
            print("Here are your items!")
        elif choice == 3:
            print("You fled... (-2 STAMINA)")
        else:
            print("Try that again...")

enemyStamina应在外部文件中传递给战斗类

def wound (x):
        return x - 2

然后它应该回到while循环的开头,直到任何一个实体的耐力耗尽。

我的一个理论是,它从另一个名为 Creature 的外部类中的字典中检索敌人的耐力:

class Creature:
    goblin = {
    "enemy_name" : "GOBLIN", 
    "skill" : 5, 
    "stamina" : 6
}

我试过复制字典,但认为我做错了。

任何帮助将不胜感激

python 列表 字典 while-loop

评论

0赞 Code-Apprentice 8/30/2023
阅读本文,了解有关调试代码的提示。另外,我建议您尽快了解函数。这些是将代码组织成更小的逻辑部分的好工具。
0赞 Code-Apprentice 8/30/2023
我建议你阅读更多关于类和面向对象编程的信息。您在此处使用它们的方式没有利用类提供的全部功能。
0赞 rasjani 8/30/2023
你永远不会在角色被击中后存储HP..

答:

2赞 Code-Apprentice 8/30/2023 #1

这里的问题在于代码的这些部分的组合:

Combat.wound(enemyStamina)

def wound (x):
        return x - 2

在这里,该函数通过从传递给参数的值中减去 2 来计算值,但它不会更改值,也不会更改其值被传递给的变量的值。wound()xxx

我建议做这样的事情:

class Creature:
    def __init__(name, skill, stamina)
        self.name = name
        self.skill = skill
        self.stamina = stamina

    def wound(damage):
        self.stamina = self.stamina - damage

请注意此版本如何更改 的值。现在你可以用类似的东西创建一个生物wound()stamina

goblin = Creature("goblin", 5, 6)

然后你可以用

print(goblin.stamina) // 6
goblin.wound(2)
print(goblin.stamina) // 4

这个职业现在可以重复使用来制作兽人、地精、龙或其他任何你想要的东西。你甚至可以重用这个类来表示英雄,或者你可以为英雄创建一个单独的类。我建议您阅读有关函数和类如何工作的更多信息,以理解这一点并能够自己编写这样的代码。Creature