笔记37 笨办法学python练习43面向对象OOP的游戏代码(二)代码的反复理解
连续贴着这个练习43的代码折腾了整整两天,把那些英文文本翻译为中文文本,重新装进这个代码之中。本想一段一段的运行,发现运行不了,即使代码没有指出什么错误,依然是运行不了。无赖只有照录全码,仅将英文文本换做中文。这么长的代码,弄完之后也是如分段时的情形一样,无法执行。好在有了点检查错码的体验。按照提示一个一个的纠错。主要的错误在缩进编排的错误,你反复试探这种编排格式的错误总能找到解决的办法。Python的代码编排体现代码的逻辑顺序,如果这个逻辑顺序还能够体会出来,那么那个编排上的缩进失误就一定能找到解决办法,一次很好的代码纠错练习。
编程语言python有关类和对象的观念,是对传统逻辑观念的一种超脱。有一点传统类和对象的影子,但如果按照逻辑来理解类和对象,那大概只能体会到其中的皮毛。编程语言中的这两个东西,其中的类理解成类似图纸和工厂那样能够产出对象的东西,这个说法好像有点道理。而有关类的属性和方法,其中的方法,有很有点函数的味道。而对象那个东西,更多的和实例化联系在一起,有点传统逻辑中的个体的味道,但实例的说法比个体的说法更地道。对这两个概念的初始感觉,让人对于编程语言更有了一些琢磨的兴趣。
代码有些长度,它又是一个游戏,执行之后的游戏文件也有长度。剩下的篇幅把这个练习43的游戏代码抄录如下,然后附之以执行后的结果。那个密码太难猜,连续猜了20轮,都没有猜到密码,所以,这个游戏也没有做到后面几步。没有密码,好像到不了后面的步骤。花点时间看能不能改造一下这个游戏,至少让那个救生板的密码能够弄出来,游戏也就能够玩到后面的每一个步骤。
练习ex43.py的中文文本代码
在这里插入代码片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):
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(object):
quips = """
"you died, You kinda suck at this.",
"Your mom would be proud...if she were smarter.",
"Such a luser.",
"I have a small puppy that's better at this."
"You're worse than your Dad's jokes."
"""
def enter(self):
print(Death.quips[randint(0, len(self.quips)-1)])
exit(1)
class CentralCorridor(Scene):
def enter(self):
print(dedent("""
行星佩寇25号中的哥顿人已经入侵到你的飞船,
全体船员都被消灭干净,除了你之外。你是唯一
的幸存者,你最后的使命是到武器储藏库找到一颗
中子炸弹,把这颗炸弹置入主控舱中。你在进入救
生舱之后,引爆这枚炸弹。
你正行走在中央走廊通向武器储藏库的路途上,当有
哥顿人跳出时,你要注意,那是带有红色鳞片皮肤,
黑色污秽牙齿,身穿邪恶小丑服饰的家伙,它整个躯体
都充斥着仇恨,它正在守卫着通向武器库的大门,它随
时都会抽出武器绞杀你。
"""))
action = input("> ")
if action == "shoot!":
print(dedent(""""
迅速地把炸弹取出,在哥顿人那里引爆。哥顿人的小丑
服饰正在从它的身躯滑落,然后丢向你这里。你的镭射
武器击向那个怪异服饰了,可惜完全没有击中。但却毁
掉了那邪恶服饰的标牌,这件邪恶服饰是它母亲买给它的
新衣,这件新衣能让这个哥顿小子进入狂怒状态,一刻也
不停地去杀戮你,直到把你杀死,然后再把你吃掉。
"""))
return 'death'
elif action == "dodge!":
print(dedent("""
你就像一个世界级的拳击手一样,当哥顿人的炸弹在你头顶
盘旋,你躲闪、游动、滑步,还有斜移。在那个艺术般的闪避
地中间,你的双脚在滑行,你的头抵在金属墙面,好家伙,还
穿过墙面了。在哥顿人踩住你的头,要吃掉你之时,在你与死亡
仅一步之遥的时候,你突然间苏醒过来。
"""))
return 'death'
elif action == "tell a joke":
print(dedent(""""
对你而言还是很幸运的,它们让你在研究机构领会了哥顿人的羞辱。
你讲一个你知道的哥顿人笑话:lbhe zbqure vf fb sng, jura
fur fvgf nebhaq gur ubhfr, fur fvgt bebhaq gur ubhfr.
哥顿人听后停了下来,它努力不去笑出声, 然后忍不住又放声大笑,
笑得停不下来。当它笑声不止的时候,你跑了出来,一枪击中哥顿
人的脑袋把哥顿人给放倒了。然后,你就跳出了武器库的大门。
"""))
return 'laser_weapon_armory'
else:
print("DOES NOT COMPUTE!")
return 'central_corridor'
class LaserWeaponArmory(Scene):
def enter(self):
print(dedent("""
你滚动潜水进到武器库,不少哥顿人也许就隐藏
在武器库旁的一个房间里,它们蹲守在这里,注视着
这里的一切。这里死寂一般的安静,太安静了。你站
起来,跑到房间的远端,在一个巨大的容器之中找到
了中子炸弹。
有一个键盘板锁在箱子里边,要把那个炸弹取出来,
得需要密码。如果你使用密码用错了10次,这个锁匙
就永远关闭,再也打不开了,那自然就取不到炸弹。
密码是三个数字。
"""))
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("""
你跳进救生板{猜测}并且按动那个弹开按钮。
救生板弹跳到一个绝望的空间,接之,船体
裂爆为一堆碎片,你的身体爆化为如同果冻似的肉酱。
"""))
return 'death'
else:
print(dedent("""
你跳进救生板{猜测}并且按动那个弹开按钮。救生板
很容易地弹跳进一个朝向下层行星的空间。当救生板
飞至行星,你回头眺望,看见那艘你飞出的飞船内爆了,
爆炸后形成的图景,就像一颗明亮的星星。同时哥顿人
的那条飞船飞走了。你胜利了。
"""))
return 'finished'
class Finished(Scene):
def enter(self):
print("You win! Good job.")
return 'finished'
class Map(object):
scene = {
'central_corridor': CentralCorridor(),
'laser_weapon_armory': LaserWeaponArmory(),
'the_bridge': TheBridge(),
'escape_pod': EscapePod(),
'death': Death(),
'finished': Finished(),
}
def __init__(self, start_scene):
self.start_scene = start_scene
def next_scene(self, scene_name):
val = Map.scene.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()
代码执行后的结果
在这里插入代码片IndentationError: unexpected indent
PS C:\Users\lenovo\1pythonw> python ex43.py
File "ex43.py", line 71
return 'death'
^
IndentationError: unexpected indent
PS C:\Users\lenovo\1pythonw> python ex43.py
File "ex43.py", line 71
return 'death'
^
IndentationError: unexpected indent
PS C:\Users\lenovo\1pythonw> python ex43.py\
C:\Users\lenovo\AppData\Local\Programs\Python\Python38\python.exe: can't open file 'ex43.py\': [Errno 22] Invalid argument
PS C:\Users\lenovo\1pythonw> python ex43.py
File "ex43.py", line 71
return 'death'
^
IndentationError: unexpected indent
PS C:\Users\lenovo\1pythonw> python ex43.py
File "ex43.py", line 71
return 'death'
^
IndentationError: unexpected indent
PS C:\Users\lenovo\1pythonw> python ex43.py
行星佩寇25号中的哥顿人已经入侵到你的飞船,
全体船员都被消灭干净,除了你之外。你是唯一
的幸存者,你最后的使命是到武器储藏库找到一颗
中子炸弹,把这颗炸弹置入主控舱中。你在进入救
生舱之后,引爆这枚炸弹。
你正行走在中央走廊通向武器储藏库的路途上,当有
哥顿人跳出时,你要注意,那是带有红色鳞片皮肤,
黑色污秽牙齿,身穿邪恶小丑服饰的家伙,它整个躯体
都充斥着仇恨,它正在守卫着通向武器库的大门,它随
时都会抽出武器绞杀你。
> dodge!
你就像一个世界级的拳击手一样,当哥顿人的炸弹在你头顶
盘旋,你躲闪、游动、滑步,还有斜移。在那个艺术般的闪避
地中间,你的双脚在滑行,你的头抵在金属墙面,好家伙,还
穿过墙面了。在哥顿人踩住你的头,要吃掉你之时,在你与死亡
仅一步之遥的时候,你突然间苏醒过来。
PS C:\Users\lenovo\1pythonw> python ex43.py
行星佩寇25号中的哥顿人已经入侵到你的飞船,
全体船员都被消灭干净,除了你之外。你是唯一
的幸存者,你最后的使命是到武器储藏库找到一颗
中子炸弹,把这颗炸弹置入主控舱中。你在进入救
生舱之后,引爆这枚炸弹。
你正行走在中央走廊通向武器储藏库的路途上,当有
哥顿人跳出时,你要注意,那是带有红色鳞片皮肤,
黑色污秽牙齿,身穿邪恶小丑服饰的家伙,它整个躯体
都充斥着仇恨,它正在守卫着通向武器库的大门,它随
时都会抽出武器绞杀你。
> shoot!
"
迅速地把炸弹取出,在哥顿人那里引爆。哥顿人的小丑
服饰正在从它的身躯滑落,然后丢向你这里。你的镭射
武器击向那个怪异服饰了,可惜完全没有击中。但却毁
掉了那邪恶服饰的标牌,这件邪恶服饰是它母亲买给它的
新衣,这件新衣能让这个哥顿小子进入狂怒状态,一刻也
不停地去杀戮你,直到把你杀死,然后再把你吃掉。
PS C:\Users\lenovo\1pythonw> python ex43.py
行星佩寇25号中的哥顿人已经入侵到你的飞船,
全体船员都被消灭干净,除了你之外。你是唯一
的幸存者,你最后的使命是到武器储藏库找到一颗
中子炸弹,把这颗炸弹置入主控舱中。你在进入救
生舱之后,引爆这枚炸弹。
你正行走在中央走廊通向武器储藏库的路途上,当有
哥顿人跳出时,你要注意,那是带有红色鳞片皮肤,
黑色污秽牙齿,身穿邪恶小丑服饰的家伙,它整个躯体
都充斥着仇恨,它正在守卫着通向武器库的大门,它随
时都会抽出武器绞杀你。
> tell a joke
"
对你而言还是很幸运的,它们让你在研究机构领会了哥顿人的羞辱。
你讲一个你知道的哥顿人笑话:lbhe zbqure vf fb sng, jura
fur fvgf nebhaq gur ubhfr, fur fvgt bebhaq gur ubhfr.
哥顿人听后停了下来,它努力不去笑出声, 然后忍不住又放声大笑,
笑得停不下来。当它笑声不止的时候,你跑了出来,一枪击中哥顿
人的脑袋把哥顿人给放倒了。然后,你就跳出了武器库的大门。
你滚动潜水进到武器库,不少哥顿人也许就隐藏
在武器库旁的一个房间里,它们蹲守在这里,注视着
这里的一切。这里死寂一般的安静,太安静了。你站
起来,跑到房间的远端,在一个巨大的容器之中找到
了中子炸弹。
有一个键盘板锁在箱子里边,要把那个炸弹取出来,
得需要密码。如果你使用密码用错了10次,这个锁匙
就永远关闭,再也打不开了,那自然就取不到炸弹。
密码是三个数字。
[keypad]> 3
BZZZZEDDD
[keypad]> 4
BZZZZEDDD
[keypad]> 5
BZZZZEDDD
[keypad]> 2
BZZZZEDDD
[keypad]> 1
BZZZZEDDD
[keypad]> 0
BZZZZEDDD
[keypad]> 325
BZZZZEDDD
[keypad]> 111
BZZZZEDDD
[keypad]> 555
BZZZZEDDD
[keypad]> 222
BZZZZEDDD
[keypad]> 999
锁匙的发声器响起了最后的声音,你听到一声下沉
熔断的声响。你决定坐在那里,最后,哥顿人从它们
的那条船引爆了你所在的那条船,你死去了。
你滚动潜水进到武器库,不少哥顿人也许就隐藏
在武器库旁的一个房间里,它们蹲守在这里,注视着
这里的一切。这里死寂一般的安静,太安静了。你站
起来,跑到房间的远端,在一个巨大的容器之中找到
了中子炸弹。
有一个键盘板锁在箱子里边,要把那个炸弹取出来,
得需要密码。如果你使用密码用错了10次,这个锁匙
就永远关闭,再也打不开了,那自然就取不到炸弹。
密码是三个数字。
[keypad]> 888
BZZZZEDDD
[keypad]> 777
BZZZZEDDD
[keypad]> 666
BZZZZEDDD
[keypad]> 123
BZZZZEDDD
[keypad]> 456
BZZZZEDDD
[keypad]> 789
BZZZZEDDD
[keypad]> 444
BZZZZEDDD
[keypad]> 333
BZZZZEDDD
[keypad]> 159
BZZZZEDDD
[keypad]> 135
BZZZZEDDD
[keypad]> 246
锁匙的发声器响起了最后的声音,你听到一声下沉
熔断的声响。你决定坐在那里,最后,哥顿人从它们
的那条船引爆了你所在的那条船,你死去了。
p
PS C:\Users\lenovo\1pythonw>