【“笨办法”学Python】43.基本的面向对象分析和设计——自顶向下、自底向上

【“笨办法”学Python】43.基本的面向对象分析和设计——自顶向下、自底向上,第1张

【“笨办法”学Python】43.基本的面向对象分析和设计——自顶向下、自底向上

43.基本的面向对象分析和设计


文章目录

前言一、解决问题的方法——流程

1、自顶向下(top down)2、自底向上 二、代码示例三、运行Python程序总结


前言

  使用Python,尤其是通过面向对象编程(OOP)方式构建一些东西的流程。


一、解决问题的方法——流程

  所谓按照流程就是遵循一系列的步骤,但是并不意味着对每个不同的问题都要用这个步骤,也并不意味着这个步骤总是能起作用。这些步骤只是解决很多编程问题的一个很好的起点,并不是解决这类问题的唯一方法。

1、自顶向下(top down)

  自顶向下(top down)的过程一般是从做抽象的概念(顶层)开始,一直向下做到具体的代码实现。具体流程如下:
(1) 把要解决的问题写下来,或者画出来
(2) 将第一条中的关键概念提取出来并加以研究
(3) 创建一个类层次结构和对象图
(4) 用代码实现各个类,并写一个测试来运行它们
(5) 重复上述步骤并细化代码

2、自底向上

  自底向上就是先从代码开始,一直向上做到抽象概念。具体流程如下:
(1) 取出要解决的问题中的一小块,写一些代码让它基本可以工作
(2) 加上类和自动测试,细化代码让他更为正式
(3) 把关键概念抽取出来然后研究它们
(4) 把真正需要实现的东西描述出来
(5) 回去细化代码,有可能需要全部丢弃从头做起
(6) 在问题的另一小块里重复上述流程


二、代码示例

  《来自Peracl 25号行星的哥顿人》的代码:

#coding:utf-8
from sys import exit
from random import randint
from textwrap import dedent

class Scene(object):

    def enter(self):
        print("此场景尚未配置!")
        print("子类化它并实现enter().")
        exit(1)

class Engine(object):

    def __init__(self,scene_map):   #scene_map是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()         #返回的都是场景的类对应的key
            current_scene = self.scene_map.next_scene(next_scene_name)
        current_scene.enter()

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 (dedent("""
        Percal25号行星的哥顿人入侵了你的飞船,摧毁了你的全体船员。
        你是最后一个幸存的成员,你的最后一个任务是从武器库取出中子毁灭性炸d,放在舰桥上,进入逃生舱后炸毁飞船。
        你正沿着通往武器库的中央走廊奔跑,这时一个哥顿人跳了出来,皮肤发红,牙齿发黑,邪恶的小丑服装在他那带帽的身体上飘荡。
        他堵住了军械库的门,准备拔出武器来炸你.
        """))

        action =input("> ")

        if action == "shoot":
            print (dedent("""
            快速抽签,即可取出爆破器并向Gothon发射。
            他的小丑服装在他的身上四处流动,这使你无法瞄准。
            你的激光打中了他的服装,但完全没有击中他。
            这完全毁了他母亲买给他的崭新服装,这使他疯狂地飞起来,反复地对着你炸开,直到你死了。
            然后他吃了你。
            """))
            return "death"

        elif action == "dodge":
            print (dedent("""
            就像一个世界级的拳击手,你躲闪、编织、滑动和滑动,就像哥顿的爆破者用激光从你的头上划过一样。
            在你的巧妙的中间,你的脚滑倒,你的头撞到精神墙上,昏倒了。
            你醒来后不久就死了,因为哥顿跺着你的头吃了你
            """))
            return "death"

        elif action == "tell a joke":
            print (dedent("""
            幸运的是,它们使您在学院里学习了哥德的侮辱。
            你讲了一个你知道的Gothon笑话:Lbhe zbgure vf fb sng , jura fur fgf nebhag gur ubhfrfur fgf nebhag gur ubhfr .
            Gothon停了下来,试着不笑,然后突然大笑起来,动d不得。
            当他在笑的时候,你跑上前朝他头部开了一q,把他打倒在地,然后跳过武器库的门。
            """))
            return "laser_weapon_armory"

        else:
            print ("别想了")
            return 'central_corridor'

