笔记36 笨办法学python练习43面向对象OOP的文字理解(一)

笔记36 笨办法学python练习43面向对象OOP的文字理解(一)

先仔细看了本练习的文本,感到一个笔记写不下来这个复杂的练习过程,那就先把文字理解的部分先来完成,再用一篇笔记来完成代码的理解。
一、游戏的基本描述:
1外星人哥顿人 侵犯 宇宙飞船。
2飞船中的英雄 通过 复杂的迷宫 房间 迎战哥顿人。
3从宇宙飞船 到救生板 到行星

二、游戏场景
1death 玩家死去的场景
2central corridor 中央走廊,这是游戏起点,应该很高,有外星人把守
3laser weapon armory激光武器库,有仓库密码,需猜出密码可进
4the bridge飞船主控舱,争斗场所,需预埋炸弹
5escape pod救生舱,逃离场景,但救生舱很多,需猜测可逃生的那个。

三、关键名辞列表
1各种人:外星人○1 哥顿人○2 玩家○3
2空间场景○4
3空间场景之下的独有场景:行星○5 飞船○6 中央走廊○7
4飞船中的场景:迷宫○8 房间○9 主控舱○10 救生舱○11 激光武器库○12
5人的一种状态场景: 死亡○13
6玩家工具也是场景:地图○14 引擎○15

四、创建结构图和地图对象
先按照教材的思路,
第一层次
三个并行的语词构成:map, engine, scene
第二层次,首先是场景scene的
五个并行语词构成:death, central corridor,laser weapon armory,bridge,escape pod
把death作为场景有点牵强,但还是得按照教材的做法,死亡作为人的一种状态,终究有一个空间场景来体现。
第二层次,然后是地图的
地图也作为一种场景,也出乎我意料之外。但教材告知,游戏引擎是在地图上的运动,就这个意义,地图是最大的场景。引擎在地图中引导玩家,从一个场景串到另一个场景。也许地图能够显示出,起点在哪里?终点在哪里?中间又经历过一些什么地方?
第二层次,再然后是引擎的。
引擎好像是一个独立的层次,无需涉及什么类或者对象
有了这样的构思,我对代码好像一点感觉都没有产生,但教材有了构思,可以开始代码的撰写了。
于是我们开始了测试代码编写。

五、测试代码编写
这个测试代码ex43.classes.py,好像定义了8个类,我分列如下:
第一类:场景
场景类class Scene,名称显然是scene,但后列了一个object,按照练习42的说明,这大概是让场景这个类也当作了对象。其实场景作为对象中的一种,也完全说得过去。在这个类之下定义了一个函数,名为enter。这也许是在表明,这里的场景是有个入口enter的。还有个也许,因为是入口,很可能就需要入口的某种准入许可。就像新冠疫情要求任何进入医院的人,一定要填上一张表,满足表上的要求你才可以进医院一样。
第二类:引擎
引擎类,也挂了一个对象object,名称是Engine。引擎作为对象好像更合适,类定义后有两个函数紧随,这大概可以说明。函数1有两个参数,一个参数变元self大概应该赋值对象本身,另一个参数scenemap大概可以看作是对象的属性,引擎是按照场景地图来工作的。函数2则是参数变元self可以操控这个引擎,由他来play。
第三类:死亡场景
这个类别有点奇怪,竟然属于场景之类的东西。这个场景因为是场景,自然也有个入口enter的问题,它就和第一类有同样的函数。
第四类:中央走廊场景
因为也是场景,就有同上的函数定义。
第五类:激光武器库场景
因为也是场景,就有同上的函数定义。
第六类:主控舱场景
因为也是场景,就有同上的函数定义。
第七类:救生舱场景
因为也是场景,就有同上的函数定义。
第八类:地图
地图作为和场景地位相同的类和对象,也是没有想到的。而且,这里还配有三个函数。函数1:游戏主体self的场景起点start,函数2:游戏主体的下一个场景,函数3:游戏主体的登场。

最后,测试代码仅仅给出了二个定义,一个函数,但仅仅各占一行。还测不出意图。而且依据这几个对象或者类别,要自己做出这个游戏的剩余部分,还真有难度。所以得继续往下看。

六、重复和细化
第一段代码:p146引入三个函数
在录完测试代码后,错误很快就纠正,但纠正完毕依然无法运行。所以,你也只有继续往下看。这一次练习,力争对于代码的每一个指令都有个基本的了解,不再限于只要能执行就够。这就开始了游戏代码的重复和细化,第一组代码有三个引入,第一个exit前已用过,第二个import的函数是randint,先了解这个函数。
函数random.randint(a,b),用于生成一个指定范围内的整数int,参数a为下限,参数b为上限,在这个范围内生成随机数字。
函数textwrap.dedent(text),用于去掉文本中的每一行的空白字符串,这可以被用来使那些在显示的左栏用三引号括起来的字符串,仍然用缩进方式在源代码中展示。

第二段代码:p147对象场景的配置
待配置,入口还未补充,大概是有待后面再来配置前面

