笔记37 笨办法学python练习43面向对象OOP的游戏代码(二)代码的反复理解

本文作者通过练习笨办法学Python的第43题,深入理解面向对象编程(OOP)的概念。在翻译和调整代码的过程中,遇到了缩进错误等问题,并通过反复尝试成功解决。虽然无法执行完整的游戏,但作者计划改进代码,特别是密码生成部分,以继续体验游戏的后续步骤。
摘要由CSDN通过智能技术生成

笔记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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值