0

Python チュートリアルに従っていますが、このクラスを理解していません。 http://learnpythonthehardway.org/book/ex43.html

next_scene メソッドがどのように機能するかを誰かに説明してもらえますか? 次のシーンに切り替わるのはなぜですか?

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)
4

4 に答える 4

0

メソッドnext_sceneでは、変数を渡しscene_nameます。

test_map = Map('central_corridor')
test_map.next_scene('the_bridge')

それを渡すとthe_bridge、クラス内の辞書をチェックし、scenes選択したシーンをそこから取得しようとします。

このgetメソッドはKeyError、無効なシーン名 (例: ) でメソッドを呼び出した場合に例外が発生しないように使用されますtest_map.next_scene('the_computer)。この場合、単に を返しNoneます。

于 2013-10-09T07:50:35.540 に答える
0

名前next_sceneは誤解を招くものです。固有の順序付けから「次の」シーンを提供するのではなく、選択したシーン、おそらく次に選択したいシーンを返します。

于 2013-10-09T07:51:32.953 に答える
0

渡されたキーワードに応じてディクショナリからシーン オブジェクトをインスタンス化し、scenesそれを返します。

次のシーンに切り替わるのはなぜですか?

次のシーンに切り替わる理由は、基本クラスでは各シーン extends がenter()functionの実行を終了した後にシーケンス内の次のシーンを指定するためです。

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()  # returns next scene key
            current_scene = self.scene_map.next_scene(next_scene_name)  # initiates next scene and sets it as `current_scene`

たとえばCentralCorridor、入力されたアクションに応じた最後のシーンは、次のシーンのキーを返します。

def enter(self):
    print "The Gothons of Planet Percal #25 have invaded your ship and destroyed"
    ...
    print "flowing around his hate filled body.  He's blocking the door to the"
    print "Armory and about to pull a weapon to blast you."

    action = raw_input("> ")

    if action == "shoot!":
        print "Quick on the draw you yank out your blaster and fire it at the Gothon."
        ...
        print "you are dead.  Then he eats you."
        return 'death'  # next scene `Death`

    elif action == "dodge!":
        print "Like a world class boxer you dodge, weave, slip and slide right"
        ...
        print "your head and eats you."
        return 'death'  # next scene `Death`

    elif action == "tell a joke":
        print "Lucky for you they made you learn Gothon insults in the academy."
        ...
        return 'laser_weapon_armory'  # next scene `LaserWeaponArmory`

    else:
        print "DOES NOT COMPUTE!"
        return 'central_corridor'  # next scene `CentralCorridor`

そして、シーケンス全体enter()は、プログラムを終了する死のシーンの関数で終了します。

def enter(self):
    print Death.quips[randint(0, len(self.quips)-1)]
    exit(1)
于 2013-10-09T07:49:39.707 に答える
0

return Map.scenes.get(scene_name)

Map.scenesクラスで定義された辞書です。それを呼び出す.get()と、指定されたキーの値が取得されます。この場合に与えられるキーはscene_name. 次に、関数はシーンのインスタンスを返します。

次のようになります。

return scenes[scene_name]

キーが存在しない場合は KeyError を発生させる代わりに、Noneが返されます。

于 2013-10-09T07:49:48.897 に答える