2012-04-07 2 views
0

작동 코드가 여기에 있습니다 : http://codepad.org/L0OkeHlk파이썬 클래스 (기본)

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

위의 작품. 하지만 내가 한 클래스에서 모든 것을하고 있기 때문에. 나는 놀이와 죽음의 기능을 가지고 그들 자신의 수업에 넣고 싶습니다.

내 문제는 두 곳에서 발생합니다. 게임을 작동시키기 위해 맵 클래스의 함수를 호출하도록 엔진 클래스를 얻으려면 어떻게해야합니까? 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

왜 여기서 수업을 원하십니까? 더 많은 것을 원하기는 커녕, 당신이 필요로하는지 의문을 제기해야합니다. 어떤 데이터 캡슐화도하지 않고 있습니다. 이것이 파이썬에서 클래스를 수행하는 주된 이유입니다. –

+0

'getattr (self, next)'는'redroom'이라 불리는'x'의 속성을 찾고 있으며, 그런 속성을 가지고 있지 않습니다. 여기에서하려고하는 것을 해결하기가 어렵지만'getattr'을 사용할 필요가 있는지 의심 스럽습니다. 또한 "rooms"을 "Map"의 메소드로 표현하는 것이 이상하게 보입니다. 중요한 내장 함수의 이름 인'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