智能蛇——自己找食物吃的貪吃蛇

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章