2016-12-18 18 views
1

この質問の末尾にあるこのコードを見てくださいクラスはどのように切り替わりますか?

これは、Pythonの学習に関する本です。私の質問は、特にplayメソッドがゲームを次の段階(クラス)に切り替える方法を示しています。すべてのクラスの一番下にあるreturn文と関係がありますか?私は「Death.enter()」や「Map.scenes.get ['death']。enter()」のように終わりのステートメントを期待していました。 current_sceneは、単に "central_corridor"であるマップクラスのopening_sceneメソッドを呼び出すと、次のシーンにどのように変化しますか?私はいつも "central_corridor"にとどまると思っていました。また、シーンクラスを持つことも良いアイデアですか、どのようなコードがそこにあるでしょうか?

EDIT:whileループのために不足しているコードの行は、現在Sceneサブクラス、例えばCentralCorridorLaserWeaponArmory、ETC-戻り、次の名前としての最もに実装enter()方法は

from sys import exit 
from random import randint 


class Scene(object): #It's python3 but I'm used to this 

    def enter(self): 
     print("This scene is not yet configured." + 
       "Subclass it and implement enter()") 
     exit(1) 


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', '-' * 20) 
      next_scene_name = current_scene.enter() 
      current_scene = self.scene_map.next_scene(next_scene_name) 

class Death(Scene): 
    quips = [ 
     "You died. You kinda suck at this.", 
     "Your mom would be so proud...if she were smarter", 
     "Such a loser.", 
     "I have a small puppy that's better at this" 
    ] 

    def enter(self): 
     print(Death.quips[randint(0, len(self.quips)-1)]) 
     exit(1) 

class CentralCorridor(Scene): 

    def enter(self): 
     print(""" 
     The Gothons of Planet Percal #25 have invaded your ship and destroyed 
     your entire crew. You are the last surviving member and the last 
     mission is to get the neutron destruct bomb from the Weapon Armory 
     put it in the bridge, and blow the ship up after getting into 
     an escape pod. 
     \n 
     You're running down the central corridor to the Weapons Armory when 
     a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown 
     costume flowing around his hate filled body. He's blocking the door to 
     the armory and about to pull out a weapon to blast you 
     """) 

     action = input(">> ") 

     if action == "shoot!": 
      print(""" 
      Quick on the draw you yank out your blast and fire it at the Gothon. 
      His clown costume is flowing and moving around his body, which throws 
      off your aim. Your laser hits his costume but misses him entirely. 
      This completely ruins his brand new costume his mother bought for him, 
      which makes him fly into rage and blast you repeatedly in the face 
      until you are dead, then he eats you 
      """) 
      return('death') 

     elif action == "dodge!": 
      print(""" 
      Like a world clas boxer, you dodge, weave, slip and slide to the right 
      as the Gothon's blaster cranks a laser past your head. 
      In the middle of your artful dodge yor foot slips and you bang your 
      head on the metal wall and pass out. You wake up shortly after only 
      to die as the Gothon stomps on your head and eats you. 
      """) 
      return('death') 

     elif action == 'tell a joke': 
      print(""" 
      Luck for you, they made you learn Gothn insults in the academy. 
      You tell one Gothon joke you know: 
      Lbhe zbgure vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgf nebhaq 
      the Gothon stops, tries not to laugh, then bursts out laughing and can't move 
      while he's laughing you run up and shoot him square in the head 
      putting him down, then jump through the Weapon Armory door 
      """) 
      return('laser_weapon_armory') 

     else: 
      print("DOES NOT COMPUTE") 
      return('central_corridor') 

class LaserWeaponArmory(Scene): 

    def enter(self): 
     print(""" 
     You do a dive roll into the Weapon Armory, crouch and scan the room 
     for more Gothons that might be hiding. It's dead quiet, too quiet. 
     You stand up and run to the far side of the room and find the neutron 
     bomb in its container. There's a keypad lock on the box and you need to 
     get the bomb out. If you get the code wrong 10 times then the lock closes 
     forever and you can't get the bomb. The code is 3 digits. 
     """) 
     code = "%d%d%d"%(randint(1,9), randint(1,9), randint(1,9)) 
     int(code) 
     guess = int(input("[keypad]>> ")) 
     guesses = 0 

     while guess != code and guesses < 10: 
      print("BZZZEDDD!!") 
      guess += 1 
      guess = int(input("[keypad]>> ")) 

     if guess == code: 
      print(""" 
      The container clicks open and the seal breaks, letting gas out 
      You grab the neutron bomb and run as fast as you can to the bridge 
      where you must place it in the right spot 
      """) 
      return('the_bridge') 
     else: 
      print(""" 
      The lock buzzes one last time and then you hear a sickening melting 
      sound as the mechanism is fused together. You decide to sit there, 
      and finally the Gothons blow up the ship from their ship and you died 
      """) 
      return('death') 

