我不明白剧本是如何进入下一个房间的,而且通常是"引擎"和"地图"班级工作。这是一个摘录:
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的东西是如何工作的,但由于某种原因,我不能得到这部分代码。主要是Map类。如果有人能够解释它会很棒。
另外(这可能需要阅读练习),为什么还需要这两个课程呢?你不能用类方法来代替它(即没有自我作为参数的方法)。然后你可以调用,例如,CentralCorridor.enter()。事实上,这就是我在阅读答案之前解决的问题,而且效果很好。
抱歉,我的主要问题是引擎和地图类的工作原理。另一件事是次要的。
提前致谢!
答案 0 :(得分: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
有两种方法
# 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,您会注意到为什么你做了你看到的事情。
答案 1 :(得分:6)
Map类具有作为键的场景名称字典,以及作为值的不同类的实例。要检索其中一个实例,请调用传入字符串的方法,该字符串是场景名称。然后,Map类返回相应类的实例。
你不能用类方法代替它(即方法 没有自我作为一个参数。)?然后你可以打电话,例如, CentralCorridor.enter()。
是的,你可以。缺点是现在您已经在代码中硬编码了场景类的名称。如果您以后决定重写程序以删除某些场景或添加其他场景,则必须更改代码中硬编码名称的所有位置。如果使用Map类,则只需对字典进行更改。虽然,您仍然必须消除尝试检索已删除的类实例的方法调用。或者,您可以使用next_scene()方法处理尝试检索已从字典中删除的场景。
使用类方法的另一个考虑因素是:您需要存储“状态”吗?比如,目前有多少玩家在场。而且,您需要创建多个这种类型的场景吗?