2016-04-03 5 views
0

Im neu (ish) zu python bearbeiten und ich ein Spiel heute gemacht, die, nachdem ich mir klar, beenden ich einen großen Fehler gemacht hatte:Wie für den Zugriff auf und Variablen innerhalb von Funktionen in Python

innerhalb der Funktionen hatte ich um auf Variablen zuzugreifen und sie zu bearbeiten, auf die auch in anderen Funktionen und vielleicht in Zukunft außerhalb der Funktionen zugegriffen und geändert wurde. Und ich weiß nicht, wie ich das machen soll.

Ich habe lange recherchiert und fand nur sehr wenige Dinge, die das Problem lösen könnten, ich habe ein paar ausprobiert, aber sie haben nicht funktioniert und ich verstehe nicht, wie man andere benutzt.

Könnten Sie bitte versuchen, mich mit dem Problem zu helfen, und wenn Sie andere beschmutzen mir bitte sagen, wie Ich bin nicht zu gut an das Debuggen :(

Hier ist der Code unten, es ist ziemlich groß (ich habe setzen die Variablen muss ich in fett zugreifen und diese ändern): aus zufälligen Import randint print ("Ghost Spiel v2.0") print ("wählen Schwierigkeit")

score  = 0 
alive  = True 
difficulty = 0 
doors  = 0 
ghost_door = 0 
action  = 0 
ghost_power = 0 
       #define the function 'ask_difficulty' 
def ask_difficulty() : 
    difficulty = input ("Hard, Normal, Easy") 
    set_difficulty() 



       # define the function 'set_difficulty' which sets the   difficulty. 
def set_difficulty() : 
if difficulty == 'Hard' or 'Normal' or 'Easy' : 
    if difficulty == 'Hard' : 
     doors = 2 

    elif difficulty == 'Normal' : 
     doors = 3 

    elif difficulty == 'Easy' : 
     doors = 5 

else: 
    print ("Invalid input, please type Hard, Normal, or Easy") 
    ask_difficulty() 



      # define the function 'ghost_door_choose' which sets the ghost door and the chosen door 


def ghost_door_choose(x): 
    ghost_door = randint (1, x) 

    print (doors + " doors ahead...") 
    print ("A ghost behind one.") 
    print ("Which do you open?") 

    if doors == 2 : 
     door = int("Door number 1, or door number 2...") 
     if 1 or 2 in door : 
      ghost_or_no() 

     else : 
      print ("Invalid input") 
      ghost_door_choose(difficulty) 


    elif doors == 3 : 
     door = int("Door number 1, door number 2, or door number 3") 
     if 1 or 2 or 3 in door : 
      ghost_or_no() 

     else: 
      print ("Invalid input") 
      ghost_door_choose(difficulty) 


    elif doors == 5 : 
     print("Door number 1, door number 2, door number 3, door number 4,  or door number 5.") 
     if 1 or 2 or 3 or 4 or 5 in door : 
      ghost_or_no() 

     else: 
      print ("Invalid input") 
      ghost_door_choose(difficulty) 


       # define the function 'ghost_or_no' 
def ghost_or_no() : 
    if door == ghost_door: 
     print ("GHOST!!") 
     print ("Initiating battle...") 
     battle() 

    else: 
     print ("No ghost, you\'ve been lucky, but will luck remain with you...") 
     score = score + 1 
     ghost_door_choose(difficulty) 

       # define the function 'battle' which is the battle program 
def battle() : 
    ghost_power = randint (1, 4)    # 1 = Speed, 2 = Strength, 3 = The ghost is not friendly, 4 = The ghost is friendly 

    print ("You have 3 options") 
    print ("You can flee, but beware, the ghost may be fast (flee),") 
    print ("You can battle it, but beware, the ghost might be strong (fight),") 
    print ("Or you can aproach the ghost and be friendly, but beware, the ghost may not be friendly (aproach)...") 
    action = input ("What do you choose?") 

    if flee in action : 
     action = 1 

    elif fight in action : 
     action = 2 

    elif aproach in action : 
     action = 3 

    else : 
     print ("Invalid input") 
     battle() 

    if ghost_power == action : 
     if action == 1: 
      print ("Oh no, the ghost\'s power was speed!") 
      print ("DEFEAT") 
      print ("You\'r score is " + score) 
      alive = False 

     elif action == 2: 
      print ("Oh no, the ghost\'s power was strength!") 
      print ("DEFEAT") 
      print ("You\'r score is " + score) 
      alive = False 

     elif action == 3: 
      print ("Oh no, the ghost wasn\'t friendly ") 
      alive = False 

    elif ghost_power == 4 and action == 3 : 
     print ("Congratulations, The ghost was friendly!") 
     score = score + 1 
     ghost_door_choose(difficulty) 

    elif ghost_power != action and ghost_power != 4 : 
     if action == 1: 
      print ("Congratulations, the ghost wasn\'t fast!") 
      score = score + 1 
      ghost_door_choose(difficulty) 

     elif action == 2: 
      print ("Congratulations, you defeated the ghost!") 
      score = score +1 
      ghost_door_choose(difficulty) 

    elif ghost_power != action and ghost_power == 4 : 
     if action == 1: 
      print ("You ran away from a friendly ghost!") 
      print ("Because you ran away for no reason, your score is now 0") 
      score = 0 
      ghost_door_choose(difficulty) 
     elif action == 1: 
      print ("You killed a friendly ghost!") 
      print ("Your score is now 0 because you killed the friendly ghost") 
      score = 0 
      ghost_door_choose(difficulty) 



        #actual game loop 

ask_difficulty() 

while alive : 
    ghost_door_choose(doors) 
+0

Ein bisschen zu viel Code ... – SteJ

+2

Sie zeigen zu viel Code. Es würde den Lesern helfen, wenn Sie sich auf einen [mcve] beschränken würden. – idjaw

+1

Sie möchten wahrscheinlich eine Klasse, wenn Sie Variablen in verschiedenen Funktionen teilen und aktualisieren möchten. –

Antwort

0

Bedenken Sie:

x=0 
z=22 
def func(x,y): 
    y=22 
    z+=1 
    print x,y,z 

func('x','y')  

Wenn Sie func rufen Sie erhalten UnboundLocalError: local variable 'z' referenced before assignment

den Fehler in unserer Funktion zu beheben, tun:

x=0 
z=22 
def func(x,y): 
    global z 
    y=22 
    z+=1 
    print x,y,z 

Das global Schlüsselwort ermöglicht einen lokalen Verweis auf eine globale definierten Variablen geändert werden.

Beachten Sie auch, dass die lokale Version x gedruckt wird, nicht die globale Version. Das ist, was Sie erwarten würden. Die Mehrdeutigkeit liegt vor, wenn es keine lokale Version eines Wertes gibt. Python behandelt global definierte Werte als schreibgeschützt, es sei denn, Sie verwenden das Schlüsselwort global.

Wie in den Kommentaren erwähnt, eine Klasse, diese Variablen zu halten, wäre besser.

+1

Das hat mir sehr geholfen! Danke, ich werde das wahrscheinlich tun, ich würde es begrüßen, wenn du mir erklären könntest, was eine Klasse ist, ich bin ziemlich neu bei Python und habe es noch nicht gefunden. Vielen Dank für Ihre Zeit, um dies zu erklären. – Pixelf

0

Diese Variablen am Anfang des Skripts sind global. Um sie in Funktionen zu setzen, müssen Sie sie in der Funktion global deklarieren. Als ein kleineres Beispiel,

Der nächste Schritt besteht darin, Klassen zu erstellen, die kompliziert werden können. Wenn Sie zum Beispiel den Punktestand nach Benutzern verfolgen möchten, aber ein Benutzer mehrere Zeichen haben kann, die jeweils ihre eigene Lebendigkeit haben, würden Sie damit beginnen, Klassen zu erstellen, um diese Dinge darzustellen.

0

kann das Schlüsselwort global sein, was Sie suchen.

Zum Beispiel in dem folgenden Code.

some_variable = 10 

def some_function(): 
    global some_variable 
    some_variable = 20 

Die in some_variable (im globalen Bereich) ergeben würde auf den Wert von 20 unter Bezugnahme Wo, wie es bei 10 (im globalen Bereich), ohne die Verwendung des globalen Schlüsselwort bleiben würde.

Weitere Informationen zu globalen und lokalen Variablen here.

+0

Ich habe das Problem des nicht allzu guten, aber etwas einfacheren globalen Keywords gelöst. Ich schätze die Hilfe und brauche keine weiteren Vorschläge oder Antworten mehr. – Pixelf

0

Eine Funktion hat ihren eigenen variablen Bereich - dies gilt für viele Sprachen. Das bedeutet, sobald die Funktion beendet ist, existieren die Variablen nicht mehr (und Pythons Garbage Collection wird sie bereinigen).

Die Methode der alten Schule (und allgemein verpönt, nicht unbedingt fair) ist die Verwendung globaler Variablen. Dies sind Variablen, die Sie außerhalb des Bereichs der Funktion deklariert haben, normalerweise am Anfang Ihrer Quelle, und können in den verschiedenen Funktionen und Klassen Ihres Programms verwendet werden.

Es gibt gute Gründe, warum Leute globale Variablen nicht oft verwenden, von Leistungsproblemen bis zu deren Verwechslung mit lokal begrenzten Variablen, aber sie sind eine schnelle und einfache Möglichkeit, Informationen zu behalten und im gesamten Programm darauf zuzugreifen.

Um eine globale zu verwenden, müssen Sie innerhalb der Funktion erklären, dass Sie diese Variable verwenden, wie folgt aus:

MyGlobal="This is a global variable" 
def MyFunction(): 
    global MyGlobal 
    MyGlobal += " and my function has changed it" 
if __name__=="__main__": 
    print MyGlobal 
    MyFunction() 
    print MyGlobal 

Nachdem dies gesagt ist, ist die übliche Art und Weise Informationen zu und von Funktionen übergeben zu bedienen Argumente und Rückgabewerte - das ist eine bessere Designmethodik, und die, die normalerweise gelehrt wird. Dies ist mehr eine Designmethode als eine Änderung an Ihrem Code. Sie schreiben Ihr Programm, indem Sie globale Variablen auf ein absolutes Minimum reduzieren.

das obige Beispiel zu nehmen, würde dies unser Code wie folgt ändern:

def MyFunction(MyArg): 
    MyArg+=" and my function has given me a new version of it" 
    return MyArg 
if __name__=="__main__": 
    MyVariable="This is a variable" 
    print MyVariable 
    MyVariable = MyFunction(MyVariable) 
    print MyVariable 

Beachten Sie, dass diese viel flexibler ist - ich habe es, wie ich oben haben können, den Wert von MyVariable zu ändern, aber ich könnte auch die gleiche Funktion verwenden, um den neuen Wert auf eine andere Variable zurückzugeben, wobei das Original intakt bleibt.

Ich hoffe, das hilft, sorry, wenn ich ein bisschen ausführlich war.

Verwandte Themen