貪吃蛇的實現及其簡單AI設計

2021-07-10 02:36:23 字數 2073 閱讀 2498



設計要求:用**實現經典遊戲貪吃蛇,要求蛇能夠按使用者的輸入做出相應的上下左右行進動作,獲取食物,記錄得分;並以此為基礎設計簡單

ai,要求該

ai能夠在遊戲中自動尋路,並得到盡量高的分數。

作為經典的乙個小遊戲,貪吃蛇的實現較為簡單,但其

ai設計比較複雜,需要考慮多種情況,主要在於蛇對路徑的分析及如何獲取食物,在這方面需要多花時間。

先把蛇和食物做成類,然後在裡面新增成員變數和函式,描述蛇的狀態資訊和行為方法,在主函式裡面呼叫方法來實現貪吃蛇。

然後新增適當的函式並運用恰當的演算法實現

ai,主要考慮用

bfs演算法找出蛇頭到食物的路徑,但在某些情況下蛇頭到食物並沒有路徑,這是需要再利用

bfs找出蛇頭到蛇尾的路徑,每走一步,嘗試去找蛇頭到食物的路徑,有的話就去,沒有就接著追蛇尾。但在一些特殊情況下,蛇頭到食物和蛇尾均沒有路徑,這時就讓蛇頭在可行的區域「閒逛「,並不斷嘗試去找路徑,直到找到為止。

用鍊錶來表示蛇:

typedef int elemtype;

typedef struct lnode

lnode,*linklist;

用佇列來實現bfs尋路演算法:

typedef struct

qpoint;

typedef struct

sqqueue;

用棧來儲存路徑資訊:

typedef struct points

selemtype,point;//路徑中點的位置資訊

typedef struct stack

sqstack;

food類的實現:

class food

snake類的實現:

class snake

其他函式:

void reinit();//對遊戲資料的更新

int bfs(int x,int y,int a,int b);/*尋找從點(x,y)到(a,b)的路徑,若存在,則返回1,並將路徑儲存在棧中,若不存在則返回0*/

int searchchange();//在ai設計中通過計算返回蛇應該運動的方向

void initgame();//初始化遊戲

在此過程中,遇到過乙個比較大的困難,在用

bfs找到食物後,沒法讓蛇頭按照找到的路線去吃食物,後來我想到乙個方法,原先的

chess

陣列僅用來儲存點是否被訪問過的資訊,

1表示訪問過,

0表示未訪問,我把

chess

的功能拓展了,

0表示未訪問,非

0表示訪問過了,其中

1表示該節點的父節點在其上方,

2表示在下方,

3右方,

4左方,也就是

chess

陣列在原有功能的基礎上還可以儲存路徑資訊,使得蛇頭的尋路得以實現。

雖然現在蛇能夠較好的自動尋路,且得到

200以上的分數,但是這並不是該

ai的終點,還可以更深的挖掘,在

ai控制下蛇死亡是因為在

wander

是無路可走,對於這個問題,我心裡有了大致的解決方案:每次在按bfs演算法得出的路徑運動前都用一條「虛擬的蛇「去探路,然後看這條蛇在吃完食物後,有沒有路可走了,如果沒有路就不去吃食物,而是去追蛇尾或者「閒逛」。當然目前還是個演算法雛形,待我日後實現。

貪吃蛇 AI 的實現 snake AI

這次我們嘗試用 來模擬下,說不定上面這個圖就是計算機搞的。物理上給人的感覺是整個貪吃蛇往右移了一步,在貪吃蛇非常長的情況下給人的感覺移一步要做很多事情。但是在計算機中我們可以簡單的考慮貪吃蛇的移動,假設用乙個陣列來儲存所有組成貪吃蛇的格仔,那麼移動一步,就是把將來的格仔插入到這個陣列的頭部,然後再去...

簡單的「貪吃蛇」

近日無事,看見很多地方有人在詢問貪吃蛇程式的做法,剛好我前段時間在公司做手持終端應用開發時,利用乙個午休時間自己也寫了個貪吃蛇程式玩玩,效果和手機 遊戲機上一樣,但是程式是在公司電腦上,由於資訊保安,是拷不出來的,這裡就給大家講講如何寫貪吃蛇程式吧。其實貪吃蛇遊戲程式是很簡單的,只要大家坐下來細心地...

實現貪吃蛇

貪吃蛇 1.它的移動我們採用頭部加乙個尾巴減乙個 2.我們將view的大小分成很多個格仔 3.蛇的移動是以乙個格仔為單位 created by administrator on 2016 10 11.public class gameview extends view public gameview...