Party Games Box - AI Passport 聚会游戏盒
20款聚会小游戏,集成在一个固件里,开机进菜单选择,三键操作。纯离线运行,无需网络。支持中文字体显示,基于 ESP32-C3 + LVGL 9.x 开发。
项目概览
这是一个 AI Passport 二创项目,将 20款聚会小游戏 整合到一个固件中。开机即进入游戏菜单,通过 UP / DOWN / OK 三个按键选择和游玩。所有游戏纯离线运行,不需要网络连接,非常适合朋友聚会线下使用。
项目基于 FoloToy/ai-passport 仓库开发,使用 ESP-IDF v5.5.5 框架,LVGL 9.x 图形库,C 语言编写。支持中文字体显示(子集化方案,仅包含游戏用到的 740 个汉字),每个游戏实现统一的 enter/exit/key 接口,模块化设计便于扩展。
关键数据
游戏列表
| # | 名称 | 类型 | 玩法简述 |
|---|---|---|---|
| 1 | 骰子比大小 | 手气 | 轮流掷骰,点数最大赢 |
| 2 | 石头剪刀布 | 对决 | 两人同时出拳,淘汰赛制 |
| 3 | 诚实硬币 | 随机 | 抛硬币,正面真心话反面大冒险 |
| 4 | 猜数字 | 推理 | 1-100猜数,提示大了小了 |
| 5 | 数字炸弹 | 紧张 | 随机炸弹数,踩到出局 |
| 6 | 俄罗斯轮盘 | 手气 | 六格转轮轮流扣扳机 |
| 7 | 真心话大冒险 | 转盘选人+随机题目 | |
| 8 | 随机惩罚 | 工具 | 30+惩罚任务随机生成 |
| 9 | 我从来没有 | 破冰 | 30+题目,做过的人计数 |
| 10 | 国王游戏 | 抽号当国王,指定号码任务 | |
| 11 | 反应速度战 | 竞技 | 随机延时后比谁先按 |
| 12 | 两真一假 | 推理 | 三句话猜哪句是假的 |
| 13 | 抽签鬼牌 | 手气 | 轮流抽签,抽到鬼牌受罚 |
| 14 | 二选一 | 讨论 | 25+两难问题轮流选 |
| 15 | 谁最有可能 | 投票 | 25+题目投票指向同一人 |
| 16 | 词语炸弹 | 紧张 | 倒计时传着玩,爆炸出局 |
| 17 | 西蒙说 | 反应 | 西蒙说了才做,没说做了淘汰 |
| 18 | 默契大考验 | 两人 | 两人同题选答案,选一样得默契 |
| 19 | 故事接龙 | 创意 | 随机开头+提示词轮流编故事 |
| 20 | 谁是卧底 | 推理 | 相似词找不同,投票找出卧底 |
操作方式
- UP / DOWN 短按:菜单中翻页选择;游戏中根据提示操作
- OK 短按:菜单中进入游戏;游戏中确认/掷骰/抽签等
- OK 长按:任何游戏中返回主菜单
技术规格
| 芯片 | ESP32-C3, 8MB Flash, 无 PSRAM |
|---|---|
| 屏幕 | ST7789P3, 240x320, RGB565 |
| 按键 | UP / DOWN / OK (ADC 电阻梯) |
| UI 框架 | LVGL 9.x |
| 开发框架 | ESP-IDF v5.5.5 (v5.5.3 亦可) |
| 语言 | C |
| 应用分区 | 3MB (足够容纳20个纯文字逻辑游戏) |
| 中文字体 | 子集化方案,仅包含游戏用到的740个汉字,14px约202KB,20px约404KB |
完整构建指南(Windows CMD)
第一步:安装 ESP-IDF 开发环境
1.1 下载并运行官方安装器
- 访问 ESP-IDF 下载页 下载 Tools Installer
- 运行安装器,选择 ESP-IDF v5.5.5(或 v5.5.3 亦可)
- 安装过程中会自动下载 Python、Git、工具链等依赖
1.2 安装过程中子模块更新失败的补救方法
方法 A:手动补拉子模块(推荐)
:: 打开 CMD 后设置 PATH
set PATH=E:\Espressif\Espressif\tools\idf-python\3.11.2;E:\Espressif\Espressif\tools\idf-git\2.44.0\cmd;%PATH%
:: 进入 ESP-IDF 目录补拉子模块
cd C:\Espressif\frameworks\esp-idf-v5.5.5
git submodule update --init --recursive --depth 1
方法 B:配置 Git 代理(需要梯子)
git config --global http.proxy http://127.0.0.1:你的代理端口
git config --global https.proxy http://127.0.0.1:你的代理端口
cd C:\Espressif\frameworks\esp-idf-v5.5.5
git submodule update --init --recursive --depth 1
:: 用完后清除代理
git config --global --unset http.proxy
git config --global --unset https.proxy
方法 C:使用 Espressif 国内镜像
set IDF_GITHUB_ASSETS=https://dl.espressif.com/github_assets
cd C:\Espressif\frameworks\esp-idf-v5.5.5
git submodule update --init --recursive --depth 1
1.3 验证 ESP-IDF 安装
:: 每次打开新 CMD 窗口先初始化环境
set PATH=E:\Espressif\Espressif\tools\idf-python\3.11.2;E:\Espressif\Espressif\tools\idf-git\2.44.0\cmd;%PATH%
cd C:\Espressif\frameworks\esp-idf-v5.5.5
export.bat
:: 验证
idf.py --version
第二步:克隆 AI Passport 基础仓库
:: 1. 进入 ESP-IDF 目录
cd C:\Espressif\frameworks\esp-idf-v5.5.5
:: 2. 克隆仓库
git clone https://github.com/FoloToy/ai-passport.git
:: 3. 进入仓库目录
cd ai-passport
:: 4. 确保在 main 分支
git checkout main
:: 5. 创建并切换到开发分支
git switch -c feature/party-games
:: 6. 初始化子模块(需要梯子)
git submodule update --init --recursive --depth 1
git switch -c 再 git submodule update 更合理——先切到自己的开发分支,再拉子模块。
第三步:中文字体配置(可选,但推荐)
3.1 安装 lv_font_conv 工具
:: 如果 npm 报 404 错误,使用官方源临时安装
npm install -g lv_font_conv --registry https://registry.npmjs.org/
:: 验证安装成功
lv_font_conv --version
3.2 准备中文 TTF 字体文件
推荐字体:思源黑体 (Noto Sans SC)、阿里巴巴普惠体等。将字体文件放到 main/fonts/ 目录。
3.3 提取汉字字符集
cd "项目目录\party-games"
python tools\extract_chars.py
该脚本会扫描所有游戏源文件中的汉字(约740个)+ CJK 标点 + 全角符号。
3.4 生成字体 C 文件(必须用 Python 脚本)
set /p 读取 UTF-8 文件时会把中文当成 GBK 解码,导致生成的字体文件里中文全是方块。必须使用 Python 脚本 gen_font_py.py。
:: 自动查找字体文件并生成
python tools\gen_font_py.py
:: 或指定字体文件路径
python tools\gen_font_py.py "main\fonts\NotoSansCJKsc-Regular.otf"
第四步:复制项目文件到 ai-passport 仓库
:: 复制 main 目录下所有文件
xcopy /E /Y "项目目录\party-games\main\*" "C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport\main\"
:: 复制配置文件
copy /Y "项目目录\party-games\CMakeLists.txt" "C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport\"
copy /Y "项目目录\party-games\partitions.csv" "C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport\"
copy /Y "项目目录\party-games\sdkconfig.defaults" "C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport\"
第五步:编译
:: 初始化环境(每次开新窗口都要执行!)
set PATH=E:\Espressif\Espressif\tools\idf-python\3.11.2;E:\Espressif\Espressif\tools\idf-git\2.44.0\cmd;%PATH%
cd C:\Espressif\frameworks\esp-idf-v5.5.5
call export.bat
:: 编译
cd C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport
idf.py set-target esp32c3
idf.py build
Chinese font files found - enabling USE_ZH_FONT 表示中文字体已启用。Project build complete 表示编译成功。
第六步:烧录到设备
方法一:ESP-IDF 命令行烧录
:: COM3 替换为实际端口
idf.py -p COM3 flash
:: 烧录并打开串口监视器
idf.py -p COM3 flash monitor
:: 按 Ctrl+] 退出监视器
方法二:Web Flasher 烧录
- 编译完成后,固件位于
build/party-games-merged.bin - 打开 AI Passport Web Flasher
- 选择固件文件,浏览器串口连接设备并烧录
方法三:esptool 命令行
esptool.py --chip esp32c3 --port COM3 --baud 460800 write_flash 0x0 party-games-merged.bin
常见问题排查
ESP-IDF 安装器报子模块更新失败
网络问题。开梯子后在 CMD 里手动运行 git submodule update --init --recursive --depth 1,或使用国内镜像。
export.bat 报 "python" not found
需要先把 Python 加到 PATH: set PATH=E:\Espressif\Espressif\tools\idf-python\3.11.2;%PATH%,然后再运行 export.bat。或直接用开始菜单的 "ESP-IDF PowerShell" 快捷方式。
install.bat 报 SyntaxError
不要用 python install.bat 运行,install.bat 是批处理文件,直接在 CMD 里执行 install.bat。
npm install lv_font_conv 报 404
npm 配置了内部镜像源。使用 --registry https://registry.npmjs.org/ 参数指定官方源。
编译时报 bsp_pins.h: No such file or directory
子模块未更新。执行 git submodule update --init --recursive。
编译时中文显示为方块或问号
字体文件未生成、不含所需字符、或字符集编码错误。运行 python tools\extract_chars.py 提取所有汉字,再用 python tools\gen_font_py.py "字体路径" 生成字体文件。不要用 gen_font.bat,CMD 的 set /p 读取 UTF-8 文件时会把中文变成乱码。
烧录后屏幕全是方块
中文字体文件里的字符是乱码(编码问题),或者 range.txt 里缺少 ASCII 字符。必须用 Python 脚本重新提取字符集并生成字体,重新复制、编译、烧录。
编译报 lvgl/lvgl.h: No such file or directory
lv_font_conv 生成的字体文件里 #include "lvgl/lvgl.h" 路径不对。gen_font_py.py 会自动修复为 #include "lvgl.h"。
编译报 lvalue required as unary '&' operand
代码中 &GAME_FONT_14 应改为 GAME_FONT_14。font_config.h 里定义的已经是 (&font_zh_14) 指针,再取 & 就变成指针的指针了。
编译报 format '%d' expects argument of type 'int'
int32_t 在 ESP32-C3 上是 long int,需要用 %ld 替代 %d。
lv_font_conv 参数报错
不同版本的参数名不同:旧版 --force-fast-kernfmt local,新版 --force-fast-kern-format。用 lv_font_conv --help 查看支持的参数。
上传固件到玩法社区
AI Passport 官方玩法社区地址:https://ai-passport.folotoy.cn/plays/
途径一:GitHub 开源分享(推荐)
- 将项目推送到 GitHub 仓库
- 在 README 中写清楚构建步骤和依赖说明
- 在 Release 页面上传编译好的
.bin固件文件 - 其他用户可以用 Web Flasher 或 esptool 刷入固件
- 可以在 FoloToy/ai-passport 仓库提 Issue 或 PR 告知官方
途径二:联系 FoloToy 官方上架
- 在 FoloToy 官方 Discord 联系官方团队
- 提供 GitHub 仓库链接和固件
.bin文件 - 说明玩法介绍、操作方式和适用人数
- 官方审核通过后会上架到玩法社区页面
途径三:直接分享固件文件
- 编译完成后,固件位于
build/party-games-merged.bin - 将
.bin文件分享给朋友 - 对方打开 Web Flasher 选择该文件即可安装
文件结构
party-games/
├── CMakeLists.txt # 顶层 CMake 配置
├── partitions.csv # Flash 分区表
├── sdkconfig.defaults # ESP-IDF 配置
├── README.md # 项目说明
├── ESP-IDF-Install-Guide.html # ESP-IDF 环境安装指南
├── Chinese-Font-Setup-Guide.html # 中文字体配置指南
├── main/
│ ├── CMakeLists.txt # 组件 CMake (自动检测字体文件)
│ ├── font_config.h # 字体别名配置
│ ├── main.c # 主入口 + 菜单系统
│ ├── games.h # 游戏统一接口声明
│ ├── game_common.h # 通用工具头文件
│ ├── game_common.c # 通用工具实现
│ ├── game_dice.c # 1. 骰子比大小
│ ├── game_rps.c # 2. 石头剪刀布
│ ├── game_coin.c # 3. 诚实硬币
│ ├── game_guess.c # 4. 猜数字
│ ├── game_bomb.c # 5. 数字炸弹
│ ├── game_roulette.c # 6. 俄罗斯轮盘
│ ├── game_truth.c # 7. 真心话大冒险
│ ├── game_penalty.c # 8. 随机惩罚
│ ├── game_never.c # 9. 我从来没有
│ ├── game_king.c # 10. 国王游戏
│ ├── game_react.c # 11. 反应速度战
│ ├── game_twotruth.c # 12. 两真一假
│ ├── game_drawcard.c # 13. 抽签鬼牌
│ ├── game_picktwo.c # 14. 二选一
│ ├── game_likely.c # 15. 谁最有可能
│ ├── game_wordbomb.c # 16. 词语炸弹
│ ├── game_simon.c # 17. 西蒙说
│ ├── game_telepathy.c # 18. 默契大考验
│ ├── game_story.c # 19. 故事接龙
│ ├── game_spy.c # 20. 谁是卧底
│ └── fonts/ # 中文字体文件 (由工具生成)
│ ├── font_zh_14.c # 14px 中文字体
│ └── font_zh_20.c # 20px 中文字体
└── tools/ # 字体生成工具
├── extract_chars.py # 扫描源文件提取汉字字符集
├── gen_font_py.py # Python 字体生成脚本(推荐)
├── gen_font.bat # CMD 字体生成(不推荐,有编码问题)
├── gen_font.ps1 # PowerShell 一键生成
├── gen_font.sh # Linux/macOS 一键生成
├── build_log.bat # 编译并保存日志
├── full_build.bat # 一键全流程构建脚本
├── chars.txt # 提取出的字符集
├── chars_count.txt # 字符统计信息
└── range.txt # 字符范围参考
开发过程全记录(每轮提问与解答)
以下是整个开发过程中,从构思到完成的每一轮提问与关键解答。记录了从方向选择、游戏选型、代码编写、字体配置、编译烧录到问题排查的完整历程。
git switch -c feature/party-games 创建并切到开发分支,再 git submodule update --init --recursive 拉子模块,这样所有操作都在工作分支上进行,更合理。命令顺序已修正。
call export.bat。或者直接使用开始菜单的 "ESP-IDF PowerShell" 快捷方式。
idf.py --version,如果输出版本号(如 ESP-IDF v5.5.5)说明环境已就绪。如果报"不是内部命令"说明环境未初始化,需要先执行 set PATH 和 export.bat。
python tools\gen_font_py.py 生成字体,避免 CMD 编码问题。
where lv_font_conv 或 npm list -g lv_font_conv 检查。如未安装,用 npm install -g lv_font_conv --registry https://registry.npmjs.org/ 安装。
README.md 完整内容
以下是项目 README.md 的完整内容备份:
Party Games Box - AI Passport 聚会游戏盒
20款聚会小游戏,集成在一个固件里,开机进菜单选择,三键操作。支持中文字体显示。
操作方式
- UP / DOWN 短按: 菜单中翻页选择;游戏中根据提示操作
- OK 短按: 菜单中进入游戏;游戏中确认/掷骰/抽签等
- OK 长按: 任何游戏中返回主菜单
快速构建(一键脚本)
cd "项目目录\party-games"
tools\full_build.bat
full_build.bat 会自动完成所有步骤:初始化环境 → 生成中文字体 → 复制文件 → 删除缓存 → 编译 → 烧录。每步都有错误检查,失败会提示原因。烧录前会提示输入 COM 端口号。
修改代码后快速重新编译烧录
如果只修改了 party-games\main\ 下的 .c 文件,不需要重新生成字体。每行单独复制粘贴到 CMD 执行:
set PATH=E:\Espressif\Espressif\tools\idf-python\3.11.2;E:\Espressif\Espressif\tools\idf-git\2.44.0\cmd;%PATH%
cd C:\Espressif\frameworks\esp-idf-v5.5.5
call export.bat
xcopy /E /Y "项目目录\party-games\main\*" "C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport\main\"
cd C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport
idf.py build
idf.py -p COM3 flash
idf.py build 前加一步:rmdir /S /Q "C:\Espressif\frameworks\esp-idf-v5.5.5\ai-passport\build"
注意事项
- 需要基于 FoloToy/ai-passport 仓库的
components/bsp组件,克隆后需执行git submodule update --init --recursive - LVGL 内存池保持 24KB,因为每个游戏的 UI 实际上比原版更简单(纯文本标签,无复杂图形)
- 所有游戏纯离线运行,不需要网络
- 长按 OK 键可从任何游戏返回主菜单
- 固件不经过官方兼容性验证,请先在测试设备上验证
- 中文字体文件未生成时编译仍可成功,但中文会显示空白,仅英文/数字正常
- 框架和工具可能安装在不同盘符(如框架在 C 盘,工具在 E 盘),这是 ESP-IDF 安装器的正常行为