-1

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

现在这是我写的:

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”。我可以更改什么以使其正确传递 hpRed 和 hpBlu 的值?

4

3 回答 3

3

有几个错误:

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

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

  • 您的打印功能只执行了 1 次。(添加在内部,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()
于 2013-11-01T18:27:09.423 回答
1

您实际上并没有对任一玩家的 hp 进行任何更改;查看你的 attack() 函数并开始检查你的变量。

于 2013-11-01T18:30:09.700 回答
0

hpRedand (顺便说一句,hpBlue至少在一个地方拼错了)变量是在模块(“全局”)级别定义的。函数内部的名称是函数局部名称,除非将它们显式分配给全局变量,否则它们无法看到全局变量。看起来像这样:

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

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

def attack(hpr, hpb):
    # calculate damage, then...
    return (hpr - damage, hpb - damage)

你可能会注意到我改变了你的return说法。你写的东西不会按照你想要的方式工作:一旦你return,你不能return再次从同一个方法调用中(这种行为更像是 a generator)。如果要返回新的红色 HP 和新的蓝色 HP,请返回一个包含它们的元组。

这段代码还有一些其他的问题——例如,你实际上从来没有改变全局变量,如果你print在循环中放置一个调用,你会省去一些麻烦,while这样你就可以看到 hp 是如何变化的。

于 2013-11-01T18:27:11.460 回答