先来几个迷宫给大家玩一玩
是不是很简单呢?别急,这只是简单和普通模式,困难模式不好给大家玩,这个下面会介绍,接下来进入正题
硬件部分:该项目是用STM32G030F6P6作为主控芯片,控制OLED屏幕来实现的。
原理图
PCB
原理图部分,硬件比较简单,由几部分组成
- 一个STM32G030F6P6主控IC
- 一组复位电路
- 5个按键
- 一个5V转3.3V的662k电路
- 一组用于USB type-c电路
6.一组烧录接口
成品如下图
成品正面
成品背面
接下来,就是软件部分
首先用STM32 Cube MX配置好一组SPI和温度传感器,用来控制OLED,再配置若干个GPIO口作为按键引脚。如下图所示
STM32引脚配置
配置完成后就开始写代码了,配置OLED初始化函数什么的网上都有,这里就讲迷宫逻辑
首先判断选择的难度,如果是简单,则分配5X5的区域,如果是普通或者困难,则分配成25X12个区域。再用线条画出纵横交错的网格,把区域划分出来,每个区域为5x5的像素点。如下图所示
简单模式
普通和困难模式
这里我介绍一下困难模式的玩法,经常玩口袋妖怪宝石版的小伙伴应该对冠军之路洞穴或者某些道馆很有印象,就是那种只有一小部分视野的迷宫,如下图所示
我做这个困难模式的灵感也取自于口袋妖怪,原理下面会讲
介绍完这些,接下来就是介绍生成迷宫的思路了,在生成之前,要先设置路径,实际原理就是消除掉特定的线,如图A所示,比如说上一步是从上面下来的,现在要往左,现在的直线坐标在红线上,所以就要变换到黄色的线上,把它消除
图A
这个迷宫的生成方式是先选定一个出口位置,然后一步一步走通,所以要先选定一个出口,在这里,所有的迷宫都是随机生成的,生成方式是调用STM32内置的温度传感器。其特点是速度越快,精度越低。所以正好可以利用这个特点,因为生成的速度肯定是越快越好,其次速度快,精度就低,产生的数就会越不稳定,就可以当成随机数来使用了。
判断出口的位置需要2次。先用随机数判断出口在哪一侧,再判断出口的具体位置。确定完位置后,就可以确定玩家起始位置了。在简单和普通模式中,起始位置都是在出口斜对面,如图B所示,比如出口是黄色,在第一排倒数第二个位置,则玩家起始位置在最后一排的第二个红色的位置上。如果是困难模式,则玩家起点会在迷宫的正中间位置。
图B
有了出口位置,就可以开始生成了,虽然是随机数,但依然可能出现连续好几个走同一方向的情况,如图C所示
图C
这样就会大大降低难度,于是我规定简单难度不能连续走两步同一个方向,走一步后如果下一步依然是同一个方向,就跳过这次随机数,直到随机出不同的数为止。普通和困难的是不能连续走三步。在此,如果走到没路了,就回到上一个区域,然后检测该区域有没有其他路可以走,当然,还是用随机数。这个原理是:所有区域都在一个数组内,每个区域都用一个char变量表示,也就是8个位,高4位的每一位代表历史路径,比如说这个区域是从上面走下来的,就写成0X80,历史路径只有一条,且无法更改。低4位为它接下来走的路,所以可能会走3条路,加上一条历史的路,变成一个十字路口。如图D所示。
图D
另外由于之前说的,普通模式下,最多只能走两步,但是最多可能会有5个区域连成一条直线,如图E所示,往左走后,由于没路了,所以要后退回蓝色圆圈的区域,再往右走两步
如果这条路走过,就不会再走到这个点上,除非返回到那。如图F所示,蓝色圆圈的区域,看似有下左右能走,但因为左边有走过了,所以无法再走,只能走下边和右边
生成完毕后玩家的移动就会依据每个区域的char变量来判断,这样就不会出现穿墙的现象。而困难模式下,地图大小和普通的一样,只是只能显示玩家周围的3个区域。原理是我先像普通难度那样生成迷宫,然后创建一个数组,把迷宫存进去,生成玩家后再从数组里找到它周围的3个区域,再生成出来。
在简单和普通难度下,玩家每次移动的时候只需要清除玩家当前位置,然后在下个位置生成出来就行。在困难模式下,玩家每次移动都会清除屏幕,然后确定玩家下一次的位置,并且从存储迷宫的数组里面找到玩家周围3个区域的数据,一起显示出来。
每走一步都会判断,如果玩家位置和出口位置重叠,就会显示成功的字符。
我,讲完啦,篇幅有限,只是大概讲了下思路,具体软硬件我放在网盘里了,想了解的欢迎大家自取
链接:https://pan.baidu.com/s/1o6NRfcAb0sk3RAWKW-50rg?pwd=2e2b
提取码:2e2b