目录
《哥顿人》游戏
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()
from textwrap import dedent
dedent为了让写场景描述时使用三引号字符串,会把字符串开头的空白去掉,否则会有缩进。