上次用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,
如果不是,则表示右方为墙或者蛇身,这时蛇死亡,游戏结束。