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