平時看起來小小的貪喫蛇做起來也是很需要思考的。
先看下貪喫蛇遊戲的一些設定:
1.地圖:我們假定地圖爲12*12,其中中間10*10爲蛇可以走的區域,其餘周邊爲牆。
2.蛇:包括蛇頭和蛇身
3.食物:路徑上會出現一個食物,被喫掉後會重新隨機生成。
比起面向對象編程的construct2,用面向過程的C語言寫起來自然更有難度。我們先用置頂向下的方法分析一下貪喫蛇程序所需的代碼。
0.主程序
WHILE !gameover
Input ch
direct snake to ch
IF eat food
snake grows
END IF
END WHILE
1.打印遊戲界面
我們將整個遊戲地圖(包括牆,空地,蛇和食物)儲存在一個二維數組裏。然後逐行進行打印即可。當數組裏的數據不斷更新,我們不斷清屏打印地圖出來時,就可以讓人的眼睛以爲是連續的動畫畫面。
2.控制蛇移動
我們通過鍵盤上的”WSAD”來對應蛇移動方向的“上下左右”。
然後在蛇走之前先判斷蛇的下一步是什麼,如果是牆或者是自己的身體,則讓蛇死亡,如果是食物則讓蛇長長一節。
蛇移動的算法:
在蛇的新蛇頭的座標儲存 ‘H’,將舊蛇頭設置爲蛇身 ‘X’,接着將蛇尾抹去,即置爲空 ’ ‘;
3.放置食物
我們採用隨機函數來產生食物的座標,若新的座標上已有物體,則重新生成
智能蛇
但是這樣的貪喫蛇並不能自己移動,所以我們得藉助kbhit函數。該函數能檢查是否有鍵盤輸入但是不阻止weile循環的繼續,這樣蛇就能動了。
此外,我們還可以寫一個讓蛇自動跑的智能算法。
讓蛇判斷四個方向哪個是可行的並且能最快到達食物。
可以參考一個曼哈頓距離:
圖中紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離,而藍色和黃色代表等價的曼哈頓距離。曼哈頓距離——兩點在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|。對於一個具有正南正北、正東正西方向規則佈局的城鎮街道,從一點到達另一點的距離正是在南北方向上旅行的距離加上在東西方向上旅行的距離,因此,曼哈頓距離又稱爲出租車距離。曼哈頓距離不是距離不變量,當座標軸變動時,點間的距離就會不同。曼哈頓距離示意圖在早期的計算機圖形學中,屏幕是由像素構成,是整數,點的座標也一般是整數,原因是浮點運算很昂貴,很慢而且有誤差,如果直接使用AB的歐氏距離(歐幾里德距離:在二維和三維空間中的歐氏距離的就是兩點之間的距離),則必須要進行浮點運算,如果使用AC和CB,則只要計算加減法即可,這就大大提高了運算速度,而且不管累計運算多少次,都不會有誤差。