class TheBridge(Scene): 

    def enter(self): 
     print(""" 
     You burst onto the bridge with the neutron destruct bomb under your arm 
     and surprise 5 Gothons who are trying to take control of the ship. Each 
     of them has an even uglier clown costume than the last. They haven't pulled 
     out their weapons yet, as they see the active bomb under your hand and don't 
     want to set it off. 
     """) 

     action = input(">> ") 

     if action == "throw the bomb": 
      print(""" 
      In a panic you throw the bomb at a group of Gothons and make a leap 
      for the door. Right as you drop it a Gothon shoots you right in the 
      back killing you. As you die you see another Gothon frantically try 
      to disarm the bomb. You die knowing that they will probably blow up 
      when the bomb goes off 
      """) 
      return('death') 

     elif action == "slowly place the bomb": 
      print(""" 
      You point your blaster at the bomb under your arm and the Gothons put 
      their hands up and start to sweat. You inch backwards to the door, 
      open it, and then carefully place the bomb on the floor, pointing your 
      blaster at it. You then jump back through the door, punch the close 
      button and blast the lock so the Gothons can't get out. Now that the 
      bomb is placed you run to the escape pod to get off this tin can 
      """) 
      return('escape_pod') 
     else: 
      print('DOES NOT COMPUTE') 
      return('the_bridge') 

class EscapePod(Scene): 

    def enter(self): 
     print(""" 
     You rush through the shop desperately trying to make it to the escape pod 
     before the whole ship explodes. It seems like harldy any Gothons are on the 
     ship, so your run is clear of interference You get to the chamber with the 
     escape pods, and now need to pick one to take. There's 5 pods which one do 
     you take? 
     """) 

     good_pod = randint(1,5) 
     guess = int(input("Pod Number>> ")) 

     if guess == good_pod: 
      print(""" 
      You jump into pod %d and hit the eject button. 
      The pod escapes out into the void of space, then 
      implodes as the hull ruptures, crushing your body 
      into jam jelly 
      """%guess) 
      return('death') 

     else: 
      print(""" 
      You jump into pod %d and hit the ejet button and the pod 
      easily slides out into space heading to the planet below. 
      As it flies to the planet, you look back and see your ship 
      implode and then explode like a bright star, taking out the 
      Gothon ship at the same time. 
           YOOUU WON!! 
      """%guess) 
      return('finished') 



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


a_map = Map('central_corridor') 
a_game = Engine(a_map) 
a_game.play() 
+0

問題を指摘できますか?私はすべてのコードを実行して、あなたのためにそれをデバッグするつもりはありません。 –

答えて

1

を添加シーンが指示されたときに人が入力するアクションに依存します。

while True: 
    print('\n', '-' * 20) 
    next_scene_name = current_scene.enter() 
    current_scene = self.scene_map.next_scene(next_scene_name) 

これは、それが呼び出すので、Deathシーンのenter()は、と呼ばれるまでになります:

この

whileループの各反復中 enter()に次のシーンを決定するために、 Engine.play()方法で使用されています exit()他のシーンの値と同じように次のシーン値を返す代わりに、スクリプトが終了します。

0

TD; current_scene = self.scene_map.next_scene(next_scene_name)

LR私たちがここに持っているものを確認することができます。

これらのシーンを(クラスマップの)マップで収集します。また、これらのシーンをマップに入力します。ジャンプの開始場面を設定することによって、私たちの素敵なゲームエンジンを始動する私たちは、「廊下」でゲームを開始するものと

が今どのように我々はこれらの美しいシーンを接続しようとしているのは、whileループを使用してみましょう:。。?

while True: 
     print('\n', '-' * 20) 
     next_scene_name = current_scene.enter() 
     current_scene = self.scene_map.next_scene(next_scene_name) 

これはどのように機能するのですか?現時点のenter()メソッドこれはここにあるnext_scene_name = current_scene.enter()です。 次にマップインスタンスに、そのシーン名を渡す次のシーンを呼び出すように指示します。next_scene()メソッド。

whileループは、繰り返し処理するシーンが多い場合にtruthyシグナルを受信し、より多くのシーンを生き生きとさせ続けます。しかし最後に、exit(1)またはstopIterationの形式での偽の信号を受信します(それ以上のシーンが繰り返されないため)。それが私たちのゲーム終了でした。

関連する問題