【遊戲算法之貪喫蛇】我想的貪喫蛇算法

歡迎加入我們的QQ羣,無論你是否工作,學生,只要有c / vc / c++ 編程經驗,就來吧!158427611 

原文地址

很久以前自己寫過貪喫蛇遊戲。。用的QT。

當時沒想太多就寫了...現在 把當時寫貪喫蛇用到的小蛇的算法大致梳理一遍。

因爲時隔一年多之久,當時用QT寫的遊戲,所以現在只能大概歸納一下了。而且可能把以前的算法優化了一下。呵呵。。。一切盡在不言中。

【代碼也附上 】


【遊戲初始化】

我的貪喫蛇把遊戲區域畫作一個二維數組,建立遊戲座標。假設 Area[x][y];

int Area[x][y] = {0};//空白區域什麼都沒有;

Area[x][y] = 1;的時候就是此座標有蛇或者有果子。

初始化的時候初始小蛇只有兩節長,位於座標系中間。


【遊戲分解】

貪喫蛇 共兩部分

【1】果子

果子的算法很簡單,就是隨機生成一個座標點,顯示果子,並排除已經有蛇的方位(Area[x][y] 已經是1的點)。

很簡單不多說了。

【2】小蛇

小蛇部分算法:簡單的說就是 正常移動情況下(頭部 + 1,尾部 - 1),喫果子的情況下(頭部  + 1 ,尾部不變);

詳細步驟:


定於小蛇身體單元結構體

struct SnakItem{

int x; //x座標

int y; //y座標

};

定義小蛇身體數組SnakBody[](Vector,其實雙向鏈表或者隊列最佳,因爲涉及前插和後刪,能前後操作方便的數據結構最佳,這裏我省事就不特別計較了);

定於小蛇身體長度int SnakLength = 2;

【a】根據上下左右方向,對小蛇的頭部進行上下左右移動,判斷是否觸及邊緣,觸及邊緣就遊戲結束;

【b】不觸及邊緣則,獲取對應方向的前進座標 Area[x][y],判斷是否和果子出現座標相同,如果不同,則是做移動操作,走【c】步驟,否則則是走【d】步驟;

【c】蛇移動情況,前進座標Area[x][y] = 1,並 生成 SnakItem實例,插入蛇身體實例頭部SnakBody.insert(0,SnakItem)位置,獲取蛇身體尾部SnakBody[SnakLegtj]的SnakItem 成員x1,y1,在x1,y1座標 Area[x1][y1] = 0,並刪除最後一個蛇身體Item。(SnakBody.ersa(最後一個))這樣完成蛇移動動作;

【d】蛇喫果子情況,一樣獲取方向前進座標Area[x][y],生成SnakItem實例,插入蛇身體頭部位置,到這裏和移動一樣,不同的是,不需要刪除尾部Item。這樣完成喫果子的動作。


算法思想就這樣啦。


把之前的【貪喫蛇遊戲】代碼附上啦

[由於現在沒有QT環境,自己也沒看着工程來解釋算法了,可能算法中提到的數據結構。算法和具體工程代碼有出入]


歡迎加入我們的QQ羣,無論你是否工作,學生,只要有c / vc / c++ 編程經驗,就來吧!158427611 

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