2012-04-07 58 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() 

上述作品。但仅仅是因为我在一堂课中做了所有事情。我想要玩耍和死亡的功能,并把它们放在他们自己的班里。

我的问题来自两个地方。我如何让Engine类调用地图类中的函数来使游戏工作?我怎么知道在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

我想你可以尝试创建一个类调用'房间',并且要么将它们作为子类'redroom','blueroom'? 'play'函数可以在'Room'类中实现,所以它们都可以使用。最后,您可以将所有“房间”对象放入地图中。 – George 2012-04-07 20:26:52

+2

为什么你想在这里上课呢?除了想要更多,你应该怀疑你是否需要任何。你没有做任何数据封装,这是在Python中做类的主要原因。 – 2012-04-07 20:50:40

+0

'getattr(self,next)'正在寻找叫做'redroom'的'x'属性,并且它没有这样的属性。很难弄清楚你想在这里做什么,但是我怀疑你需要使用'getattr'。将“房间”表示为“地图”的方法似乎也很奇怪,并且避免命名变量“next”可能是一个好主意,因为这是重要的内置函数的名称。 – James 2012-04-07 21:33:32

回答

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