上次用STM32F103最小系統板做了一個簡單的OLED貪吃蛇小遊戲,以下為遊戲效果動圖:
主要實現內容包括:貪吃蛇移動、方向控制、食物生成、分數處理、死亡判定。
這次想把自己的製作思路分享給大家,不喜勿噴。
程式原始碼:https://github.com/ZJ129/OLEDSNAKE
1 UI設計
總體UI設計如下:
我們將OLED左側劃分出來用於顯示遊戲地圖,地圖中紅色部分為邊界,藍色部分為貪吃蛇可活動區域。OLED右側用於顯示分數或者其他引數。
2 貪吃蛇的移動
我們先定義一個二維陣列,將陣列邊界元素值設為-2(牆)
置蛇頭為1,蛇身依次+1,蛇尾為蛇的長度值(最大元素),初始化貪吃蛇。
初始狀態如圖所示:
要讓貪吃蛇移動,首先遍歷二維陣列所有元素,元素為正數則+1,得到如下結果:
然後對方向進行判斷,方向為右時,我們先判斷上一個蛇頭的右方值是否為0,
如果為0,則表示右方為空區,我們將它設定為1,得到新的蛇頭,然後將尾部置為0(去除蛇尾),蛇長不變,完成貪吃蛇的右移。
效果如圖所示:
以上實現了貪吃蛇向右的移動,其他方向的移動與之類似
3 方向控制
源程式設定了兩個方向變數:控制方向command_dir和運動方向direction。
控制方向從外部獲取,運動方向為蛇當前的移動方向。控制方向與運動方向不是反方向時,運動方向才會變為控制方向。
舉例:蛇向右運動,控制方向為左時,蛇的運動方向不變。
4 食物的生成
初始化的時候我們會隨機在空白(0)處生成一個食物,我們將之設為-1,程式碼如下:
5 食物的吞噬
我們設食物為-1
首先遍歷二維陣列所有元素,元素為正數則+1,得到如下結果:
然後對移動方向進行判斷,方向為右時,我們先判斷上一個蛇頭的右方值是否為-1,
如果為-1,則表示右方為食物,我們將右方設定為1,得到新的蛇頭,不處理尾部,蛇長+1,然後使用Food函式生成隨機食物,完成貪吃蛇的向右吞噬。
效果如圖所示:
以上實現了貪吃蛇向右的吞噬,其他方向的吞噬與之類似
部分程式碼:
6 死亡判定
遍歷陣列後對正數+1,然後對移動方向進行判斷,方向為右時,我們先判斷上一個蛇頭的右方值是否為-1或0,
如果不是,則表示右方為牆或者蛇身,這時蛇死亡,遊戲結束。