2017-11-29 4 views
1

Ich möchte ein statisches Klassenattribut number_of_players halten, das dem Spiel mitteilt, wie viele Spieler sich entschieden haben zu spielen, das in meinen Klassen geändert werden kann.Lokale Variable, auf die vor der Zuweisung verwiesen wird; Statisches Klassenattribut für die Anzahl der Spieler

Ich habe meine Eltern-Klasse:

class SceneBase: 
    number_of_players = None 
#more code 

jedoch in der Kind-Klasse, wenn ich versuche, die NUMBER_OF_PLAYERS zu ändern, ich bin die lokale Variable immer vor assingment Fehler verwiesen wird.

class ChooseNumberOfPlayersScene(SceneBase): 

    def change_to_one_player_mode(self): 

     number_of_players = 1 
     print("The number of players is now" + number_of_players) 

Ich habe versucht, auch als selbst Attribut die Anzahl der Spieler Initialisierung

class SceneBase: 

    def __init__(self): 

     self.number_of_players = None 

Aber wenn ich versuche ausgeführt, dass dies mit:

class ChooseNumberOfPlayersScene(SceneBase): 

     def change_to_one_player_mode(self): 

      self.number_of_players = 1 
      print("The number of players is now" + self.number_of_players) 

self.number_of_players nie und kehrt ändert Keine

Ich bin verwirrt, wie man meine Anzahl der Spieler ändert. Gibt es eine Möglichkeit, dass ich es von allen Klassen modifizieren kann?

+2

'SceneBase.number_of_players' Wenn Sie ein Klassenmitgliedsattribut machen, dann müssen Sie darauf zugreifen wie ein – user1767754

+0

Es klingt, als ob Sie eine Instanzvariable dafür verwenden sollten. Setzen Sie 'self.number_of_players', um den Standardwert für eine bestimmte Klasseninstanz zu überschreiben. –

+0

@ user1767754 Ich glaube nicht, dass die Absicht war, die Basisklasse zu modifizieren. –

Antwort

0

Sie können entweder die Anzahl der Spieler direkt an die nächste Szene übergeben oder sie vom Szenenmanager an die nächste Szene übertragen (möglicherweise in einem persistent_data Wörterbuch, das an alle Szenen übergeben wird).

class ChooseNumberOfPlayersScene: 

    def __init__(self): 
     self.next_scene = None 
     self.number_of_players = 1 

    def handle_event(self, event): 
     if event.type == pg.KEYDOWN: 
      if event.key == pg.K_n: 
       # Create the next scene instance and pass 
       # the number_of_players to the game scene. 
       self.next_scene = GameScene(self.number_of_players) 
      elif event.key == pg.K_UP: 
       self.number_of_players += 1 

class GameScene: 

    def __init__(self, number_of_players): 
     self.number_of_players = number_of_players 

Die SceneManager schaltet die Szene if scene.next_scene is not None.

Alternativ, ich denke, es wäre in Ordnung, nur eine globale Variable hier zu verwenden, wenn es nur in der ChooseNumberOfPlayersScene geändert wird.

+0

BTW, bitte upvote und akzeptiere hilfreiche Fragen, indem du auf das Häkchen klickst (das gibt dir 2 Rufpunkte). – skrx

+0

Ein Hinweis zu globalen Variablen: Sie sollten sie normalerweise nicht verwenden, da sie Code schwieriger zu verstehen, zu debuggen und zu pflegen machen. In diesem Fall, da es nur durch eine Funktion/Methode modifiziert wurde, könnten Sie eine verwenden, jedoch würde ich persönlich eine der ersten zwei Optionen wählen. Sei vorsichtig und verwende absolut keine Globals für jedes Problem. – skrx

Verwandte Themen