<p>我最近做了lpthw教程。Zed所做的是创建第三个类来映射游戏中的级别,这样就可以在其他类被定义之后实例化它们。这将修复“未定义”错误。你知道吗</p>
<p>但另一个问题是,您正在最后创建一个引擎对象:</p>
<pre><code>game = Engine()
</code></pre>
<p>然后在初始化MainCorridor类时,创建一个单独的引擎对象:</p>
<pre><code>class MainCorridor(object):
def __init__(self):
self.engine = Engine()
</code></pre>
<p>解决方案是仅在MainCorridor类中创建engine类:</p>
<pre><code>class Engine(object):
def test(self):
print "Calling Engine() from MainCorridor()"
class MainCorridor(object):
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.test()
class Map(object):
location_dict = {
'main_corridor': MainCorridor(),
}
def goto(self, location):
map = self.get_location(location)
return map.start()
def get_location(self, location):
return self.location_dict[location]
game = Map()
game.goto('main_corridor')
</code></pre>
<p>但是这样,您在location目录中放置的每个location实例都将有自己唯一的引擎对象。你知道吗</p>
<p>为每个位置指定单个引擎对象可以做的是将'self'从引擎传递到map类,并让map类通过将相同的引擎对象传递到列表中的每个位置来实例化location\u dict:</p>
<pre><code>class Engine(object):
def __init__(self):
self.map = Map(self)
def test(self):
print "Calling Engine() from MainCorridor()"
class MainCorridor(object):
def __init__(self, engine):
self.engine = engine
def start(self):
self.engine.test()
class Map(object):
def __init__(self, engine):
self.location_dict = {
'main_corridor': MainCorridor(engine),
}
def goto(self, location):
map = self.get_location(location)
return map.start()
def get_location(self, location):
return self.location_dict[location]
game = Engine()
game.map.goto('main_corridor')
</code></pre>