2012-04-07 16 views
0

作業するコードはここにある:http://codepad.org/L0OkeHlkPythonのクラス(基本)

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() 

上記作品。しかし、私は1つのクラスですべてをやっているからです。私は、遊びと死の機能を持ち、自分たちのクラスに入れたいと思っています。

私の問題は2か所から発生します。ゲームを動作させるために、マップクラスの関数を呼び出すためにエンジンクラスを取得するにはどうすればよいですか? Map/Engineクラスで何を初期化するかを知るにはどうすればよいですか?私は何かを初期化するはずですが、どうやってそれを考え出すのか分かりません。何を初期化するかを決める際の最初の考え方は何ですか?

非機能コード(私の最高の試み):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() 

また、私は、再生機能のわかりませんよ。それは私が読んでいたチュートリアルから得たものだからです。次の変数がself.startになり、whileループでroom()になる目的は何ですか?

+1

私はあなたがクラスルーム 'Room'を作成しようとしていて、それらを' redroom'、 'blueroom'のサブクラスとして使うことができますか? 'play'関数はあなたの' Room'クラスに実装することができるので、それらはすべて利用可能です。最後に、すべての 'Room'オブジェクトをマップに入れることができます。 – George

+2

なぜここに授業をしたいですか?より多くのことを望むのではなく、必要があるかどうか疑問に思うべきです。データのカプセル化は行われていません。これがPythonでクラスを行う主な理由です。 –

+0

'getattr(self、next)'は 'redroom'という名前の' x'の属性を探していますが、そのような属性はありません。あなたがここで何をしようとしているのか分かりにくいですが、 'getattr'を使う必要があるかどうかは疑問です。また、 "部屋"を "マップ"のメソッドとして表現することは奇妙に思えます。重要な組み込み関数の名前である変数nextの名前を避けることはおそらく良い考えです。 – James

答えて

0

これは私がやることです。

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 
関連する問題