1. 程式人生 > >STM32最小系統板OLED貪吃蛇

STM32最小系統板OLED貪吃蛇

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