2017-05-14 42 views
0

儘管從其他模塊導入了變量「health」,但下面的函數提供了標題中顯示的錯誤。 「健康」也是全球化的,我已經刪除了全球化和變量的輸入,我仍然收到同樣的錯誤。Python - UnboundLocalError:分配之前引用的局部變量'health'

下面是導致問題的功能。

def combat(): 
    enemy_health = (random.choice(random_enemy_Health)) 
    enemy_attack = (random.choice(random_enemy_Attack)) 
    print("\nYou are fighting a" ,random.choice(enemies), "with an attack amount of" ,enemy_attack, "and a health amount of" ,enemy_health,".") 
    while health > 0 and enemy_health > 0: 
     if turn == 1: 
      while loop == False: 
       response=input() 
       try: 
        move = response("Do you want to attack or flee? Type '1' to attack and '2' to flee.") 
        move = int(move) 
        if move == 1: 
         enemy_health = enemy_health - attack 
         print("You attacked!") 
         loop = True      
        elif move == 2: 
         hub_travel() 
         print("You fled the battle, come back once you are stronger!") 
         loop = True 
        else: 
         print("Invalid number, try again") 
         continue 
       except: 
         print("Invalid number, try again") 
         continue 
      turn = 2              

     if turn == 2: 
      AImove = randint(1,2) 
      if AImove == 1: 
       print ("Enemy attacked!") 
       health = health - enemy_attack 
      turn = 1              
      continue 

    print ("game over!") 

    if enemy_health == 0: 
     print("The enemy has been defeated!") 
     gold += random.choice(gold_dropped) 

錯誤發生在這條線具體爲:

while health > 0 and enemy_health > 0: 
+1

在檢查它是否大於零之前,您必須爲'health'分配一個值。你沒有這樣做。錯誤信息對我來說似乎很清楚...... –

+0

如果您需要由另一個模塊擁有的'health'的值,則需要將其作爲參數從具有該值訪問權限的函數調用中傳入,或者您需要爲該模塊提供調用該值的方法。例如,您可能有一個維護「健康」狀態的對象,在這種情況下,您可以直接訪問它或提供訪問者函數。 –

+0

在這種情況下,「健康」是某個角色的內在特徵,您最好提供一個Character對象,而不是報告其「健康狀況」,以便爲另一個對象提供某種方式來實現它。然後角色將負責將損害應用於自身,例如,如果健康<0或類似的東西會死亡 –

回答

2

如果我是你,而不是依賴於全局,我會用參數。此建議可能會幫助您追蹤一些錯誤。

在有幾行代碼的程序中,全局變量是一種可能性。但是,當應用程序增長時,跟蹤某些變量的當前值有點難,因爲它可以用於多種函數或方法(可能需要心理映射來查找當前值)。所以,這是你必須更喜歡使用局部變量或參數而不是全局變量的原因之一。

+0

我是一個非常基本的編碼器,而且我所知道的主要來自義務課,所以我還沒有理解參數背後的邏輯以及它們如何工作的意義正在描述。你能進一步詳細說明嗎? – lg99

0

這一變化將使你的功能,根據自己想要的方式:

def combat(health): 
    ... 

當然,你必須找到你調用的函數,並在值傳遞爲health的地方。我不知道那個時候的代碼是否可以訪問這些信息。

這可能是解決此問題的最簡單的解決方法。這當然不是最好的解決方案,但這不適用於架構教程。

+0

它按預期工作,沒有意識到修復是多麼簡單!非常感謝你:) – lg99

+0

很高興我能幫忙。 –

相關問題