笔记40 笨办法学python练习45之一:试修改ex43游戏代码

笨办法学Python游戏编程
本文分享了通过笨办法学习Python编程的过程,重点介绍了修改和完善ex43游戏代码的实践,包括理解游戏引擎、场景配置、文本编辑和map类的作用。通过逐行解读和反复测试,实现了游戏的流畅运行。
部署运行你感兴趣的模型镜像

笔记40 笨办法学python练习45之一:试修改ex43游戏代码

练习43虽可以运行,但没有流畅和循环。练习45要求读者自做游戏,我也就自然要把练习43那个没有做好的东西来个清理,争取回头看的时候能够做得更好些。还是那个笨办法,一个指令一个指令的理解,一行一行的理解上一次所做的每一步。
引入的三个指令,其中的exit有必要来个复习。
exit(0):正常运行程序并退出程序;
exit(1):非正常运行导致退出程序;
exit(0)与exit(1)对你的程序来说,没有区别。对使用你的程序的人或者程序来说,区别可就大了。
一般来说,exit 0 可以告知你的程序的使用者:你的程序是正常结束的。如果 exit 非 0 值,那么你的程序的使用者通常会认为你的程序产生了一个错误。
以下是修改的说明:
一、场景scene
首先是Scene场景,接着是Engine,我把第三个类改为Ship,是Scene的子类,这个场景中加上了if句,后来的if句增添了条件句。Scene场景配置见下图。原代码的exit用的时(1),我改为(0),好像对游戏整体无影响。

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200614201849222.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR
二、引擎engine
然后是对于engine的理解,engine是作为与scene平级的类class Engine(object),看来是游戏行为的线索轨迹所在。
类engine有一个名为 __init__的方法,其实就是函数,该方法以self,和scene_map作为参数。其中的参数self指代实例的一个变量,它具有属性scene-map。所以,在本游戏中,这个self大概可以看作是游戏的主角,它带着地图,参与整个游戏。
按照这个初始化方法的规矩,给变量self.scene_map赋值:
self.scene_map = scene_map
再给出操作的函数定义,这个定义配置了游戏活动的先后顺序。
玩家的play从当前场景变元current_scene启动,这个场景赋予值为游戏启动点opening,是长长的一串字符:self.scene_map.opening_scene(),相当于玩家开始活动时机器激活的起点,还要带着地图。这就是说,这个游戏的每一个场景,除了最后一个,其它都是当前景点。最后一个景点定义为参数是finished的那个场景。
def play(self):
current_scene = self.scene_map.opening_scene()
last_scene = self.scene_map.next_scene(‘finished’)

接着来了一个while循环,条件是,只要不是最后景点last_scene就需循环。也就是上图中从场景1,玩到场景5,最后到场景6终止。但修改后的这个编码,依然不能往下按照顺序做,试验了很多种方式都不行。
while current_scene != last_scene:
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)

current_scene.enter()
这个循环还没有完全弄懂,还得下神,等待下篇吧。好在不断地自己测试自己修改,总算是可以运行得把修稿后的内容重复进powershell之中,虽不尽人意,但也值得满足,先就照原样做到这里。
三、文本编纂
所有的文本重新编撰,中午休息一不小心把修改的代码无意间删掉了,幸亏有博客在,算是省了不少功夫,直接就copy过来,但上午的修改就是做了无用功了,从头再开始。

四、看map类如何配置
建立词典的键值模式,6个场景如上图。在类map之下用三个方法函数,与engine的配置有相似之处。
第一个函数初始函数__init__,二参数一为self,一为开始场景。这里让人困惑的地方是,map中的场景是否与engine中的场景重叠。如果重叠,岂不是可以省略掉。试试!试试的结果也是没有本事多做修改,把map的参数换上我增加的ship(scene),其它也基本保持未动。
按照这样的样板和思路做了练习ex45test4,基本上把游戏中的东西在ps中重现,有些有重复,有些还是让人莫名其妙,还有很多疑点,只有待来日慢慢消化了。
教材说得好:这是我的计算机,我想干什么就干什么。真有点像中国移动曾经有过的一个广告语:我的地盘我作主。很可能是非常烂的作主,但全都是自己的,全是自己折腾三天的结果,烂点也就没有什么不好意思的。
我作主的练习ex45test4.py,还有它的执行结果就在后面。
练习ex45

