贪食蛇游戏的结构程序设计流程

关于游戏的介绍:
贪食蛇游戏是一条不停游动的蛇不断的捕食来达到自身的增长,但是若蛇碰到自身的身体或者碰到了任何障碍物,则游戏结束。
在该篇文章中,我并不讨论游戏的规则,而只是实现一个游动的蛇。通过该实现来看关于面向对象的设计。
寻找规律,建立对象模型:
首先从物理的角度来分析蛇得运动规律。它是蠕动的,像水一样流动。他有个特性就是身体的每一个点都经过他头部所在的点,他每一个时刻骨节所要运动的目的地是他前一个骨节所在的位置。
不难看出,其中的对象模型为:蛇,骨骼,骨节,头。抽象的接口为:蛇,骨骼,骨节,头,图元。
结构图:

接口结构图


对象结构图

给接口添加行为:
图元(GraphicObject)
绘画:进行图元自身的绘画操作
当前矩形:得到图元当前所在的矩形,也可考虑使用region,这样使得对图元范围得描述更加具体。
骨节(Condyle)
前一个骨节:提供前序访问
后一个骨节:提供后序访问
流动:进行骨节运动诡计得计算。
骨骼(Cadre)(管理骨节链)
得到头:得到蛇头
得到尾:得到蛇尾
新增骨节:在骨节链中新增骨骼
删除骨节:在骨节链中删掉指定骨节
头(head)
方向:能够设定和访问当前运动方向。
蛇(Snake)
增长:蛇进行自身得增长
完善模型,引入访问者模式
存在的问题:
当前是由具体的骨骼对象来负责图元的绘画以及处理流动的,而骨骼只是管理骨节,没有提供任何访问骨节的方法,我们应该怎样访问骨节呢?比如我们要每个骨节画出自己的形态,我们可能会这样做。在骨骼上提供一个绘画方法,然后通过遍历骨节链,调用每个骨节的绘画方法。这样似乎可以解决问题。那么,我们要进行骨节流动计算呢?我们再在骨骼上提供流动方法,然后同样的遍历骨节,调用每个的流动方法。我们要是加入统计骨节个数功能呢?我们要是加入其他的需要遍历骨骼的方法呢?……
这样做的缺点是什么?
1、 相似的代码有多份
2、 如果骨节的访问结构发生变化,后果会怎样?
3、 有新功能需要遍历骨节链该怎么办?
这样会迫使我们拷贝代码.
解决办法,引入访问者模式:
新增加接口如下:

加入行为:
访问者:(空,无方法,属性)
被访问者:
接受访问者
骨节访问者:继承自访问者
访问骨节
完整的结构图:

接口结构图:

对象结构图:

posted @ 2009-02-01 21:42  YoKing  阅读(1398)  评论(0编辑  收藏  举报