浅谈贪吃蛇的设计及算法

平时看起来小小的贪吃蛇做起来也是很需要思考的。

先看下贪吃蛇游戏的一些设定:
1.地图:我们假定地图为12*12,其中中间10*10为蛇可以走的区域,其余周边为墙。
2.蛇:包括蛇头和蛇身
3.食物:路径上会出现一个食物,被吃掉后会重新随机生成。

比起面向对象编程的construct2,用面向过程的C语言写起来自然更有难度。我们先用置顶向下的方法分析一下贪吃蛇程序所需的代码。

0.主程序
WHILE !gameover
Input ch
direct snake to ch
IF eat food
snake grows
END IF
END WHILE

1.打印游戏界面
我们将整个游戏地图(包括墙,空地,蛇和食物)储存在一个二维数组里。然后逐行进行打印即可。当数组里的数据不断更新,我们不断清屏打印地图出来时,就可以让人的眼睛以为是连续的动画画面。
浅谈贪吃蛇的设计及算法_第1张图片

2.控制蛇移动
我们通过键盘上的”WSAD”来对应蛇移动方向的“上下左右”。

然后在蛇走之前先判断蛇的下一步是什么,如果是墙或者是自己的身体,则让蛇死亡,如果是食物则让蛇长长一节。

蛇移动的算法:
在蛇的新蛇头的坐标储存 ‘H’,将旧蛇头设置为蛇身 ‘X’,接着将蛇尾抹去,即置为空 ’ ‘;

3.放置食物
我们采用随机函数来产生食物的坐标,若新的坐标上已有物体,则重新生成
浅谈贪吃蛇的设计及算法_第2张图片

智能蛇

但是这样的贪吃蛇并不能自己移动,所以我们得借助kbhit函数。该函数能检查是否有键盘输入但是不阻止weile循环的继续,这样蛇就能动了。
浅谈贪吃蛇的设计及算法_第3张图片

此外,我们还可以写一个让蛇自动跑的智能算法。
让蛇判断四个方向哪个是可行的并且能最快到达食物。
可以参考一个曼哈顿距离:
浅谈贪吃蛇的设计及算法_第4张图片

图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。曼哈顿距离示意图在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的欧氏距离(欧几里德距离:在二维和三维空间中的欧氏距离的就是两点之间的距离),则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。

浅谈贪吃蛇的设计及算法_第5张图片

你可能感兴趣的:(日记)