2026寒假练 - 基于MicroPython设计AI关卡生成迷宫游戏
该项目使用了MicroPython语言、Python上位机脚本、ST7789显示屏及MMA7660姿态传感器,实现了具备AI自动寻路与体感控制的智能迷宫游戏系统的设计,它的主要功能为:通过PC端随机生成迷宫并通过串口传输至单片机显示,支持“物理摇杆”与“重力体感”两种控制模式;创新性地集成了基于贪婪A*算法的自动寻路功能(上帝模式),可一键接管游戏并在毫秒级解出最优路径。
标签
显示
ADC
开发板
接口
USB
朱文航
更新2026-03-24
北京理工大学
52

基于MicroPython的智能AI迷宫游戏机设计与实现

一、 所选任务介绍

在本次嵌入式系统设计实践中,我选择了“设计并制作一个智能游戏控制终端”作为核心任务。该任务旨在考察开发者对于嵌入式微控制器(MCU)的综合控制能力,具体要求包括:驱动图形化显示屏进行人机交互界面(GUI)设计、读取多种传感器(如摇杆、姿态传感器)作为输入控制、实现设备与上位机(PC)之间的数据通讯,以及在资源受限的单片机上运行复杂的逻辑算法。

本项目不仅仅是一个简单的贪吃蛇或俄罗斯方块游戏,而是一个集成了物联网通讯、多模态交互、以及人工智能算法的综合性系统。通过该任务,我深入理解了MicroPython环境下的硬件驱动开发、串行通信协议的设计以及图搜索算法(Graph Search Algorithm)在嵌入式设备上的移植与优化。

二、 项目介绍

本项目名为“智能AI迷宫游戏机”,是一个软硬结合的嵌入式游戏系统。系统主要由PC端上位机脚本和单片机下位机程序两部分组成。

主要功能亮点如下:

  1. 无限关卡生成机制:打破了传统嵌入式游戏“死地图”的限制。利用PC端强大的算力,通过Python脚本实时生成Prim算法迷宫,并通过USB串口以JSON格式发送给游戏机,实现了理论上的“无限关卡”。
  2. 双模态控制系统:创新性地设计了两种操作模式。玩家既可以通过物理摇杆进行传统的精准控制,也可以切换到重力体感模式,利用MMA7660传感器通过倾斜开发板来控制角色移动,极大地增强了游戏的趣味性和交互性。
  3. “上帝模式”AI自动寻路:这是本项目的核心算法亮点。当玩家无法解开迷宫时,可双击A键触发AI接管。系统将启动基于贪婪策略的A*(A-Star)算法,在毫秒级时间内规划出最优路径,并自动控制角色以优雅的步态走向终点。
  4. 完善的UI交互系统:设计了包含主菜单(Main Menu)、模式选择(Mode Select)、关于作者(About)、游戏胜利(Victory)以及顶部状态栏(Status Bar)在内的完整状态机界面,支持大字体显示,交互逻辑清晰流畅。
  5. 人机无缝接管:在AI自动寻路过程中,支持随时按下B键中断,系统会即刻将控制权交还给玩家,实现了自动驾驶级别的控制逻辑。

三、 简短的所有使用到的硬件介绍

本项目基于高性能的嵌入式开发平台,主要硬件选型如下:

  1. 主控开发板(MCU):采用支持MicroPython固件的开发板(如RP2040或ESP32系列,根据您的实际板子填写)。其高主频和丰富的外设接口(SPI/I2C/UART)满足了屏幕刷新和算法计算的算力需求。
  2. 显示屏(Display):使用 ST7789 驱动的彩色TFT LCD屏幕,分辨率为240x240。该屏幕通过SPI接口与MCU通信,具有高刷新率和广视角的特点,用于显示游戏地图、UI界面及动画效果。
  3. 姿态传感器(IMU):使用 MMA7660 三轴加速度传感器。该模块通过I2C接口传输X/Y/Z轴的倾角数据,是实现“重力体感控制”模式的核心硬件。
  4. 双轴摇杆(Joystick):包含X、Y两个模拟轴(连接至MCU的ADC引脚)和一个按键(连接至GPIO)。用于读取玩家的物理操作指令。
  5. 按键模块:板载的独立按键(A键、B键),配置为上拉输入模式,用于菜单确认、返回、触发AI算法及复位游戏。
  6. 通信接口:使用板载的USB-TTL串口(UART),负责接收上位机发送的JSON地图数据。

