简单的1对1战斗模拟

2024-10-03 21:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个简单的程序,定义两个虚构的战士只有一个名字和健康的数量。在

现在我写的是:

import random

def main():
    pass

if __name__ == '__main__':
    main()

hpRed = 20
hpBlu = 20

def attack():
    damage = random.randrange(1,3)

    return hpRed - damage
    return hpBlue - damage

def fighterRed(name, hpRed):
    print(str(name) + " has " + str(hpRed) + " health left.")

def fighterBlue(name, hpBlu):
    print(str(name) + " has " + str(hpBlu) + " health left.")

def battle():
    fighterRed("Branden",hpRed)
    fighterBlue("Alex",hpBlu)

    while ((hpRed > 0) and (hpBlu > 0) is True):
        attack()

    else:
        print("The battle is over!")

        if (hpRed > 0):
            return "Red Player is victorious!"
        else:
            return "Blue Player is victorious!"

battle()

到目前为止,我经常收到错误“hpRed referenced before assignment”。我可以做些什么来让它正确地传递hpRed和hpBlu的值?在


Tags: namereturnifismaindefrandomprint
3条回答

有几个错误:

  • 您使用了两个不同的名称:hpBluehpBlu

  • 返回的是两个值,而不是更改定义的变量的值。

  • 你的打印功能只执行了一次。(添加到while中,以便打印每个迭代)

代码:

import random

hpRed = 20
hpBlu = 20

def attack():
    global hpRed, hpBlu
    damage = random.randrange(1,3)
    hpRed = hpRed - damage
    hpBlu = hpBlu - damage

def fighterRed(name, hpRed):
    print(str(name) + " has " + str(hpRed) + " health left.")

def fighterBlue(name, hpBlu):
    print(str(name) + " has " + str(hpBlu) + " health left.")

def battle():   

    while (((hpRed > 0) and (hpBlu > 0)) is True):
        fighterRed("Branden",hpRed)
        fighterBlue("Alex",hpBlu)
        attack()

    else:
        print("The battle is over!")

        if (hpRed > 0):
            return "Red Player is victorious!"
        else:
            return "Blue Player is victorious!"

battle()

hpRedhpBlue(至少在一个地方拼错了)变量是在模块(“global”)级别定义的。函数内部的名称是函数局部名称,除非显式地将它们指定给全局变量,否则这些名称不能看到全局变量。应该是这样的:

def attack():
    global hpRed, hpBlue
    # rest of your function

虽然您可以简单地使用全局变量来实现这一点,但这不是一个很好的实践。我建议将该值传递给任何需要它的函数,或者将它放入一个类中,以便类的方法可以对其进行操作。在

^{pr2}$

您可能注意到我更改了您的return语句。您编写的内容将无法按您希望的方式工作:一旦您return,您就不能从同一个方法调用中再次{}(该行为更像是generator)。如果你想同时返回新的红色血量和蓝色血量,请返回一个包含它们的元组。在

这段代码也有一些其他问题,例如,您从未实际更改全局变量,并且如果您在while循环中放入print调用,这样就可以看到hp是如何变化的,这样您就省去了一些麻烦。在

你实际上并没有改变任何一个玩家的生命值;看看你的attack()函数,开始检查你的变量。在

相关问题 更多 >