刚开始学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)
|