歡迎加入我們的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