笨办法学Python3 - Exercise43

2020-06-06  本文已影响0人  鹿呀鹿呀快开门

之前在看《笨办法学python3》这本书的时候,对书中Exercise43的代码进行了修改,当时放在CSDN上面,后来就忘记了,也没有再去过。今天偶然找到,把这个代码贴过来放在简书。
直接上代码如下:

from sys import exit
from random import randint
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):
        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() 
            current_scene = self.scene_map.next_scene(next_scene_name)

        # be sure to print out the last scene
        current_scene.enter() 


class Death(Scene):
    quips = [
        "你死了,世界被火星人占领,游戏结束...\n",
        "你被火星人击中,游戏结束...\n",
        "任务失败...\n",
        "你太弱了,任务结束...\n",
        "你就是一个笑话,世界正在毁灭,任务失败...\n",
        "任务失败,任务对你来说太难了,你还是回家玩泥巴吧...\n"
        ]
    def enter(self):
        print(Death.quips[randint(0,len(self.quips)-1)]) 
        return 'try_it_again'


class CentralCorridor(Scene):
    def enter(self):
        print("""
火星人的飞船占领了地球,将所有的人都囚禁起来
你因为在河边玩泥巴逃过一劫
但拯救地球的任务就落在你的身上...
你需要从军火库取出中子弹
炸毁火星人的飞船
然后从逃生通道逃出,拯救世界

现在你正处于一个长长的走廊上,迎面走来一个火星人
        """)

        action = input("选择一个数字: 1.射击,2.快速躲起来,3.讲一个笑话\n>>")
        if action == "1":
            print("""
火星人发现了你,它躲过你的子弹,并快速的向你射击
一大群火星人听到枪声赶来...
              """)
            return 'death'

        elif action == "2":
            print("""
不幸的是火星人还是发现了你...
                  """)
            return 'death'

        elif action == "3":
            print("""
火星人控制不住自己,
连武器都笑得掉在地上,
你乘机将他击倒,
并夺得武器

走过长廊,你进入武器库...
              """)
            return 'laser_weapon_armory'

        else:
            print("请认真选择,命运在于选择!")
            return 'central_corridor'


class LaserWeaponArmory(Scene):

    def enter(self):
        print("""
现在你进入到武器库,在武器库的中央保险柜中存放着中子弹
但是你必须正确输入密码
        """)
        password = f"{randint(0,9)}{randint(0,9)}"
        action = input("请输入两位数的密码\n>>")
        counts = 1
        while action != password and counts < 10:
            if int(action) < int(password):
                print('数字小了...')
            else: print('数字大了...')
            counts += 1
            action = input("请重新输入密码\n>>")

        if action == password:
            print("""
恭喜你,被你蒙对了!你获得中子弹!
                """)
            return 'the_bridge'

        else: 
            print("""
错误次数太多,中子弹爆炸
                """)
            return 'death'

class TheBridge(Scene):

    def enter(self):
        print("""
一扇门开启,你进入到飞船中控室
现在你需要炸毁这艘飞船
            """)
        action = input("""
请选择一个处理中子弹的方法:
1. 向中控室扔出中子弹
2. 将中子弹设置在控制台下
>>""")
        if action == '1':
            print("中子弹无法引爆,火星人发现了你\n")
            return 'death'
        elif action == '2':
            print("中子弹被正确设置,十分钟内将引爆\n")
            return 'escape_pod'
        else:
            print('火星人正在赶来,请尽快作出决定!\n')
            return 'the_bridge'

class EscapePod(Scene):

    def enter(self):
        print("""
现在你需要在爆炸发生前离开飞船
你可以通过逃生通道逃生
但五条逃生通道中只有一条是安全的通道
            """)
        safe_pod = str(randint(1,5))
        action = input('请选择一条逃生通道:1. 通道A;2. 通道B;3. 通道C;4. 通道D;5. 通道E\n>>')
        count = 1
        while action != safe_pod and count < 3:
            action = input('请重新选择\n>>')
            count += 1
        if action != safe_pod:
            print(f"正确的逃生通道应该选择{safe_pod},你落入火星人之手")
            return 'death'
        else:
            print("选择正确,你顺利逃出\n")
            return 'finished'

class TryItAgain():

    def enter(self):
        choose = input("再来一次吗:Y/N\n>>").upper()
        if choose == 'Y':
           return 'central_corridor'
        elif choose == 'N':
           exit(1)
        else:
            print('请输入Y或N')
            return 'try_it_again'

class Finished(Scene):

    def enter(self):
        print("火星人的飞船被炸毁,你拯救了地球!\n")
        print('任务完成')
        return 'finished'

class Map(object):

    scenes = {
        'central_corridor': CentralCorridor(),
        'laser_weapon_armory': LaserWeaponArmory(),
        'the_bridge': TheBridge(),
        'escape_pod': EscapePod(),
        'death': Death(),
        'try_it_again':TryItAgain(),
        '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') 
a_game = Engine(a_map) 
a_game.play() 

根据书中的代码,做了一些改动。

  1. 用中文来描述场景,这不再赘述
  2. 增加了一个TryItAgain场景,在游戏失败的情况下返回该场景,可以选择是否重新玩一次
  3. 除了场景的类,游戏的核心是Engine和mapping。
  4. Engine()
class Engine(object):
def __init__(self, scene_map):
    self.scene_map = scene_map #初始化scene_map,刚开始的时候传入输入的场景名,完成当前场景的时候,传入返回的场景

def play(self):
    current_scene = self.scene_map.opening_scene() #opening_scene是class Map中的方法,会返回当前的场景类
    last_scene = self.scene_map.next_scene('finished') #返回名为finish的场景类

    while current_scene != last_scene: #当该场景不是最后的finish的场景,则进入该场景
        next_scene_name = current_scene.enter() #通过Enter方法执行场景中的指令,并返回下一个场景给next_scene_name
        current_scene = self.scene_map.next_scene(next_scene_name) #将当前场景变为下一场景,继续while的判断

    # be sure to print out the last scene
    current_scene.enter() #当到最后一个场景的时候,直接执行到游戏结束

对代码中密码的猜测,改为有十次机会,会根据每次猜测的结果,告诉你数字是大还是小,降低游戏难度。
在逃生通道的选择处,也有三次机会选择。

上一篇下一篇

猜你喜欢

热点阅读