第三段代码:p147引擎的创建
那个拿地图的主体在测试代码的引擎配置中已经有了,这里也为那个地图主体赋值了,那就是场景地图scene_map。接着又为变量当前场景current_scene赋值,这个场景就是主体登场的那个场景opening_scene,由类self. scene_map,通过字符点“.”访问这个登场的场景opening_scene,
然后再定义最后场景last_scene,给它的赋值是:类self. scene_map通过字符“.”访问那个标有“完结”finished的下一个场景next_scene。
这个Engine创建的最后一部分,是上述函数2的一个分支while循环。而当当前的场景不是最后场景的时候,这个循环就要进行。所以有条件!=(不等于)。上一段还没有给下一个场景变元赋值,所以在while之后一行,首先是给next_scene_name赋值,这个赋值的涵义大概是:当前的场景访问到enter()函数的时候,这时候的场景就是next_scene_name。那么什么是当前场景呢?刚才在函数2中赋值过一次,在循环while中还需继续赋值。这就是while分支循环中的第三行的赋值,这个变量赋值的途径几乎等同于函数2中对最后场景的赋值,只是参量稍有变化而已。
但这个engine代码做好之后,依然无法执行。

第四段代码:p147死亡场景
这个场景,首先加了个文本赋值给quips,试着给出汉译:

你死去了,你的柯达在这里沉没。
如果你的母亲是个智慧的女人,她会为你感到骄傲。
这样的一个醉鬼。
我有一条小狗,它比这里的一条好多了。
你的那个笑话,比你老爸的差多了。

文本之后给出了函数enter(self),并要求输出随机整数,这个整数区间在0和那个文本长度减去1的范围之中。可惜执行不了。

第五段代码:p148-149中央走廊场景
Enter函数下的四个条件分支
行1-3给出入口函数enter(self),随后输出以下文字:
行4-19
行星佩寇25号中的哥顿人已经入侵到你的飞船,全体船员都被消灭干净,除了你之外。你是唯一的幸存者,你最后的使命是到武器储藏库找到一颗中子炸弹,把这颗炸弹置入主控舱中。你在进入救生舱之后,引爆这枚炸弹。

你正行走在中央走廊通向武器储藏库的路途上,当有哥顿人跳出时,你要注意,那是带有红色鳞片皮肤,黑色污秽牙齿,身穿邪恶小丑服饰的家伙,它整个躯体都充斥着仇恨,它正在守卫着通向武器库的大门,它随时都会抽出武器绞杀你。

给行动action变量赋值=input(“>”)
行20-32函数下分支条件1:行动的条件函数if== “shoot!”
接之又输出以下文字:

迅速地把炸弹取出,在哥顿人那里引爆。哥顿人的小丑服饰正在从它的身躯滑落,然后丢向你这里。你的镭射武器击向那个怪异服饰了,可惜完全没有击中。但却毁掉了那邪恶服饰的标牌,这件邪恶服饰是它母亲买给它的新衣,这件新衣能让这个哥顿小子进入狂怒状态,一刻也不停地去杀戮你,直到把你杀死,然后再把你吃掉。

返回“死亡”值
行33-43函数下分支条件2:如果条件不满足,则有elif
Action==“dodge!”如果行动不成功,那就躲避。
输出以下文字:

你就像一个世界级的拳击手一样,当哥顿人的炸弹在你头顶盘旋,你躲闪、游动、滑步,还有斜移。在那个艺术般的闪避地中间,你的双脚在滑行,你的头抵在金属墙面,好家伙,还穿过墙面了。在哥顿人踩住你的头,要吃掉你之时,在你与死亡仅一步之遥的时候,你突然间苏醒过来。

还是返回“死亡”值

行44-56函数下分支条件3:如果继续不满足条件,则有另一个elif
Action==“tell a joke”,如果行动不成功,那就讲一个故事。

对你而言还是很幸运的,它们让你在研究机构领会了哥顿人的羞辱。你讲一个你知道的哥顿人笑话:lbhe zbqure vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgt bebhaq gur ubhfr. 哥顿人听后停了下来,它努力不去笑出声, 然后忍不住又放声大笑,笑得停不下来。当它笑声不止的时候,你跑了出来,一枪击中哥顿人的脑袋把哥顿人给放倒了。然后,你就跳出了武器库的大门。

返回值这一次变成了‘激光武器库’laser weapon armory。

行57-59函数下最后分支条件4:如果继续不满足条件,则有最后的else。
输出“别计算”(“don’t compute!”)
返回值这一次变成了”中央走廊”。’central corridor’

第六段代码:p149-152激光武器库+主控舱+救生舱场景
这个代码有点厉害,持续了好几页,慢慢记录吧。
行1-行41设置激光武器库场景
行3定义函数入口()enter(self),随后输出文字
行4-13:

