我正在尝试编写一个简单的程序来定义两个只有名字和健康数量的虚构战士。
现在这就是我写的:
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的值?
答案 0 :(得分:3)
有几个错误:
您使用了两个不同的名称:hpBlue
和hpBlu
您返回了两个值,而不是更改您定义的变量的值。
您的打印功能只执行了一次。 (在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()
答案 1 :(得分:1)
你实际上并没有对任何一个玩家的HP做出任何改变;查看你的attack()函数并开始检查你的变量。
答案 2 :(得分:0)
hpRed
和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
来自同一个方法调用(这种行为更像是{{1} }})。如果要同时返回新的红色HP和新的蓝色HP,请返回包含它们的元组。
此代码还有其他一些问题 - 例如,您实际上从未真正更改过全局变量,如果您在generator
内放置print
调用,您将会感到头疼。 }循环,这样你就可以看到hp是如何变化的。