2017-05-14 2 views
0

Obwohl die Variable 'health' aus einem anderen Modul importiert wird, gibt die folgende Funktion den im Titel angezeigten Fehler aus. "Gesundheit" ist auch globalisiert und ich habe sowohl die Globalisierung als auch den Import der Variablen entfernt und bekomme immer noch denselben Fehler.Python - UnboundLocalError: Lokale Variable 'Gesundheit', auf die vor der Zuweisung verwiesen wird

Unten ist die Funktion, die das Problem verursacht.

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) 

Der Fehler tritt auf dieser Linie insbesondere:

while health > 0 and enemy_health > 0: 
+1

Sie müssen 'health' einen Wert zuweisen, bevor Sie prüfen, ob es größer als Null ist. Du machst das nicht. Die Fehlermeldung scheint mir ziemlich klar zu sein ... –

+0

Wenn Sie den Wert von 'health' benötigen, der von einem anderen Modul gehört, müssen Sie es entweder als Parameter von einem Funktionsaufruf übergeben, der Zugriff auf diesen Wert hat, oder Sie müssen dieses Modul bereitstellen, um diesen Wert aufzurufen. Zum Beispiel könnten Sie ein Objekt haben, das den Status "Gesundheit" beibehält. In diesem Fall können Sie direkt darauf zugreifen oder eine Accessor-Funktion bereitstellen. –

+0

In diesem Fall wäre "Gesundheit" eine intrinsische Eigenschaft von etwas wie einem Charakter, und man würde am besten ein Character-Objekt bereitstellen, das, anstatt seine "Gesundheit" anzugeben, einem anderen Objekt einen Weg bieten könnte. Dann wäre der Charakter verantwortlich für die Anwendung des Schadens auf sich selbst und zum Beispiel sterben, wenn Gesundheit <0 oder so ähnlich –

Antwort

2

Wenn ich Sie wäre, statt auf Globals zu verlassen, würde ich Parameter verwenden. Dieser Rat kann Ihnen helfen, einige Fehler zu verfolgen.

Globals Variablen ist eine Möglichkeit in Programmen, die ein paar Zeilen Code haben. Aber wenn Ihre Anwendung wächst, ist es etwas schwierig, den aktuellen Wert einer Variablen zu verfolgen, da sie in mehreren Funktionen oder Methoden verwendet werden kann (wahrscheinlich benötigen Sie eine mentale Zuordnung, um den aktuellen Wert herauszufinden). Das ist einer der Gründe, warum Sie lieber lokale Variablen oder Parameter anstelle von globalen Variablen verwenden.

+0

Ich bin ein sehr grundlegender Programmierer und die Hauptlast von dem, was ich weiß, kommt aus dem Pflichtunterricht, so dass ich noch verstehen muss Die Logik hinter den Parametern und wie sie funktionieren in dem Sinne, den Sie gerade beschreiben. Können Sie das bitte weiter ausführen? – lg99

0

würde diese Änderung lassen Sie Ihre Funktion, wie Sie wollen arbeiten:

def combat(health): 
    ... 

Natürlich würden Sie die Orte finden, wo Sie die Funktion aufrufen und für health im Wert übergeben. Ich weiß nicht, ob der Code zu diesem Zeitpunkt Zugriff auf diese Informationen hat.

Dies ist wahrscheinlich die einfachste Lösung, die möglicherweise dieses Problem beheben könnte. Es ist sicherlich nicht die beste Lösung, aber dies ist kein guter Ort für ein Architektur-Tutorial.

+0

Es funktioniert wie vorgesehen, wusste nicht, wie einfach die Lösung war! Vielen Dank :) – lg99

+0

Ich bin froh, dass ich helfen konnte. –

Verwandte Themen