我正在努力从游戏中创造一场短暂的战斗(为了好玩)。我有几个变量需要在整个序列中改变,例如m_hp(怪物健康)。这是我的代码(原谅我,如果格式不正确,这是我第一次使用这个网站):
def battle(p_lvl):
print("A goblin engages you in battle!")
p_hp = p_lvl * 25 + 25
p_dmg = p_lvl * 7 + 5
print("Player Stats (Level: " + str(p_lvl) + " Health: " + str(p_hp) + " ATK: " + str(p_dmg) + ")")
m_lvl = p_lvl - 1
m_hp = m_lvl * 20 + 15
m_dmg = m_lvl * 6 + 3
scr_dmg = m_hp / 4
dus_eft = p_hp / 5
print("Goblin Stats (Level: " + str(m_lvl) + " Health: " + str(m_hp) + " ATK: " + str(m_dmg) + ")")
act()
def act():
menu = 'Attack','Block','Use Item'
print("What will you do?")
print(menu)
action = input()
if action == ‘Attack':
m_hp = m_hp - p_dmg
print("You dealt " + str(p_dmg) + "damage to the goblin!")
p_hp = p_hp - m_dmg
print("The goblin struck back with " + str(m_dmg) + " damage!”)
act()
我在act()启动后遇到问题。如果我进入"攻击"对于input(),我收到此错误:
UnboundLocalError: local variable 'm_hp' referenced before assignment
根据我的理解,这是因为我将m_hp放置在battle()下,但是act()无法达到它。我希望能够在不将其写入act()的情况下更改m_hp。我相信如果我这样做,那么m_hp将在每次act()启动时重置,并且m_hp不会丢弃。我在这里搜索了一些问题,但我见过的案例似乎无法发挥作用。此外,我是公认的编码新手,所以我无法理解其中的一些解决方案。
Tl;博士我正在寻找一个简单的解决方案,以便如何使用来自不同功能的变量而不将它们放入函数中。
答案 0 :(得分:0)
您会看到该错误消息,因为'm_hp'变量是'battle'函数范围的本地变量。它在函数内部创建,并在该函数退出后停止存在。
看起来战斗实际上并没有随处可见...... 它看起来像你在定义之前调用act()函数。
如果修复了错误,代码也无法运行,还有很多其他原因。
您可能正在寻找的功能,您可以访问多个函数中的变量而不将其传入,这是某种全局变量。一般而言,强烈建议不要在可以合理避免的任何地方使用全局变量。
我已经对你的代码进行了一些改编,以便你有一些东西可以搞乱。我曾经使用过类来尝试将相关的东西组合在一起。
现在有一个'玩家'对象,其中包含所有玩家的统计数据和一个带有怪物统计数据的'怪物'对象。
尝试运行下面的代码,然后进行增量更改并查看是否继续运行。
class Player(object):
def __init__(self, level):
self.level = level
self.stats_for_level()
def stats_for_level(self):
self.attack_damage = (self.level * 7) + 5
self.hitpoints = (self.level * 25) + 25
def take_damage(self, damage):
self.hitpoints -= damage
def print_stats(self):
print("Player Stats (Level: " + str(self.level) +
" Health: " + str(self.hitpoints) +
" ATK: " + str(self.hitpoints) + ")")
class Monster(object):
def __init__(self, level, name="Goblin"):
self.level = level
self.name = name
self.stats_for_level()
def stats_for_level(self):
self.attack_damage = (self.level * 6) + 3
self.hitpoints = (self.level * 20) + 15
def take_damage(self, damage):
self.hitpoints -= damage
def print_stats(self):
print(self.name + " Stats (Level: " + str(self.level) +
" Health: " + str(self.hitpoints) +
" ATK: " + str(self.hitpoints) + ")")
class Game(object):
def __init__(self, starting_level=1):
self.player = Player(starting_level)
# create monster
self.monster = Monster(level=self.player.level - 1, name='Goblin')
def battle(self, player, monster):
print("A {} engages you in battle!".format(monster.name))
monster.take_damage(player.attack_damage)
print("You dealt " + str(player.attack_damage) + " damage to the goblin!")
self.player.take_damage(monster.attack_damage)
print("The goblin struck back with " + str(monster.attack_damage) + " damage!")
def act(self):
# print stats
self.player.print_stats()
self.monster.print_stats()
# show menu
menu = 'Attack', 'Block', 'Use Item'
print(menu)
print("\nWhat will you do?: ")
action = input()
# take an action
if action == 'Attack':
self.battle(self.player, self.monster)
def main():
game = Game(starting_level=3)
while(True):
game.act()
if __name__ == '__main__':
main()