【问题标题】:Confused about classes in Learn Python the Hard Way ex43?对 Learn Python the Hard Way ex43 中的课程感到困惑?
【发布时间】:2013-08-13 00:56:33
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • Engine 类只是一种使用给定初始场景(地图)运行游戏的机制。所以一个游戏是通过创建一个Engine类的实例和一个起始映射a_game = Engine(a_map))来启动的,然后通过执行play方法(a_game.play()。换句话说,Engine封装了执行游戏。
  • @mbratch:嗯,地图不是初始场景,它是所有场景的集合,以及它们的连接方式。但除此之外,很好的描述。
  • @abarnert,确实如此,但 Map 的实例是使用初始场景创建的,例如“central_corridor”。这就是我所指的。
  • 应该注意这就像“玩具代码”。尽管它说明了您可以用来构建现实世界游戏的概念,但代码更多的是说明 Python 对象,不一定是最好或最直观的设计。也就是说,我自己从对这段代码的逆向工程中学到了很多东西。a map() 类的名称不恰当。它通过用户最终可以进入的“位置”列表以及在游戏流程中移动用户的方法来驱动游戏流程。引擎和地图一起工作,通过简单的故事构建流程的主要症结。但是...
  • 游戏不一定要这样设计。在良好的 OO 设计中,您会考虑将来可能以何种方式重用什么,并相应地划分您的代码。理论上,可以设计不同的 map()s 并将其连接到同一个引擎,但引擎做的很少,而且 map 的设计更多是围绕封装然后重用。这更像是一个对象语法的演示,然后是 OO 设计,但对于学生来说,这是一段有用的代码,可以从中挑选和学习。

标签: python class oop


【解决方案1】:

Engine 实例的 scene_mapMap 类的实例,就像全局 a_map 一样。事实上,a_game.scene_mapa_map相同的 实例。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多