I'm confused on how the Map and Engine classes together work together to run this Adventureland type game (full code here: http://learnpythonthehardway.org/book/ex43.html). I think I understand what is happening in the Map class, but I'm really confused about what is happening in Engine() and why the scene_map variable is needed.
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()
Thank you for any help.
The
Engine
instance'sscene_map
is an instance of theMap
class, just as the globala_map
is. In fact,a_game.scene_map
is the same instance asa_map
.So, whatever you could do with
a_map
at the top level, theEngine.play
code can do withself.scene_map
. It may be worth typing everything into the interactive interpreter up to thea_map
definition and playing around with a_map to make sure you know what exactly it can do for you.So, why does
Engine
needself.scene_map
? Why can't it just use the globala_map
?Well, it could. The problem is that if you did that, you wouldn't be able to create two
Engine
instances without them fighting over the samea_map
. (This is the same reason you don't want to use global variables in functions. Objects don't add a new problem—in fact, a big part of what objects are about is solving the global-variables problem.)