笨方法学Python—ex43:基本的面向对象分析和设计

可遵循的一个流程
Python面向对象编程(OOP)方式实现东西的流程(只是你可以遵守的一种方法):
1. 把要解决的问题写下来,或画出流程图。
2. 将第一条中的关键概念摘录出来并加以研究。
3. 创建一个类和对象的层次结构图。
4. 用代码实现各个类,并写一个测试来运行它们。
5. 重复上述步骤并细化代码。

上述可看做一个“自顶向下”(top down)的流程:从很抽象的概念入手,逐渐细化,直到概念变为具体可用代码实现的东西。
简单游戏分析
利用上述流程实现一个游戏引擎和一个游戏。
游戏名称《来自Percal 25 号行星的哥顿人》,是一款空间冒险游戏。
把问题写下来或画下来
游戏描述:“外星人入侵宇宙飞船,我们的英雄需要通过各种房间组成的迷宫,打败遇到的外星人,这样才能通过救生船回到下面的行星上去。此游戏会与Zork或者Adventure类似,会用文字输出各种有趣的死法。游戏会用到一个引擎,它带动一张充满房间和场景的地图。当玩家进入一个房间时,这个房间会显示出自己的描述,并告诉引擎下一步应到哪个房间去。”

以上对游戏内容和运行方式有了一个很好的概念。下面是描述各个场景。
& 死亡(Death)。 玩家死去的场景,应比较搞笑。
&中央走廊(Central Corridor)。游戏起点,哥顿人已经在这里把守着了,玩家要讲一个笑话才能继续。
&激光武器库(Laser Weapon Armory)。 在这里英雄会找到一个中子弹,在乘坐救生飞船离开时要用它把飞船炸掉。这个房间有一个数字键盘,需猜测密码组合。
&飞船主控仓(The Bridge)。另一个战斗场景,英雄在此埋炸弹。
&救生舱(Escape Pod)。英雄逃离的场景,但需要猜对是哪艘救生船。

至此,已大概画出了它们的关系图,可能还需给每个房间写更详细的描述。
摘录和研究关键概念
有足够信息来摘录一些名词,并分析它们的类层次结构。
1)首先名词列表
外星人(Alien)
玩家(Player)
飞船(Ship)
迷宫(Maze)
房间(Room)
场景(Scene)
哥顿人(Gothon)
救生舱(Escape Pod)
行星(Planet)
地图(Map)
引擎(Engine)
死亡(Death)
中央走廊(Central Corridor)
激光武器库(Laser Weapon Armory)
主控仓(The Bridge)
可能还需摘录动词来看其是否适合做函数名(暂时跳过)。

到此,研究这些概念及其中没弄明白的部分。如,可能会通过玩类似游戏来确认其工作方式;也许会研究飞船怎样设计的,及炸弹是怎样工作的;也许还会研究一些技术细节,如怎样把游戏状态存到数据库里。
等完成这些研究后也许要回到第一步,基于学到的新东西重写游戏描述及重新摘录相关概念。
为各种概念创建类层次结构图和对象关系图
通过思考“和其他东西有哪些类似?”或“哪个其实是某个东西的另一种叫法?”
发现:1)“房间”和“场景”基本是同一个东西,在这个游戏中使用“场景”:“中央走廊”是一个场景,死亡基本也是一个场景,行星也可以是另一个场景 2) “迷宫”和“地图”基本是一个意思,用地图。3)不打算实现一个作战系统,所以“外星人”和“玩家”忽略。
然后,在文本编辑器画一个类的层次结构图。
* map
* Engine
* Scene
   * Death
   * Central Corridor
   * Laser Weapon Armory
   * The Bridge
   * Escape Pod
再然后,查看描述中的动词部分,从而知道每一样东西上需要什么样的动作。
例如,需要方法来运行游戏引擎,在地图里转到下一个场景,获得初始场景及进入下一个场景。加到结构图里。
* Map
   - next_scene
   - opening_scene
* Engine
   - play
* Scene
   -enter
   * Death
   * Central Corridor
   * Laser Weapon Armory
   * The Bridge
   * Escape Pod
scene下只添加了enter方法,因为具体场景会继承并覆盖这个方法。
编写和运行各个类
完成以上,再在编辑器里打开一个源文件,并为它编写代码。通常只需将上面的树状结构复制到源文件中,把它扩写成各个类就可以了。(初始简单例子),文件最后还包含一点简单测试。
class Scene(object):

    def enter(self):
        pass

class Engine(object):
    
    def __init__(self, scene_map):
        pass
    
    def play(self):
        pass

class Death(Scene):

    def enter(self):
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值