class LaserWeaponArmory(Scene):

    def enter(self):
        print (dedent("""
        你向武器库俯冲,蹲下并扫视房间,寻找更多可能藏匿的哥顿人。
        这里死气沉沉的,太安静了。 你站起来,跑到房间的另一边,发现中子d在它的容器里。
        盒子上有个小键盘锁,你需要密码才能把炸d取出来。
        如果你把代码错了10次,那么锁就会永远关闭,你就拿不到炸d了。
        密码是3位数字
        """))

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

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

        if guess == code:
            print (dedent("""
            容器咔嗒一声打开,密封破裂,释放气体。
            你抓住中子d,尽可能快地跑到桥上,你必须把它放在正确的位置。
            """))
            return "the_bridge"

        else:
            print (dedent("""
            锁最后一次嗡嗡作响,然后当机械融合在一起时,你会听到一种令人恶心的融化的声音。
            你决定坐在那里,最后哥特人炸毁了他们的船,你就死定了。
            """))
            return "death"

class TheBridge(Scene):

    def enter(self):
        print (dedent("""
        你手臂下夹着尼特龙自毁炸d冲进舰桥,让5个试图控制飞船的哥特人大吃一惊。
        他们每个人都有比上一个更丑的小丑服装。
        他们还没有拿出武器,因为他们看到你腋下的炸d很活跃,不想引爆它。
        """))
        action = input("> ")

        if action == "throw the bomb":
            print (dedent("""
            你惊慌失措地把炸d扔给一群哥特人,然后向门口扑去。
            就在你掉下去的时候,一个哥顿朝你的后背开q杀了你。
            当你死后,你看到另一个哥特人疯狂地试图解除炸d的武装。
            你死的时候知道他们很可能会在它爆炸的时候降落。
            """))
            return "death"

        elif action == "slowly place the bomb":
            print (dedent("""
            你用爆能q指着腋下的炸d,哥特人举起手开始出汗。
            你向后退一步,打开门,然后小心地把炸d放在地板上,用爆炸机对准它。
            然后你从门里跳回来,按一下关门按钮,然后打开门锁,这样哥特人就不能出去了。
            既然炸d放好了,你就跑去逃生舱,从这个罐头罐上下来。
            """))
            return "escape_pod"

        else:
            print("别想了")
            return "the_bridge"

class EscapePod(Scene):

    def enter(self):
        print (dedent("""
        你拼命地冲过船,试图在整个船爆炸之前使其到达逃生舱。
        似乎船上几乎没有哥特人,因此你的奔跑没有干扰。
        你带着逃生舱进入密室,现在需要选择一个来逃生。
        其中一些可能已损坏,但您没有时间看。
        有5个吊舱,您要拿哪一个?
        """))

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


        if int(guess) != good_pod:
            print (dedent("""
            你跳进 {guess} 号逃生仓,按下了d出按钮
            吊舱从太空中逃出来,然后在船体破裂时内爆,把你的身体压成果酱果冻。
            """))
            return "death"

        else:
            print (dedent("""
            你跳入吊舱(猜猜)并按下d出按钮。
            太空舱很容易滑入太空,向下面的行星前进。
            当它飞向这个星球时,你回过头来,看到你的飞船内爆,然后像一颗明亮的恒星一样爆炸,同时把哥顿飞船炸掉。你赢了!
            """))
            return "finished"

class Finished(Scene):

    def enter(self):
        print("你赢了!干得漂亮!!!")
        return "finished"

class Map(object):

    scenes = {
        'death':Death(),
        'central_corridor':CentralCorridor(),
        'laser_weapon_armory':LaserWeaponArmory(),
        '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.scenes.get(scene_name)
        return val                                  # 返回scenes字典中所有对应的类

    def opening_scene(self):
        return self.next_scene(self.start_scene)    # 返回开始场景在scenes字典中对应的类


a_map = Map('central_corridor')
# print(a_map)
a_game = Engine(a_map)
a_game.play()


三、运行Python程序

  在Window上键入Python就可以看到结果。依次输入:tell a joke 、密码 、slowly place the bimb 、救生吊舱号码,就能获得游戏胜利!

python ex43.py


总结

  以上内容介绍了基本的面向对象分析和设计,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5701519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存