2016-09-21 4 views
1

Ich experimentiere gerade mit Python und programmiere ein kleines Text-Abenteuer. In meinem Spiel hat der Spieler bestimmte Eigenschaften wie HP, Angriffsschaden und Inventar-Slots für Gegenstände. Ich möchte diese Eigenschaften von überall in meinem Code aufrufen können. Dafür habe ich eine Funktion, die drei Werte erhält:Programmierung einer Funktion, die Werte in Python speichert und zurückgibt

„bearbeiten“: angeben, ob eine Variable sollte

„info_id“ bearbeitet werden: Sie bestimmen, welche Variable sollte

„Wert“ aufgerufen werden: der neue Wert für die Variable

Dies ist, wie es in meinem Code aussieht:

def player_info(edit, info_id, value): 

    if edit == 1: 
    ##function wants to edit value 
     if info_id == 1: 
      player_hp = value 
      print ("Assigned hp to: ", player_hp) 
      ##the "prints" are just to check if the asignments work -> they do 
      return player_hp 

     elif info_id == 2: 
      player_attack = value 
      print ("Assigned attack to: ", player_attack) 
      return player_attack 
     elif info_id == 3: 
      item_1 = value 
      return item_1 
     elif info_id == 4: 
      item_2 = value 
      return item_2 
     elif info_id == 5: 
      item_3 = value 

    elif edit == 0: 
    ##function wants to retrieve value 
     if info_id == 1: 
      return player_hp 
     elif info_id == 2: 
      return player_attack 
     elif info_id == 3: 
      return item_1 
     elif info_id == 4: 
      return item_2 
     elif info_id == 5: 
      return item_3 

es gibt tatsächlich 10 Artikel Slots (geht bis info_i d == 13) aber sie sind trotzdem alle gleich.

definiere ich alle Variablen am Anfang meines Code:

player_info(1,1,20) 
    player_info(1,2,5) 
    n=3 
    while n<=13: 
     player_info(1,n,0) 
     n=n+1 
##items are not fully implemented yet so I define the item slots as 0 

Die Definition funktioniert, ich wegen der Kontrolle „drucken“ sagen kann ich im Code implementiert. Wenn ich eine Variable, z. die Gesundheit wie folgt aus:

player_info(0,1,0) 

Ich erhalte eine Fehlermeldung:

local variable 'player_hp' referenced before assignment 

Ist die Funktion nicht die Variable speichern richtig? Oder was ist das Problem?

Gibt es eine bessere Möglichkeit, Variablen zu speichern? Sind globale Variablen in diesem Fall der richtige Weg?

Danke für die Hilfe!

+1

Bitte formatieren Sie Ihren Code. Die Einrückung ist ein Durcheinander –

+1

Ihre Funktion erstellt lokale Variablen mit dem Namen 'player_hp', etc, es ändert nicht die globalen Variablen mit dem gleichen Namen. Sie könnten das Schlüsselwort 'global' verwenden, damit die Funktion die globalen Variablen ändert, aber es wäre _much_ besser, eine Player-Klasse zu erstellen und eine Instanz dieser Klasse zum Speichern der Player-Informationen zu verwenden. –

Antwort

0

Sie fragte: "Ist die Funktion Speichern Sie die Variable nicht richtig? "

Im Allgemeinen Python-Funktionen speichern ihren Zustand nicht. Die Ausnahme-Funktionen, die die yield Anweisung verwenden ist. Wenn Sie eine Funktion wie diese

def save_data(data): 
    storage = data 

und nennen Sie es wie diese

schreiben

Sie können den Wert storage später nicht abrufen Wenn Sie in Python Daten speichern und später abrufen müssen, verwenden Sie normalerweise classes.

Python classes ermöglicht es Ihnen, Dinge wie diese tun:

class PlayerData(object): 
    def __init__(self, hp=0, damage=0): 
     self.hp = hp 
     self.damage = damage 
     self.inventory = list() 
     self.max_inventory = 10 

    def add_item(self, item): 
     if len(self.inventory) < self.max_inventory: 
      self.inventory.append(item) 

    def hit(self, damage): 
     self.hp -= damage 
     if self.hp < 0: 
      self.hp = 0 

    def attack(self, other): 
     other.hit(self.damage) 

if __name__ == '__main__': 
    player1 = PlayerData(20, 5) 
    player2 = PlayerData(20, 5) 
    player1.attack(player2) 
    print player2.hp 
    player1.add_item('sword') 
    player1.add_item('shield') 
    print player1.inventory 

Ausgabe

15 
['sword', 'shield'] 

Das ist wirklich nur an der Oberfläche kratzt, wie classes zu verwenden. In einer vollständigeren Implementierung verfügen Sie möglicherweise über eine Basisklasse Item. Dann könnten Sie Sword und Shield Klassen erstellen, die von Item erben.

+0

Danke für die tollen Beispiele! Ich werde mehr in die Klassen schauen, sie sind großartig! –

1

Zunächst wird Ihr Fehler verursacht, weil eine Variable abgerufen wird, die nicht zugewiesen ist - das funktioniert einfach nicht. Wenn Sie player_hp bearbeiten, wird es nirgendwo gespeichert. Sie geben es an die Funktion zurück, die es aufgerufen hat, und weisen es nichts zu. Es geht einfach verloren.

Zweitens, sollten Sie wirklich Einzug mit 4 Leerzeichen (oder Tabs) - es ist viel lesbarer als 2 Leerzeichen. Nicht nur für Sie, sondern auch für alle, die versuchen, zu helfen.

Und schließlich wäre der richtige Weg, um über Klassen zu lernen. Globale Variablen sollten niemals in Python verwendet werden, nur in speziellen Fällen oder wenn Sie gerade lernen, aber Sie sollten einfach in die Klasse springen.

Sie sollten etwas schaffen wie

class Player: 

    def __init__(self): 
     self.hp = 20 # or another starting hp 
     self.attack = 3 # or another starting attack 
     self.inventory = [] 

Dann können Sie nur eine Instanz von Klasse Spieler erstellen und an die Funktionen übergeben, wo es relevant ist

player1 = Player() 
print(player1.hp) # Prints out player's hp 
player1.hp -= 5 # Remove 5 hp from the player. Tip: Use method to do this so that it can check if it reaches 0 or max etc. 
player1.inventory.append("axe") 
print(player1.inventory[0]) # Prints out axe, learn about lists, or use dictionary, or another class if you want this not to be indexed like a list 
Verwandte Themen