你滚动潜水进到武器库,不少哥顿人也许就隐藏在武器库旁的一个房间里,它们蹲守在这里,注视着这里的一切。这里死寂一般的安静,太安静了。你站起来,跑到房间的远端,在一个巨大的容器之中找到了中子炸弹。
有一个键盘板锁在箱子里边,要把那个炸弹取出来,得需要密码。如果你使用密码用错了10次,这个锁匙就永远关闭,再也打不开了,那自然就取不到炸弹。密码是三个数字。

行15-18:给三个变元分别赋值
Code=,显然是数字1-9之间的任意三个数字。
Guess=,数字由猜者自选。
Guesses=0次数从零算起。

行19-23:while循环,一个合取条件,满足没有猜中而且不少于10次就可继续猜测。
输出字符BZZZZEDDD!
猜测次数
猜测出的数字

行24-41条件分支if guess == code密码若猜对,则输出如下文字

那个容器给点开了,封条也裂开了,气体溢出。你抓住了中子炸弹,你使劲全力跑到主控舱,那个你必须把这个中子弹放到其右手的那个地方。

返回“主控舱”值

行32-41条件分支2,若猜错密码,则输出以下文字

锁匙的发声器响起了最后的声音,你听到一声下沉熔断的声响。你决定坐在那里,最后,哥顿人从它们的那条船引爆了你所在的那条船,你死去了。

返回“死亡”值

继续创建场景类,接下来是主控舱场景。

行42-行83设置主控舱场景
行42-55设立入口函数enter(self),输出以下文字

你夹带着中子弹冲进了主控舱,5个哥顿人惊呆了,它们正竭力控制这个飞船。哥顿人中每一个人都穿着无比丑陋的小丑服装。当这些哥顿人看到你胁下夹带着那个活动的中子弹的时候,它们都没有来得及抽出它们的武器,它们也不想让这个中子弹爆炸。

行54给变量action赋值input(“>”)
行56-64函数条件分支if,若丢炸弹,则执行条件分支
行58-64输出以下文字:

在一片慌乱之中,你把炸弹丢到了哥顿人群之中,舱门有点跳动起来。正当你射中一个哥顿人的时候,你背后有一个哥顿人从右边来刺杀你。你死去了,但你同时也看到另一个哥顿人狂怒地试图解下那颗炸弹。你死去了,但你也知道,当炸弹拿开的时候,它们全都可能被炸掉。

返回“死亡”值

行67-83函数条件分支elif,若行动为慢慢安放炸弹时执行
行69-77输出以下文字

你点向在你胁下的那个中子弹的导火索,哥顿人扬起它们的手,开始了与你的拼死搏斗。你慢慢地回到门边,打开那颗中子弹,小心地把它置放在地板上,再去点动中子弹的引信。你越过大门跳回来,猛击那个关闭按钮,门关上了,哥顿人不能出来了。现在,那颗中子弹放置停当,你跑到救生舱边,以便离开这个封闭的空间。

返回“救生舱”值

行79-83函数条件分支else,否则就执行以下文字
行80不用计算
行81返回“主控舱”值

行84-行119设置救生板场景
行86定义函数入口()enter(self),随后输出文字
行87-96:输出以下文字

在整个飞船行将爆炸之前,你拼命试图跑过飞船中央走廊拿到救生板。飞船上的哥顿人似乎没有一个人可以得到这救生板,你的奔跑毫无障碍。你跑到那个存放救生板的地方,现在你需要做的事情是拿走这些救生板中的一个。但这些救生板不是全都完好无损,你也没有时间去一个一个查看。总共有5个救生板,你拿走哪一个呢?

给两个变元赋值,一个是完好救生板,另一个是猜测。
行97 good_pod =randint(1,5)
行98 guess = input(“[pod#]> “)
行100-行119 函数内的条件分支if和else
行100-107 条件分支if,当猜测到的救生板,不是好板的时候执行
行101-106输出以下文字

你跳进救生板{猜测}并且按动那个弹开按钮。救生板弹跳到一个绝望的空间,接之,船体裂爆为一堆碎片,你的身体爆化为如同果冻似的肉酱。

返回“死亡”值

行108-119 条件分支else,当猜测到的救生板,是一块好板的时候执行
行109-116输出以下文字

你跳进救生板{猜测}并且按动那个弹开按钮。救生板很容易地弹跳进一个朝向下层行星的空间。当救生板飞至行星,你回头眺望,看见那艘你飞出的飞船内爆了,爆炸后形成的图景,就像一颗明亮的星星。同时哥顿人的那条飞船飞走了。你胜利了。

返回“完结”值

行120-行124设置救生板场景
设置“完结”场景
定义函数enter(self)
输出“你胜利了,做得好”

第七段代码最后设置map这个类可以引入的对象
把map这个类看作是一个字典类是没有想到的,这里好像有点什么窍门。例如中央走廊和它的函数构成一个键值对,死亡和其函数也是键值对,有点意思,慢慢理解。
除了上述函数之外,map的设置还曾加了三个函数,起点场景的函数,下一个场景的函数,还有开放场景的函数。这几个函数在测试代码中有,一定得在这里重复么?

第八段代码,也是在测试代码中有的,也一定需要重复么?慢慢思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值