user6762714
user6762714

Reputation:

How do classes switch from one to another?

Take a look at this code at the bottom of this question

It's from a book on learning python, My question particularly is how the play method enables the game to switch to the next phase(class). Does it have something to do with the return statement at the bottom of every class? I was expecting more like "Death.enter()" or "Map.scenes.get['death'].enter()" as the ending statement. How does current_scene change to the next scene when it simply calls the opening_scene method in the map class which is "central_corridor". I thought it would pretty much stay on "central_corridor" all the time. Also is it even a good idea to have a scene class, what sort of code would be there?

EDIT: line of code missing for the while loop now added

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

Upvotes: 1

Views: 93

Answers (2)

martineau
martineau

Reputation: 123491

The enter() method implemented in most of the Scene subclasses—such as CentralCorridor, LaserWeaponArmory, etc—returns the name of the following scene depending on the action the person inputs when prompted.

This is used in the Engine.play() method, to determine the next scene to enter() during the each iteration of the while loop:

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

This goes on until the Death scene's enter() is called and, since it calls exit() instead of returning a next scene value as the others do, it results in the script terminating.

Upvotes: 1

parsethis
parsethis

Reputation: 8078

td;lr current_scene = self.scene_map.next_scene(next_scene_name)

Lets see what we've got here. We have a collection of scenes each are of class Scene and they all have enter methods ( we're going to use these to access the scene.

We collect these scenes in a map (of class Map). The map also jumps starts the engine for our lovely game by setting the starting scene. We shall start the game in the "corridor".

Now how are we going to connect these beautiful scenes? Let's use a while loop:

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

But how does this work? We collect the name of the next scene when the enter() method of the current scene completes.That's here next_scene_name = current_scene.enter(). then we tell our map instance to call up the next scene passing the scene name it its next_scene() method.

The while loop receive a truthy signal when there are more scenes to iterate over and so continues to bring more scenes to life. But finally it receives a falsy signal in the form of an exit(1) or the stopIteration ( because there are no more scenes to iterate over ). That were our game ends.

Upvotes: 0

Related Questions