在这里插入代码片from sys import exit
from random import randint
from textwrap import dedent

class Scene(object):

    def enter(self):
        print("This scene is to start to be 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)
        else:
            current_scene.enter()

class Ship(Scene):

    quips = [
        "\t题目:洲际飞船的旅客和野蛮人\n"
        "欢迎来到这个穿越欧亚太空的洲际飞船\n"
        "你们将从广州到法兰克福,或者从法兰克福飞到广州\n"
        "一次美妙无比的洲际旅行,畅享飞船的豪华和超越\n"
        "船上有小狗小猫,还有比它们更稀罕的宠物\n"
        "你们将梦幻般地穿越浩渺太空中的一条时光隧道。"
    ]


    def enter(self):
        print(Ship.quips[randint(0, len(self.quips)-1)])

        timu = input("> ")

        if timu == "洲际飞船":
            print(dedent("""
                题目:洲际飞船旅行记
                这里是梦幻空间旅行总社刚刚投放的洲际飞船
                这全新飞船新奇无比的舱内奇观带你跨越欧亚
                这里是游戏的天堂
                这里有旅行的极致
                """))

            writor = input("> ")

        if writor == "namezhou":
               print(dedent("""
                   游戏作者namezhou,仿照笨办法学习练习43为巩固练习
                   题的基本知识而作。游戏思路为:一条洲际飞船欧亚互动,
                   飞行中遇野蛮人劫持,游客先用灭蛮网和板抵挡劫持。后用
                   方向板让飞船正常飞行。野蛮人因为愚蠢终败。飞船经历
                   了从广州到法兰克福,又从法兰克福回广州的洲际经历。
                   """))

               return 'central_corridor'


        elif writor == "noname":
               print("下一个场景")

               return 'central_corridor'

        else:
               return 'central_corridor'


class CentralCorridor(Scene):

    def enter(self):
        print(dedent("""
              旅行总是有风险的,这条飞船不幸被野蛮人盯上了。
              它们藏在船内,要劫持这条船。要保证船上游客的安全,
              必须赶走这些野蛮人,把它们赶到船外的sky之中
              到主控舱去吧,那里有抵抗野蛮人的武器。

              丑陋愚蠢但力大无穷的野蛮人,需要智慧的工具制服。
              正好飞船主控舱有这样的智慧工具,一组灭蛮网,
              灭蛮网套住野蛮人的手,就会自动地把他们抛到sky,
              行动吧,找到那些灭蛮网,套住劫持的野蛮人。
              """))

        action = input("> ")

        if action == "灭蛮网":
            print(dedent(""""
                  迅速地找到灭蛮网,再对准野蛮人。野蛮人自己也不知道,
                  它们为什么要劫持这条旅行飞船。你的灭蛮网应该很有
                  作用,一定能够制服这些野蛮人的。这个世界真的很奇怪
                  ,这条飞船和野蛮人几乎就没有任何关系,不知是招谁惹谁
                  了。让他们愚蠢去吧,这个世界很多愚蠢没有道理,如果有道理
                  ,怎么会称其为愚蠢呢?
                  """))

            return 'central_corridor'

        elif action == "暂离":
            print(dedent("""
                  找到灭蛮网了,对着野蛮人丢过去,它们很蠢,
                  会去抓住它,只要碰到,它们就被网住了。
                  瞬间,这网就有一股巨大的推力,把他们推入sky
                  如果找不到这个灭蛮网,那你就只有暂时逃离了
                  """))

            return 'central_corridor'

        elif action == "读书":
            print(dedent(""""
                  快打开书,只要记住拿什么东西就找到办法了
                  注意哟,书中在告诉你如何猜密码呢。
                  """))
            return 'central_corridor'

        else:
            print("重新开始吧")
            return 'safepod'

class SafePod(Scene):

    def enter(self):
        print(dedent("""
              飞船实验室仿佛先知一般已经料想到劫持了,
              大门自动打开,那本要找的书就在门口,
              去找灭蛮板吧,找到灭蛮板,按照书中教你的
              密码方式打开板密码,野蛮人就赶出了飞船,
              你们就安全了。如果运气太差,那就有点磨难了。
              """))

        codecombine = f"{randint(1, 9)} {randint(1, 9)} {randint(1, 9)}"
        guess = input("[keypad]> ")
        guesses = 0
        code = 222

        while guess != code and guesses < 3:
            print("BZZZZEDDD")
            guesses += 1
            guess = input("[keypad]> ")

        if guesses == code:
            print(dedent("""
                  那个容器给点开了,封条也裂开了,香气溢出。
                  灭蛮板就在你手中,你使劲全力跑到主控舱,
                  你得把那个灭蛮板板对准野蛮人。但那不是很容易的事情。
                  要它们飞出飞船,还有路要走。
                  """))
            return 'the_bridge'
        else:
            print(dedent("""
                  灭蛮板的发声器会发出响声,你听到一声下沉
                  熔断的声响。你也许能够看到,野蛮人还在那里,
                  灭蛮板因为没有密码,无法发挥作用,你懵了。
            """))
            return 'the_bridge'


class TheBridge(Scene):

    def enter(self):
        print(dedent("""
              你夹带着灭蛮板冲进了主控舱,野蛮人惊呆了,
              它们正竭力控制这个飞船。野蛮人中的每一个人都浑身
              黑毛,赤发圆眼,面目狰狞。当这些野蛮人看到你胁下
              夹带着那个灭蛮板之时,它们都没有来得及
              抽出它们的武器,它们不知道这个板是什么东西。
              """))

        action = input("> ")

        if action == "灭蛮板":
            print(dedent("""
                  飞船旅客和野蛮人对峙起来,你把灭蛮板朝向野蛮人,
                  舱门有点跳动起来。正当你准备启动灭蛮板功能之时,
                  你背后有一个野蛮人从右边冲来。你被打晕了,
                  但你同时也看到,另一个野蛮人正试图取走你手中
                  的灭蛮板。
                  """))
            return 'escape_pod'

        elif action == "寻找方向板":
            print(dedent("""
                  野蛮人看到你拿着灭蛮板走过来,你把灭蛮板朝向
                  它们的手,开始了抵抗劫持的拼死搏斗。很快,灭蛮板
                  扣住了野蛮人的手。你猛击身上的灭蛮板遥控器,灭蛮板
                  启动了,野蛮人在灭蛮板的动力之下,飞向飞船的一个制服
                  劫持的舱门,舱门打开了,野蛮人全都赶出飞船,进入sky,
                  野蛮人的劫持失败了。
                  """))
            return 'escape_pod'
        else:
            print("天啊")
            return 'escape_pod'


class EscapePod(Scene):

    def enter(self):
        print(dedent("""
              野蛮人打退,新问题却产生了。飞船在打斗中,那个指引航程
              的方向板给打坏了,必须有新的方向板才能正常飞行。
              存放方向板的地方,游客全都懵了。5个方向板就摆在那里,
              但这些方向板不是全都完好无损,仅有一个方向板可用。
              总共有5个方向板,你拿走哪一个呢?
              又有一次猜测,如何猜呢?
              """))

        good_pod = randint(1, 5)
        guess = input("[pod #]> ")
        action = input("> ")

        if int(guess) != good_pod:
            print(dedent("""
                  你拿错了方向板,它是坏的不是好的。按动方向板启动按钮。
                  方向板弹跳到一个谁也不知的方向,接之,船体在空中
                  停滞滑行,不知该飞向何方,飞船游客又一次懵了。
                  """))
            return 'escape_pod'

        elif action == "take them all":
            print(dedent("""
                  你拿到了全部5个方向板,全按动弹开按钮。有一个方向板
                  很轻巧地指向法兰克福方向,洲际飞船开始从亚洲的西部
                  向西飞行,你透过飞船的舷窗西望,云彩雪山,阳光晚霞,
                  一幅幅美轮美奂的图景。夜幕将临之际,还有闪烁的星群。
                  法兰克福就在脚下,飞船胜利登录欧洲。
                  """))
            return 'finished'

        else:
            print(dedent("""
                  你拿到了唯一的一个好方向板,完美极了。按动方向板
                  按钮,它很轻巧地指向广州方向,飞船从欧洲的东部继续
                  向东飞行,你透过飞船的舷窗东望,长江黄河,泰山昆仑,
                  壮美河山尽收眼底。夜幕将临之际,妖艳的高塔匹配闪烁的星群。
                  白云机场就在脚下,飞船胜利登录广洲。
                  """))
            return 'finished'


class Finished(Scene):

    def enter(self):
        print("You win! Good job.")

        GreatEnd = input("> ")

        if GreatEnd == "奇妙的洲际旅行":
            print(dedent("""
                  旅行真好!!
                  我们回来了!!
                  我们还要旅行!!
                  """))

            return 'finished'


class Map(object):

    scene = {
        'ship': Ship(),
        'central_corridor': CentralCorridor(),
        'safepod': SafePod(),
        '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.scene.get(scene_name)
        return val

    def opening_scene(self):
        return self.next_scene(self.start_scene)

a_map = Map('ship')
a_game = Engine(a_map)
a_game.play()
###原文链接:https://blog.csdn.net/weixin_41670255/article/details/106590985

练习ex45的执行结果

在这里插入代码片SyntaxError: invalid syntax
PS C:\Users\lenovo\1pythonw> python ex45test4.py
        题目:洲际飞船的旅客和野蛮人
欢迎来到这个穿越欧亚太空的洲际飞船
你们将从广州到法兰克福,或者从法兰克福飞到广州
一次美妙无比的洲际旅行,畅享飞船的豪华和超越
船上有小狗小猫,还有比它们更稀罕的宠物
你们将梦幻般地穿越浩渺太空中的一条时光隧道。
> 洲际飞船

题目:洲际飞船旅行记
这里是梦幻空间旅行总社刚刚投放的洲际飞船
这全新飞船新奇无比的舱内奇观带你跨越欧亚
这里是游戏的天堂
这里有旅行的极致

> noname
下一个场景

旅行总是有风险的,这条飞船不幸被野蛮人盯上了。
它们藏在船内,要劫持这条船。要保证船上游客的安全,
必须赶走这些野蛮人,把它们赶到船外的sky之中
到主控舱去吧,那里有抵抗野蛮人的武器。

丑陋愚蠢但力大无穷的野蛮人,需要智慧的工具制服。
正好飞船主控舱有这样的智慧工具,一组灭蛮网,
灭蛮网套住野蛮人的手,就会自动地把他们抛到sky,
行动吧,找到那些灭蛮网,套住劫持的野蛮人。

> 灭蛮网
"
                  迅速地找到灭蛮网,再对准野蛮人。野蛮人自己也不知道,
                  它们为什么要劫持这条旅行飞船。你的灭蛮网应该很有
                  作用,一定能够制服这些野蛮人的。这个世界真的很奇怪
                  ,这条飞船和野蛮人几乎就没有任何关系,不知是招谁惹谁
                  了。让他们愚蠢去吧,这个世界很多愚蠢没有道理,如果有道理
                  ,怎么会称其为愚蠢呢?


旅行总是有风险的,这条飞船不幸被野蛮人盯上了。
它们藏在船内,要劫持这条船。要保证船上游客的安全,
必须赶走这些野蛮人,把它们赶到船外的sky之中
到主控舱去吧,那里有抵抗野蛮人的武器。

丑陋愚蠢但力大无穷的野蛮人,需要智慧的工具制服。
正好飞船主控舱有这样的智慧工具,一组灭蛮网,
灭蛮网套住野蛮人的手,就会自动地把他们抛到sky,
行动吧,找到那些灭蛮网,套住劫持的野蛮人。

> 暂离

找到灭蛮网了,对着野蛮人丢过去,它们很蠢,
会去抓住它,只要碰到,它们就被网住了。
瞬间,这网就有一股巨大的推力,把他们推入sky
如果找不到这个灭蛮网,那你就只有暂时逃离了


旅行总是有风险的,这条飞船不幸被野蛮人盯上了。
它们藏在船内,要劫持这条船。要保证船上游客的安全,
必须赶走这些野蛮人,把它们赶到船外的sky之中
到主控舱去吧,那里有抵抗野蛮人的武器。

丑陋愚蠢但力大无穷的野蛮人,需要智慧的工具制服。
正好飞船主控舱有这样的智慧工具,一组灭蛮网,
灭蛮网套住野蛮人的手,就会自动地把他们抛到sky,
行动吧,找到那些灭蛮网,套住劫持的野蛮人。

> 读书
"
                  快打开书,只要记住拿什么东西就找到办法了
                  注意哟,书中在告诉你如何猜密码呢。


旅行总是有风险的,这条飞船不幸被野蛮人盯上了。
它们藏在船内,要劫持这条船。要保证船上游客的安全,
必须赶走这些野蛮人,把它们赶到船外的sky之中
到主控舱去吧,那里有抵抗野蛮人的武器。

丑陋愚蠢但力大无穷的野蛮人,需要智慧的工具制服。
正好飞船主控舱有这样的智慧工具,一组灭蛮网,
灭蛮网套住野蛮人的手,就会自动地把他们抛到sky,
行动吧,找到那些灭蛮网,套住劫持的野蛮人。

>
重新开始吧

飞船实验室仿佛先知一般已经料想到劫持了,
大门自动打开,那本要找的书就在门口,
去找灭蛮板吧,找到灭蛮板,按照书中教你的
密码方式打开板密码,野蛮人就赶出了飞船,
你们就安全了。如果运气太差,那就有点磨难了。

[keypad]> 3
BZZZZEDDD
[keypad]> 5
BZZZZEDDD
[keypad]> 9
BZZZZEDDD
[keypad]> 6

灭蛮板的发声器会发出响声,你听到一声下沉
熔断的声响。你也许能够看到,野蛮人还在那里,
灭蛮板因为没有密码,无法发挥作用,你懵了。


你夹带着灭蛮板冲进了主控舱,野蛮人惊呆了,
它们正竭力控制这个飞船。野蛮人中的每一个人都浑身
黑毛,赤发圆眼,面目狰狞。当这些野蛮人看到你胁下
夹带着那个灭蛮板之时,它们都没有来得及
抽出它们的武器,它们不知道这个板是什么东西。

> 222
天啊

野蛮人打退,新问题却产生了。飞船在打斗中,那个指引航程
的方向板给打坏了,必须有新的方向板才能正常飞行。
存放方向板的地方,游客全都懵了。5个方向板就摆在那里,
但这些方向板不是全都完好无损,仅有一个方向板可用。
总共有5个方向板,你拿走哪一个呢?
又有一次猜测,如何猜呢?

[pod #]> 5
> 2

你拿错了方向板,它是坏的不是好的。按动方向板启动按钮。
方向板弹跳到一个谁也不知的方向,接之,船体在空中
停滞滑行,不知该飞向何方,飞船游客又一次懵了。


野蛮人打退,新问题却产生了。飞船在打斗中,那个指引航程
的方向板给打坏了,必须有新的方向板才能正常飞行。
存放方向板的地方,游客全都懵了。5个方向板就摆在那里,
但这些方向板不是全都完好无损,仅有一个方向板可用。
总共有5个方向板,你拿走哪一个呢?
又有一次猜测,如何猜呢?

[pod #]> 3
> 灭蛮板

你拿错了方向板,它是坏的不是好的。按动方向板启动按钮。
方向板弹跳到一个谁也不知的方向,接之,船体在空中
停滞滑行,不知该飞向何方,飞船游客又一次懵了。


野蛮人打退,新问题却产生了。飞船在打斗中,那个指引航程
的方向板给打坏了,必须有新的方向板才能正常飞行。
存放方向板的地方,游客全都懵了。5个方向板就摆在那里,
但这些方向板不是全都完好无损,仅有一个方向板可用。
总共有5个方向板,你拿走哪一个呢?
又有一次猜测,如何猜呢?

[pod #]> 4
> 寻找方向板

你拿到了唯一的一个好方向板,完美极了。按动方向板
按钮,它很轻巧地指向广州方向,飞船从欧洲的东部继续
向东飞行,你透过飞船的舷窗东望,长江黄河,泰山昆仑,
壮美河山尽收眼底。夜幕将临之际,妖艳的高塔匹配闪烁的星群。
白云机场就在脚下,飞船胜利登录广洲。

You win! Good job.
> take them all

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值