四、 方案框图和项目设计思路介绍

4.1 系统方案框图

1.png

4.2 项目设计思路

本项目的软件架构采用**“事件驱动 + 状态机”**的设计模式,确保了系统的稳定性和响应速度。

  1. MVC架构思想
    • Model(数据层)MazeGame 类维护迷宫的宽度、高度、地图数据字符串(map_str)以及玩家坐标(px, py)。
    • View(视图层):负责屏幕绘制。包括 draw_full_map(全量绘制)、draw_tile(局部刷新)、draw_status(顶部状态栏)等方法。为了优化性能,移动时仅刷新角色所在的两个格子,而非全屏刷新。
    • Controller(控制层):主循环中轮询串口数据、按键状态、ADC值和I2C数据,根据当前状态(State)决定系统的行为。
  2. 状态机设计: 系统定义了 HOME(主页)、MODE_SELECT(模式选择)、ABOUT(关于)、PLAYING(游戏中)、WIN(胜利)五个核心状态。主循环根据用户的输入在这些状态之间流转,逻辑清晰,互不干扰。
  3. 上下位机通信协议: 为了保证数据传输的可靠性,设计了一套基于JSON的通信协议。PC端生成如下格式的数据:{"w": 15, "h": 15, "map": "11100..."}。单片机端通过 sys.stdin.readline() 读取并解析JSON,实现了地图的动态加载。

五、 调试软件及使用的编程语言说明

5.1 开发环境

  • 编程语言
    • 下位机(Device):使用 MicroPython。相比C语言,Python开发效率极高,且内置了强大的列表、字典处理能力,非常适合实现A*等复杂算法。
    • 上位机(PC):使用 Python 3.14。利用其丰富的库(serial, random, json)快速实现串口通信和迷宫生成算法。
  • IDE工具:使用 Thonny IDE 进行代码编写、固件烧录及串口调试。Thonny简洁的界面和直接的文件管理功能极大地加速了开发过程。

5.2 软件流程图

2.png

5.3 关键代码介绍

1. 贪婪A*(A-Star)寻路算法

这是解决41x41大地图卡顿问题的关键。传统的BFS算法会遍历大量无效节点,而A*算法引入了启发式函数(Heuristic)。代码中使用曼哈顿距离作为预估代价,并引入了权重系数(Weight = 50)来实现“贪婪”搜索:

Python

# 曼哈顿距离启发函数
def heuristic(self, a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])

# 核心搜索逻辑
priority = new_cost + self.heuristic((nx, ny), target_pos) * 50
heapq.heappush(frontier, (priority, nx, ny))

通过引入 heapq 优先队列和加权启发式,算法能够优先搜索靠近终点的路径,将计算复杂度从指数级降低到线性级,实现了毫秒级的路径规划。

2. 动态字体加载与状态栏管理

为了解决文字遮挡迷宫的问题,代码实现了动态字体管理。主界面使用大字体(16x32或16x16),而顶部状态栏强制使用小字体(8x8),并预留了 STATUS_BAR_HEIGHT 区域:

Python

def draw_status(self, msg, color):
# 局部刷新顶部区域,不影响迷宫显示
self.disp.fill_rect(0, 0, 240, self.STATUS_BAR_HEIGHT, st7789.BLACK)
if msg:
self.disp.text(small_font, msg, 5, 4, color)

3. 双击检测与人机接管

为了实现单键复用,引入了时间戳判断逻辑来实现“双击A键”触发AI:

Python

# 双击检测逻辑
if curr_btn_a == 0 and last_btn_a_state == 1:
diff = time.ticks_diff(current_time, last_click_time_a)
if diff < 400: # 400ms内连续按下
game.auto_solve()

同时,在AI运行循环中检测B键,实现了中断退出功能。

六、 功能展示图及说明

1. 系统主界面


image.png

2. 模式选择与关于页

1.jpg

2.jpg

