|
|
引子: 怎样移动蛇身体,先不考虑绘制
在贪食蛇游戏中,蛇有N个身体块(先不考虑头部),当蛇移动时,身体一块一块的向前移动,简化下问题,用一个矩形来表示蛇的一块身体部分,下面来考虑怎样移动蛇
概要:
为蛇的身设计数据结构,设计一个函数,功能是移动蛇.
代码级别:
简化下蛇身由一块矩形表示,那么移动了蛇身也就相当与移动矩形的位置,可以用两个基本类型变量表示(比如两个int),我们把它称为位置数据吧.这样整个蛇身体就用一个位置数据数组表示.
另外补充下(和主题没多大关系,但为了蛇身的完整性,所以..),每块身体形状相同,所以矩形大小相同,可以只用两个基本数据表示它的长和宽.
针对矩形位置我们用 struct {int x, int y}Location吧,正个身身体就表示成bodyLocations[N].
现在来设计我们的函数,函数功能:根据输入的x,y偏移量来修改蛇身每块的位置:
void moveBodyPart(int x, int y, Location location)
{
location.x += x;
location.y += y;
}
这个函数简单吧.
然后我们来移动整个蛇身体,我们先在相对蛇的全局变量中定义一个蛇的长度变量吧:int bodyLength.
void moveBody(int x, int y) //x,y为 body移动偏移量
{
for(int i = 0; i<bodyLength; i++)
moveBodyPart(int x, int y, bodyLocations);
}
然后你在判断键盘输入的地方使用moveBody即可完成蛇身移动;
优化:
第2个函数的for循环里频繁调用了函数moveBodyPart(...),我们把两个函数合并成一个:
void moveBody(int x, int y) //x,y为 body移动偏移量
{
for(int i = 0; i<bodyLength; i++)
{
bodyLocations.x += x;
bodyLocations.y += y;
}
}
大家讨论下这两中情况,那种要好?
1.传递数组元素给函数;
2.传递数组整体给函数;
-------------------------------------------------------------------------------------------------------------------------
进一步引出问题:
从面向对象设计出发,把每个body看成是一个对象(因为他们在逻辑上是有清晰的界限)
于是有了 class BodyPart,有了N个BodyPart对象,从上层往下层考虑问题:移动蛇身就给每个BodyPart发送移动消息,然后BodyPart调用各自的移动方法,下面简略写出代码(代码不能编译)
class Snake::moveBody(int x, int y)
{
for(int i = 0; i<bodyLength; i++)
{
m_bodys.move(x, y); //m_bodys 是一个class BodyPart数组
}
}
下面大家来思考下这两中方式的性能哪个好:
1.
class Snake::moveBody(int x, int y)
{
for(int i = 0; i<bodyLength; i++)
{
m_bodys.move(x, y);
}
}
2.
void moveBody(int x, int y) //x,y为 body移动偏移量
{
for(int i = 0; i<bodyLength; i++)
moveBodyPart(int x, int y, bodyLocations);
}
写这个我不是为了说明面向对象设计的代码性能没有面向过程的好,这里只是讨论了问题的一面或一部分,写这个只是为了解决一个大家经常遇到的问题..以后有时间我再来讲下面向对象.
时间不早了,我吃饭去了!这里讲的贪食蛇游戏不完整,大家要的话,可以问我.不过我这里目前只有两个C#版本的.
小弟功力还不深厚, 请大家点评\抨击 香蕉皮来了..闪~
|
|