3

我不明白脚本如何进入下一个房间,以及“引擎”和“地图”类的工作原理。这是一段摘录:

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)

我根本不明白这些部分是如何工作的。我知道类和对象实例和属性以及所有其他 OOP 东西是如何工作的,但由于某种原因,我没有得到这部分代码。主要是地图类。如果有人能解释一下,那就太棒了。

另外(这可能需要阅读练习),为什么还需要这两个类?难道你不能只用类方法来代替(即没有 self 作为参数的方法。)?例如,您可以调用 CentralCorridor.enter()。实际上,这就是我在阅读答案之前解决它的方法,并且效果很好。

抱歉,我的主要问题是 Engine 和 Map 类是如何工作的。另一件事是次要的。

提前致谢!

4

2 回答 2

7

Map对象是一个映射您的场景的类。它有一些场景保存在一个数组中。

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

制作 Map 对象时,您还可以为其提供一个开放场景,如构造函数中所示

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

Map这会在调用中创建一个start_scene包含您的开场场景的变量。

此外Map还有2种方法

# This one returns a scene based on its name or key in the scenes array
def next_scene(self, scene_name):
    return Map.scenes.get(scene_name)


# And this one  returns the opening scene which is set when you create the map.
def opening_scene(self):
    return self.next_scene(self.start_scene)

Engine似乎在控制场景何时播放以及播放什么。

# When creating an Engine object you give the map containing scenes to its constructor
def __init__(self, scene_map):
        self.scene_map = scene_map

# The method which starts playing the scenes
def play(self):

    # the opening scene from the map is selected as the current scene
    current_scene = self.scene_map.opening_scene()

     # You loop all the scenes probably, conditions of this loop are unknown because you haven't posted it entirely.
     while True:
         print "\n--------"
         # It seems the next scene name is known in the current scene
         next_scene_name = current_scene.enter()

         # It replaces current scene with the next scene from the map
         current_scene = self.scene_map.next_scene(next_scene_name)

为什么无论如何都需要有这两个类?

不是,除非根据您的任务需要

就像你说的那样,没有这样做是可能的,但是有充分的理由这样做。

这样你就可以创建 2 个独立的类,它们各自负责。当应用程序变得越来越大时,这种方式代码更具可读性。并且很容易浏览应用程序。您可以轻松更改应用程序的某些部分等。我的建议是继续练习和阅读有关 OOP 的内容,您会注意到为什么要做您看到的事情。

于 2013-07-01T22:02:53.587 回答
6

Map 类有一个场景名称字典作为键,不同类的实例作为值。要检索其中一个实例,您调用一个方法,传入一个作为场景名称的字符串。然后 Map 类返回相应类的实例。

难道你不能只用类方法来代替(即没有 self 作为参数的方法。)?例如,您可以调用 CentralCorridor.enter()。

是的,你可以。缺点是现在您已经在代码中硬编码了场景类的名称。如果您以后决定重写程序以删除某些场景或添加其他场景,则必须更改代码中硬编码名称的所有位置。如果您使用 Map 类,则只需对字典进行更改。虽然,您仍然必须消除尝试检索已删除的类实例的方法调用。或者,您可以让 next_scene() 方法处理检索已从字典中删除的场景的尝试。

类方法的另一个考虑因素是:您需要存储“状态”吗?比如,目前有多少玩家在现场。而且,您是否需要创建多个该类型的场景?

于 2013-07-01T21:49:50.617 回答