上一篇博客中我們簡單實現瞭如何用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語言不久,若有錯誤,還望指出,不勝感激!