说明:二级菜单展示。用户可在此选择“JOYSTICK”(摇杆)或“GRAVITY”(重力)模式,或查看开发者信息。

3. 游戏运行与迷宫展示


a8ad7bd9868e3359fc16d7a5ec5263df.jpg

说明:游戏实机运行画面。红色方块为玩家,绿色为终点。

4. AI自动寻路(上帝模式)


d302df98be8e5c3057ea9883c6669645.jpg


cc0769095c910feaf64d9206968b2528.jpg

7e008afaaf2d59e2e57f2a7ab5172f7e.jpg370f7bf587cf7f16c346abb1c5128ef6.jpg

说明:双击A键后,AI接管控制,顶部显示状态提示,角色自动寻找最短路径冲向终点。

5. PC端上位机通信

1.jpg

说明:PC端脚本实时监控串口,实现“无限模式”下的自动关卡下发。

七、 项目中遇到的难题及解决方法

在项目开发过程中,我遇到了几个棘手的技术挑战,但通过查阅文档和不断调试,最终都得以解决:

  1. 难题一:41x41大地图下寻路算法卡死
    • 问题描述:最初使用的BFS(广度优先搜索)算法在处理15x15地图时表现良好,但在41x41地图(约1600个节点)时,计算时间过长,导致看门狗复位或界面假死。
    • 解决方法:放弃BFS,转而实现 A (A-Star) 算法*。引入MicroPython内置的 heapq 模块实现优先队列,并采用“父节点记录法”代替“全路径存储”,极大降低了内存消耗。此外,通过增加启发式函数的权重(Weighted A*),使算法更具“贪婪性”,将计算速度提升了10倍以上。
  2. 难题二:重力感应控制方向错乱
    • 问题描述:在使用MMA7660传感器时,发现倾斜方向与屏幕移动方向不一致(例如左倾屏幕上移)。
    • 解决方法:分析发现传感器的物理安装坐标系与屏幕逻辑坐标系存在90度旋转。我在代码的 read_imu_tilt 逻辑后对 txty 进行了交换和符号反转映射,并通过设置阈值(Threshold=8)消除了手抖带来的误触。
  3. 难题三:AI状态提示遮挡迷宫画面
    • 问题描述:原来的“AI SOLVING”字样直接覆盖在地图上,且字体过大,影响观感。
    • 解决方法:重新设计UI布局,将迷宫整体下移16个像素,在顶部开辟独立的 Status Bar。同时引入字体自动回退机制,确保状态栏使用8x8小字体,而主菜单使用16x32大字体,实现了美观与实用的平衡。

八、 心得体会

通过完成这个“智能AI迷宫游戏机”项目,我收获颇丰。

首先,在技术层面,我掌握了MicroPython在嵌入式开发中的核心应用。从底层的SPI/I2C/ADC驱动,到中层的状态机逻辑设计,再到上层的A*人工智能算法实现,我打通了嵌入式软件开发的全链路。特别是亲手将理论课上学到的图搜索算法应用到实际硬件中并解决性能瓶颈,让我对“算法复杂度”有了具象化的理解。

其次,在工程能力方面,我学会了模块化编程和分层设计的思想。将硬件驱动、游戏逻辑和UI绘制分离,使得代码结构清晰,易于维护和扩展。同时,上位机与下位机的联调经历,让我熟悉了串口通信协议的设计与校验方法。

最后,这个项目让我体会到了用户体验的重要性。从一开始的“能跑就行”,到后来加入双击检测、人机接管中断、慢速演示动画以及防误触逻辑,每一个细节的打磨都让产品变得更加有温度。

未来,我计划进一步完善该项目,尝试加入蓝牙模块实现无线手柄功能,或者引入更复杂的迷宫生成算法(如递归分割法),让这个小小的游戏机具备更强的可玩性。这次实践经历将是我嵌入式学习道路上宝贵的财富。

附件下载
pc_host.py
上位机 (pc_host.py):通过串口协议,实现迷宫随机生成与自动关卡下发。
main.py
下位机 (main.py):基于A*算法与状态机,实现体感迷宫及AI寻路。
团队介绍
朱文航,北京理工大学本科生
团队成员
朱文航
北京理工大学学生
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号