上一篇博客中我们简单实现了如何用C语言编写一个简易的贪吃蛇,具体实现代码可以见用C语言设计贪吃蛇 ,并提到了可以使贪吃蛇具有“智能”,使其能够自动寻找食物。下面我们来看看如何实现这一功能
设计思路如下:
定义一个函数,用于判断蛇的下一步该往哪个方向走
函数伪代码如下:
function whereGoNext(Hx,Hy,Fx,Fy) // Hx,Hy: 头的位置,Fx,Fy:食物的位置
{
用数组movable[4]={“a”,”d”,”w”,”s”} 记录可走的方向
用数组distance[4]={0,0,0,0} 记录离食物的距离
分别计算蛇头周边四个位置到食物的距离。
例如:distance[0] = |Fx – (Hx-1)| + |Fy – Hy|
如果 Hx-1,Hy 位置不是Blank,则 distance[0] = 9999
选择distance中存最小距离的下标p,注意最小距离不能是9999
返回 movable[p]
}
具体代码如下
char whereGoNext(int Hx, int Hy, int Fx, int Fy)
{
int i;
int min = 9998,p=0;
if (map[Hy][Hx - 1] != BLANK_CELL && map[Hy][Hx - 1] != SNAKE_FOOD)
distance[0] = 9999;
else
distance[0] = abs(Fx - (Hx - 1)) + abs(Fy - Hy);
if (map[Hy - 1][Hx] != BLANK_CELL && map[Hy - 1][Hx] != SNAKE_FOOD)
distance[1] = 9999;
else
distance[1] = abs(Fx - Hx) + abs(Fy - (Hy - 1));
if (map[Hy + 1][Hx] != BLANK_CELL && map[Hy + 1][Hx] != SNAKE_FOOD)
distance[2] = 9999;
else
distance[2] = abs(Fx - Hx) + abs(Fy - (Hy + 1));
if (map[Hy][Hx + 1] != BLANK_CELL && map[Hy][Hx + 1] != SNAKE_FOOD)
distance[3] = 9999;
else
distance[3] = abs(Fx - (Hx + 1)) + abs(Fy - Hy);
for (i = 0; i < 4; i++)
{
if (min > distance[i])
{
min = distance[i];
p = i;
}
}
return movable[p];
}
完成这一函数后,只需将原代码判断键盘输入并定义方向的部分删去,再将此函数插入即可!(别忘了加上 math.h 头文件)这样,会自动寻找食物的“智能”蛇就完成了!不过这一算法存在缺陷,经常走着走着就把自己绕进去死掉了!
由于课程要求,本次实验需要在Linux中完成。所以我们需要将我们的代码做如下修改:
1、把原来的清屏函数 system(“cls”) 改为 printf(“\033[2J”) 对此不熟悉的网友们可以参见 C语言与VT100控制码编程
2、把原来的控制速度函数Sleep()改为sleep(),同时把头文件 windows.h 改为 unistd.h ,需要注意的是Sleep()的单位是毫秒,而sleep()的单位是秒
这样,我们的程序基本就可以在Linux环境下运行了!
本人初学C语言不久,若有错误,还望指出,不胜感激!