2016-12-06 59 views
2

我正在从游戏中创建一场短暂的战斗(为了好玩)。我有几个变量需要在整个序列中进行更改,例如m_hp(怪物健康)。下面是代码我(请原谅我,如果我格式不正确,这是使用本网站的我的第一次):Python:使用不同函数的变量而不重命名

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() 

我得到的行为出现问题后()启动。如果我输入的输入()“攻击”,我得到这个错误:

UnboundLocalError: local variable 'm_hp' referenced before assignment 

据我了解,这是因为我已经m_hp划归战(),但行为()不能达到它。我希望能够改变m_hp而不用在act()中写入它。我相信如果我这样做,那么每次执行act()时m_hp都会重置,并且m_hp不会丢失。我已经通过这里的问题进行了搜索,但我所看到的案例似乎并不奏效。另外,我承认编程是新手,所以我无法理解一些解决方案。

Tl; dr我正在寻找一个简单的解决方案,以便如何使用不同函数的变量而不必将它们放入函数中。

回答

0

由于'm_hp'变量局限于'战斗'功能的范围,因此您会看到该错误消息。它在函数内部创建,并在该函数退出后不再存在。

它看起来并不像实际上在任何地方被称为战争...... 它也看起来像你在定义它之前调用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() 
+0

我了解错误,并且在创建act()后将act()添加到battle()中。我复制/粘贴你的代码,然后在main()中输入以查看它是否工作。这样做后,我收到一条消息,说“NameError:name'游戏'未定义”。据我所知,这意味着游戏不存在(?)另外,我使用的是Python 3.5.2,因此可能会导致问题。 –

+0

我刚刚更新了代码,以便它可以用于python 3.5(我之前曾经写过它,前面是/ python 2.7)。也许值得尝试一下新的草案?从错误,它看起来像我或你在复制和粘贴时发生错误。我粘贴的新的希望是正确的。 (仅供参考,游戏是在读取“class Game(object):”的行上定义的,并且仅在定义它之后才在一个地方使用。) –

+0

我再次尝试它,并且此代码运行时带有一个或两个错误。 (例如,你不小心打印了生命值,但没关系。)感谢您的帮助!我目前使用Codecademy来学习Python,但我还没有学习Python的类,所以我不能完全理解代码。一旦我这样做,我会(希望)能够做出调整并让它滚动! –