STM32最小系统板OLED贪吃蛇

时间:2022-03-03 21:37:03

上次用STM32F103最小系统板做了一个简单的OLED贪吃蛇小游戏,以下为游戏效果动图:

STM32最小系统板OLED贪吃蛇

主要实现内容包括:贪吃蛇移动、方向控制、食物生成、分数处理、死亡判定。

这次想把自己的制作思路分享给大家,不喜勿喷。

程序源码:https://github.com/ZJ129/OLEDSNAKE

1 UI设计

总体UI设计如下:

STM32最小系统板OLED贪吃蛇

我们将OLED左侧划分出来用于显示游戏地图,地图中红色部分为边界,蓝色部分为贪吃蛇可活动区域。OLED右侧用于显示分数或者其他参数。

2 贪吃蛇的移动

我们先定义一个二维数组,将数组边界元素值设为-2(墙)

置蛇头为1,蛇身依次+1,蛇尾为蛇的长度值(最大元素),初始化贪吃蛇。

初始状态如图所示:

STM32最小系统板OLED贪吃蛇

要让贪吃蛇移动,首先遍历二维数组所有元素,元素为正数则+1,得到如下结果:

STM32最小系统板OLED贪吃蛇

然后对方向进行判断,方向为右时,我们先判断上一个蛇头的右方值是否为0,

如果为0,则表示右方为空区,我们将它设置为1,得到新的蛇头,然后将尾部置为0(去除蛇尾),蛇长不变,完成贪吃蛇的右移。

效果如图所示:

STM32最小系统板OLED贪吃蛇

以上实现了贪吃蛇向右的移动,其他方向的移动与之类似

3 方向控制

源程序设置了两个方向变量:控制方向command_dir和运动方向direction。

控制方向从外部获取,运动方向为蛇当前的移动方向。控制方向与运动方向不是反方向时,运动方向才会变为控制方向。

举例:蛇向右运动,控制方向为左时,蛇的运动方向不变。

4 食物的生成

初始化的时候我们会随机在空白(0)处生成一个食物,我们将之设为-1,代码如下:

STM32最小系统板OLED贪吃蛇

5 食物的吞噬

我们设食物为-1

STM32最小系统板OLED贪吃蛇

首先遍历二维数组所有元素,元素为正数则+1,得到如下结果:

STM32最小系统板OLED贪吃蛇

然后对移动方向进行判断,方向为右时,我们先判断上一个蛇头的右方值是否为-1,

如果为-1,则表示右方为食物,我们将右方设置为1,得到新的蛇头,不处理尾部,蛇长+1,然后使用Food函数生成随机食物,完成贪吃蛇的向右吞噬。

效果如图所示:

STM32最小系统板OLED贪吃蛇

以上实现了贪吃蛇向右的吞噬,其他方向的吞噬与之类似

部分代码:

STM32最小系统板OLED贪吃蛇

6 死亡判定

遍历数组后对正数+1,然后对移动方向进行判断,方向为右时,我们先判断上一个蛇头的右方值是否为-1或0,

如果不是,则表示右方为墙或者蛇身,这时蛇死亡,游戏结束。