“笨办法”学Python3--习题43 基本的面向对象的分析和设计

目录

《哥顿人》游戏 

dedent 


《哥顿人》游戏 

#coding:utf-8
from sys import exit
from random import randint
from textwrap import dedent
class Scene(object):
    def enter(self):
        print("this scene is not yet configured")
        print("subclass it and implement enter().")
        exit(1)
class Engine(object):
    def __init__(self,scene_map):   #scene_map是Map类的
        self.scene_map = scene_map
    def play(self):
        current_scene = self.scene_map.opening_scene()
        last_scene = self.scene_map.next_scene('finished')
        while current_scene!=last_scene:                    #返回的都是场景的类
            next_scene_name = current_scene.enter()         #返回的都是场景的类对应的key
            current_scene = self.scene_map.next_scene(next_scene_name)
        current_scene.enter()
class Death(Scene):
    quips = ["你死了","你在这有点糟糕","干得漂亮,你死了,愚蠢的人类","失败者","我有只小狗很擅长这个"]
    def enter(self):
        print (Death.quips[randint(0,len(self.quips)-1)])
        exit(1)
class CentralCorridor(Scene):
    def enter(self):
        print (dedent("""
        来自Percal25号行星的哥顿人入侵并破坏了你的飞船
        你的全体船员已经阵亡,你是最后的幸存者
        任务是从武器库中拿到中子自毁炸弹
        把它放在舰桥上,在你进入一个。。后炸毁飞船
        逃生仓

        你正奔跑在中央走廊到武器库的路上
        这时一个哥顿人跳出来,红皮肤,黑牙齿,邪恶的服装
        怨恨充斥着他的身体,他正在挡在武器库的门外,好像正准备扔出炸弹炸死你
        """))

        action =input("> ")

        if action == "shoot!":
            print (dedent("""
            快速拔出你的枪并朝哥顿人开火
            他灵活的移动让你失去了目标,你的激光枪击中了他的服装,这
            让他整个燃烧起来"
            这让他非常愤怒,不停的揍你的脸,直到
            你死了,然后他吃了你
            """))
            return ("death")
        elif action == "dodge!":
            print (dedent("""
            像一个世界级拳击手,你躲闪
            哥顿人的枪射穿了你的头,然后把你吃了
            """))
            return ("death")

        elif action == "tell a joke":
            print (dedent("""
            哥顿人喜欢听笑话
            你给他讲了个非常搞笑的笑话,趁他不注意,你爆了他的头
            穿过了武器库的门
            """))
            return ("laser_weapon_armory")
        else:
            print ("别想了")
            return ('central_corridor')
class LaserWeaponArmory(Scene):

    def enter(self):
        print (dedent("""
        你打了个洞进入武器库
        这里死静死静的,好像埋伏着好多哥顿人
        你发现了中子炸弹,但是它被密码锁锁着
        你需要代码才能打开
        如果输错10次,密码锁将永远锁着
        提示:代码是3个数字
        """))
        code = f"{randint(1,9)}{randint(1,9)}{randint(1,9)}"
        guess = input("[keypad]> ")
        guesses = 0
        while guess != code and guesses < 10:
            print ("BZZZZEDDD!")
            guesses += 1
            guess = input("[keypad]> ")

        if guess == code:
            print (dedent("""
            锁打开了,飘荡出白色的气体
            你带着中子弹跑得越来越快
            你必须把中子弹放在舰桥正确的位置
            """))
            return ("the_bridge")
        else:
            print (dedent("""
            你最后一次听到了滴滴声
            锁永久锁定了
            你决定静静的坐着,最终哥顿人炸掉了飞船,你挂了
            """))
            return ("death")
class TheBridge(Scene):
    def enter(self):
        print (dedent("""
        你带着中子弹突然出现在舰桥
        惊动了5个哥顿人
        他们正试图控制飞船,他们每个人都穿着一套丑陋的服装
        他们还没有拿出武器,因为他们看到你手上正拿着一个已经启动的炸弹,他们不想看着它爆炸
        """))
        action = input("> ")
        if action == "throw the bomb":
            print (dedent("""
            恐慌中,你把炸弹扔向了哥顿人
            这时一个哥顿人从背后把你射杀,你倒地的时候看见一个哥顿人正在解除炸弹
            """))
            return ("death")

        elif action == "slowly place the bomb":
            print (dedent("""
            你指着手中的炸弹,哥顿人被吓到了,他们举起手开始惊慌,
            你慢慢地移动到门口,小心的把炸弹放到地上
            你把门锁住,哥顿人出不来。炸弹放置好了,你跑向逃生仓
            """))
            return ("escape_pod")

        else:
            print( "DOES NOT COMPUTE")
            return ("the_bridge")
class EscapePod(Scene):
    def enter(self):
        print (dedent("""
        你冲向逃生仓,争取整个船爆炸前,
        似乎船上没有其他哥顿人,你一路很顺利
        你来到逃生仓,这里有5个仓位,你要选择一个
        你选择哪一个?
        """))
        good_pod = randint(1, 5)
        guess = input("[pod #]> ")


        if int(guess) != good_pod:
            print (dedent("""
            你跳进 {guess} 号逃生仓,按下了弹出按钮
            逃生仓发生了爆炸
            你挂了
            """))
            return "death"

        else:
            print (dedent("""
            你跳进 {guess} 号逃生仓,按下了弹出按钮"
            你赢了"
            """))
            return "finished"
class Finished(Scene):
    def enter(self):
        print("you won!good job")
        return "finished"
class Map(object):
    scenes= {
        'death':Death(),
        'central_corridor':CentralCorridor(),
        'laser_weapon_armory':LaserWeaponArmory(),
        'the_bridge':TheBridge(),
        'escape_pod':EscapePod(),
        'finished':Finished()
    }
    def __init__(self,start_scene):
        self.start_scene=start_scene

    def next_scene(self,scene_name):
        val=Map.scenes.get(scene_name)
        return val #返回对应的场景类

    def opening_scene(self):
        return self.next_scene(self.start_scene)


a_map = Map('central_corridor')
# print(a_map)
a_game = Engine(a_map)
a_game.play()

“笨办法”学Python3--习题43 基本的面向对象的分析和设计_第1张图片

dedent 

 from textwrap import dedent

dedent为了让写场景描述时使用三引号字符串,会把字符串开头的空白去掉,否则会有缩进。

你可能感兴趣的:(Python)