剛開始學STM32,看到過網上有人用0.96寸OLED做過貪吃蛇游戲,于是自己也有了這樣一個想法,一開始確實遇到了很多麻煩,最主要的是畫出來的點總會被下一個點影響,然后開始翻數據手冊,才發現一次要寫八個點,之后在網上找了很多資料,這一個問題也終于解決了。下面來分享一下我做這個的一點經驗。
1.打點函數
我們先建立一個8*128的二維數組,把屏幕上的每一個點都放進這個數組里
2.蛇身建立
屏幕上的點很小,很難看清楚,所以我們用4x4的區域來作為蛇身,蛇的身體用4x4中間挖去2x2的空心方塊表示,蛇頭用4x4的實心方塊表示,食物則用4x4方塊去掉四個角的點來表示,每一種圖形都用一個函數表示,因為整個游戲用了四種點來顯示所以才需要用上面的最小單位的點來組合。
3.蛇的移動
最簡單的一種就是添頭去尾,移動的時候,以移動的坐標作為新坐標畫出頭部,如果沒吃到食物則刪除尾部,吃到食物則保留尾部,每一段移動后都以前一段的舊坐標作為自己的新坐標。為了實現這樣的移動,再建一個16bit的數組,高八位存x軸坐標,低八位存y軸坐標,用定時器每隔一段時間顯示這個數組的第一位和最后一位就能實現蛇的移動。
4.邊界和蛇身判斷
這個游戲是不能觸碰邊界和自身的,所以需要不斷檢測蛇頭坐標是否越過邊界,為了檢測是否觸碰蛇身,就再建一個數組存放蛇身緩存,每移動一次就將蛇身坐標存到這個數組中,再判斷蛇頭是否碰到蛇身,判斷完就立刻清空數組。
制作出來的實物圖如下:
stm32單片機源程序如下:
- #include "include.h"
- uint8_t CheckBuffer[420];//高八位放x坐標,低八位放y坐標
- uint16_t MoveCoordinate[420];//高八位放x坐標,低八位放y坐標
- uint8_t SnakeCoordinate[8][128];
- uint16_t SnakeLength;
- uint8_t SnakeCoordinate_x,SnakeCoordinate_y;
- uint8_t FoodCoordinate_x,FoodCoordinate_y;
- uint8_t MoveDirection;
- uint16_t Counter_x=166,Counter_y=1785;
- uint8_t runflag=0;
- int main(void)
- {
- Game_Start();
- while(1)
- {
- MoveDirection = KEY_Scan(1);
-
- while(MoveDirection==GAMEOVER)
- {
- TIM_Cmd(TIM3,DISABLE);
- OLED_Clear(0);
- OLED_ShowString(32,0,"GAMEOVER");
- OLED_ShowString(20,3,"SCORE:");
- OLED_ShowNum(75,3,SnakeLength-3,4,16);
- delay_ms(1000);
- }
- }
- }
復制代碼
所有資料51hei提供下載:
貪吃蛇v2.7z
(698.21 KB, 下載次數: 346)
2018-9-4 21:47 上傳
點擊文件名下載附件
|