类内部属性的调用
rom sys import exitfrom random import randint
你好,大神们,想问下这段代码最后Map类里面def next_scene(self, scene_name):
return (Map.scenes).get(scene_name),这段调用类Map里面的scenes属性,为什么是Map.scenes而不是self.scenes,两者我都试过,都可以运行,用Map.scenes有什么特别原因吗?求大神们告诉我,十分感谢!
# Scene是一个总类
class Scene(object):
def enter(self):
print("此Scence尚未配置,实例化它并实现enter()。")
exit(1)
# Engine是一个总类
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-----------")
next_scene_name = (current_scene).enter()
current_scene = (self.scene_map).next_scene(next_scene_name)
# Death is-a Scene,Death和Scene两个类存在从属关系,以下同理。
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("来自Percal25号行星的哥顿人已经入侵并消灭了你的飞船上全体船员,")
print("你是最后一个幸存的成员。")
print("你的最后一个任务是从激光武器库中取出中子毁灭弹,")
print("将它放在主控舱,然后进入逃生舱后将飞船炸了。")
print("\n")
print("你正沿着中央走廊往武库跑的时候,")
print("一只长着红色鳞片皮肤的哥顿人跳了出来。黑暗肮脏的牙齿,邪恶的小丑服装在他庞大的身体似乎要撑爆开来,")
print("它挡着激光武器库的门正要拔出武器来攻击你。")
print("这时候,你有三种选择:")
print("A.射击! B.闪避! C.讲个笑话! ")
action = input("你的选择是:")
if action == "A" or action == "a":
print("你快速拔枪,拔出你的爆能枪,朝那个哥顿人开火,")
print("它的小丑戏服忽然牵动它的身体飘动,偏离了你的目标,")
print("你的激光击中了它的服装,但完全没有击中它,")
print("这完全毁了它妈妈给它买的新衣服,这让它勃然大怒,")
print("它以闪电之势瞬移到你的身边,不停地打你的脸,直到你死了。")
print("然后你死了。")
return 'death'
elif action == 'B' or action == 'b':
print("你就像一个世界级的拳击手一般,当哥顿人的激光发射器从你的头顶掠过时,")
print("你会躲闪、滑铲和跳跃,在你巧妙的躲闪过程中,")
print("你的脚滑倒了,你的头撞在了金属墙上,晕了过去。")
print("你醒来后不久后,你绝望地发现哥顿人正准备踩你的头,把你吃掉。")
print("你死了。")
return 'death'
elif action == 'C' or action == 'c':
print("幸运的是,你在学院里正好学习了哥顿人的语言。")
print("你讲了一个你所知道的哥顿人的笑话。")
print("Lbhe zbgure vf fb sng,jura fur fvgf nebhaq gur ubhfr,fur fvgf nrbhaq gur ubhfr。")
print("哥顿人听完之后僵硬地停了下来,试图不笑。随后就爆发出大笑,笑得动弹不得。")
print("当它笑的时候,你跑过去给它的脑袋开了一枪,然后进去了激光哭泣库的门。")
return 'laser_weapon_armory'
else:
print("请你遵循游戏规则,正确输入选择。")
return 'central_corridor'
class LaserWeaponArmory(Scene):
def enter(self):
print("你以动作翻滚的方式进入武器库,蹲下,扫视房间,")
print("死一般的寂静,太安静了,可能有更多的哥顿人隐藏起来。")
print("你站起来,跑到房间的另一边,发现中子弹在一个盒子里,")
print("盒子上有个键盘锁,你需要密码把炸弹取出来。")
print("如果你错了10次,锁就会永远关闭,你就得不到炸弹了。密码是3位数字。")
code = "%d%d%d" % (randint(1, 9), randint(1, 9), randint(1, 9))
guess = input("[keypad]> ")
guesses = 1
while guess != code and guesses < 10:
print("嗡嗡嗡!")
guesses += 1
print("秘籍:", code) # 秘籍
guess = input("[keypad]> ")
if guess == code:
print("容器咔哒一声打开,密封就破裂了,气体就出来了。")
print("你抓起中子弹,以最快的速度跑到主控舱,你必须把它放在正确的位置上。")
return 'the_bridge'
else:
print("锁最后一次发出嗡嗡声,然后你听到一种令你心悸的熔化声,因为机械装置被熔在一起了。")
print("你此时惊在慌无措,四目张望。")
print("最后哥特人离开了这艘飞船,并把船给炸了。")
print("你的任务失败了。")
return 'death'
class TheBridge(Scene):
def enter(self):
print("你胳膊下夹着中子毁灭炸弹冲进主控室,让试图控制这艘船的5个哥顿人大吃一惊。")
print("他们每个人都有比上一个哥顿人更丑的小丑服装。")
print("他们还没把武器拿出来,因为他们看到你腋下的炸弹,不想引爆。")
print("现在这个局面,你有两个选择:")
print("A.扔炸弹 B.慢慢地放置炸弹")
action = input("> ")
if action == "A" or action == "a":
print("在恐慌中,你向哥顿人扔了炸弹,然后朝门跳去。")
print("就在你掉下去的时候,一个哥顿人从背后朝你开枪打死了你。")
print("当你死的时候,你看到另一个哥顿人疯狂地试图解除炸弹。")
print("当你死的时候,你可能知道它们会爆炸。")
print("你死了。")
return 'death'
elif action == "B" or action == "b":
print("你把你的爆能枪对准你腋下的炸弹。")
print("哥特人举起手来,开始微微出汗。")
print("你一寸一寸地退到门口,打开它,然后小心地把炸弹放在地板上,用你的爆震器对准它。")
print("然后你从门里跳回去,按下关闭按钮,然后把锁炸开,这样哥特一家就出不去了")
print("既然炸弹已经放好了,你就跑到逃生舱,从这个易拉罐上下来。")
return 'escape_pod'
else:
print("请你遵循游戏规则,正确输入选择。")
return 'the_bridge'
class EscapePod(Scene):
def enter(self):
print("你拼命地冲过飞船,想在整个飞船爆炸前赶到逃生舱。")
print("看来船上几乎没有哥顿人,所以你的计划没有任何干扰。")
print("你进入逃生舱房间,现在需要选择一个逃生舱。")
print("其中四个可能会被损坏,但是你没有时间去看。")
print("有五个逃生舱,你选择哪一个?")
good_pod = randint(1, 5)
print("秘籍:", good_pod) # 秘籍
guess = input("[pod]> ")
if int(guess) != good_pod:
print("你跳进了%s号逃生舱并按下了弹出按钮。" % guess)
print("逃生舱逃到太空中,然后随着船体的破裂而爆裂,把你的身体压碎成火腿三明治")
print("很可惜,就差那么一点了,你死了。")
return 'death'
else:
print("")
print("逃生舱很轻易地滑进太空,飞向下面的行星。")
print("当它飞向这颗行星时,你回头看,看到那艘飞船爆炸了,")
print("像一颗明亮的恒星一样,同时摧毁了哥特人的飞船。")
print("恭喜你,你成功地逃生出来了。")
return 'finished'
# Map是一个总类
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 opening_scene(self):
return self.next_scene(self.start_scene)
def next_scene(self, scene_name):
return (Map.scenes).get(scene_name)
a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()