2012-04-07 5 views
0

Arbeits Code ist hier: http://codepad.org/L0OkeHlkPython Klassen (Basic)

from sys import exit 

class Map(object): 

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

    def play(self): 
     next = self.start 

     while True: 
      print "\n---------" 
      room = getattr(self,next) 
      next = room() 

    def death(self): 
     exit(1) 

    def redroom(self): 
     prompt = raw_input("> ") 
     if "white" in prompt: 
      return "whiteroom" 
     elif "blue" in prompt: 
      return "blueroom" 
     else: 
      print "DOES NOT COMPUTE (RED ROOM)" 
      return 'death' 

    def whiteroom(self): 
     prompt = raw_input("> ") 
     if "red" in prompt: 
      return "redroom" 
     elif "blue" in prompt: 
      return "blueroom" 
     else: 
      print "DOES NOT COMPUTE (WHITE ROOM)" 
      return 'death' 

    def blueroom(self): 
     prompt = raw_input("> ") 
     if "white" in prompt: 
      return "whiteroom" 
     elif "red" in prompt: 
      return "redroom" 
     else: 
      print "DOES NOT COMPUTE (BLUE ROOM)" 
      return 'death' 

class Engine(object): 
    pass 

x = Map("redroom") 
x.play() 

Die oben genannten Arbeiten. Aber nur weil ich alles in einer Klasse mache. Ich möchte die Spiel- und Todesfunktionen übernehmen und sie in eine eigene Klasse bringen.

Mein Problem kommt von zwei Orten. Wie bekomme ich die Engine-Klasse, um die Funktionen in der Map-Klasse aufzurufen, damit das Spiel funktioniert? Woher weiß ich, was in der Map/Engine-Klasse initialisiert werden soll? Ich habe verstanden, dass ich etwas initialisieren soll, aber ich habe keine Ahnung, wie ich damit zurechtkommen soll. Was sollte mein erster Gedanke bei der Entscheidung sein, was zu initialisieren ist?

nicht funktionierenden Code (mein bester Versuch): http://codepad.org/ELlaHQiB

from sys import exit 

class Map(object): 

    def redroom(self): 
     prompt = raw_input("> ") 
     if "white" in prompt: 
      return "whiteroom" 
     elif "blue" in prompt: 
      return "blueroom" 
     else: 
      print "DOES NOT COMPUTE (RED ROOM)" 
      return 'death' 

    def whiteroom(self): 
     prompt = raw_input("> ") 
     if "red" in prompt: 
      return "redroom" 
     elif "blue" in prompt: 
      return "blueroom" 
     else: 
      print "DOES NOT COMPUTE (WHITE ROOM)" 
      return 'death' 

    def blueroom(self): 
     prompt = raw_input("> ") 
     if "white" in prompt: 
      return "whiteroom" 
     elif "red" in prompt: 
      return "redroom" 
     else: 
      print "DOES NOT COMPUTE (BLUE ROOM)" 
      return 'death' 

class Engine(object): 
    def __init__(self, start): 
     self.start = start 

    def play(self): 
     next = self.start 

     while True: 
      print "\n---------" 
      room = getattr(self,next) 
      next = room() 

    def death(self): 
     exit(1) 

x = Engine("redroom") 
x.play() 

Auch ich bin nicht sicher, der Play-Funktion. Es funktioniert aber nur, weil ich es aus dem Tutorial habe, das ich gelesen habe. Was ist der Zweck der nächsten Variable, die selbst wird.start und dann in der while-Schleife room() werden?

+1

Ich denke, Sie können versuchen, erstellen Sie einen Klassenaufruf 'Room', und entweder haben sie als Unterklasse' Redroom', 'Blueroom'? Die 'play'-Funktion kann in Ihrer' Room'-Klasse implementiert werden, sodass sie für alle verfügbar ist. Schließlich können Sie alle "Room" -Objekte in eine Karte einfügen. – George

+2

Warum willst du hier überhaupt Unterricht? Weit davon entfernt, mehr zu wollen, sollten Sie sich fragen, ob Sie welche brauchen. Sie machen keine Datenkapselung, was der Hauptgrund für das Ausführen von Klassen in Python ist. –

+0

'getattr (self, next)' sucht nach einem Attribut von 'x' namens' redroom' und es hat kein solches Attribut. Es ist schwer herauszufinden, was du hier machen willst, aber ich bezweifle, dass du 'getattr' benutzen musst. Es erscheint auch seltsam, "Räume" als Methoden von "Map" darzustellen, und es ist wahrscheinlich eine gute Idee, die Variablen "next" nicht zu benennen, da dies der Name einer wichtigen eingebauten Funktion ist. – James

Antwort

0

Das ist, was ich tun würde.

class Engine(object): 
    def __init__(self,rooms): 
     self.rooms = rooms 
     self.current = 0 

    def next(self): 
     self.rooms[self.current]() 
     self.current += 1 
     if len(self.rooms) == self.current: 
      self.current = 0 
      # or whatever logic you want. 

m = Map() 
rooms = [m.redroom, m.whiteroom, m.blueroom] 
e = Engines(rooms) 

e.next() # should call redroom of class Map 
e.next() # should call whiteroon etc