Python:在不重命名的情况下使用不同函数的变量

时间:2016-12-06 01:08:48

标签: python-3.x variables user-defined-functions

我正在努力从游戏中创造一场短暂的战斗(为了好玩)。我有几个变量需要在整个序列中改变,例如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;博士我正在寻找一个简单的解决方案,以便如何使用来自不同功能的变量而不将它们放入函数中。

1 个答案:

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