3

我对 Map 和 Engine 类如何协同工作来运行这个 Adventureland 类型的游戏感到困惑(完整代码在这里: http: //learnpythonthehardway.org/book/ex43.html)。我想我理解 Map 类中发生了什么,但我真的很困惑 Engine() 中发生了什么以及为什么需要 scene_map 变量。

class Map(object):

    scenes = {
        'central_corridor': CentralCorridor(),
        'laser_weapon_armory': LaserWeaponArmory(),
        'the_bridge': TheBridge(),
        'escape_pod': EscapePod(),
        'death': Death()
    }

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

    def next_scene(self, scene_name):
        return Map.scenes.get(scene_name)

    def opening_scene(self):
        return self.next_scene(self.start_scene)

class Engine(object):

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

    def play(self):
        current_scene = self.scene_map.opening_scene()

        while True:
            print "\n--------"
            next_scene_name = current_scene.enter()
            current_scene = self.scene_map.next_scene(next_scene_name)

a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()

感谢您的任何帮助。

4

1 回答 1

3

Engine实例scene_map是类的一个实例,Map就像全局一样a_map。实际上,a_game.scene_map与 是相同的实例a_map

因此,无论您a_map在顶层Engine.play可以做什么,代码都可以使用self.scene_map. 可能值得将所有内容输入到交互式解释器中,直到a_map定义并使用 a_map 来确保您知道它可以为您做什么。

那么,为什么Engine需要self.scene_map?为什么不能只使用 global a_map

嗯,它可以。问题是,如果你这样做了,你将无法创建两个Engine实例而不让它们争夺同一个a_map. (这与您不想在函数中使用全局变量的原因相同。对象不会添加新问题——事实上,对象的很大一部分是解决全局变量问题。)

于 2013-08-13T01:18:26.487 回答