2016-12-06 69 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的類,所以我不能完全理解代碼。一旦我這樣做,我會(希望)能夠做出調整並讓它滾動! –