从终端彩蛋到ESP32硬件
最近被 Claude Code 里的Buddy 电子宠物刷屏了吧?输入一条/buddy命令,终端就蹦出一只专属 ASCII 小宠物,陪你写代码、吐槽 bug,还带稀有度、属性、动画,简直是程序员深夜专属治愈神器。
作为嵌入式 + GUI 爱好者,我直接把这套系统从软件搬到 ESP32 硬件,做了个可触摸、可交互、可离线运行的Code Buddy 硬件版。今天把完整构建流程、源码思路、上手玩法全部分享,技术论坛同款干货,新手也能跟着跑通。

一、Buddy 是什么?
Buddy 不是简单玩具,是一套完整的轻量级电子宠物系统,是从Claude code 源码里学习出来的,源码我已经学习过然后人道毁灭了,只留下这份宝典,供大家享用。
宠物的核心特征:
• 18 种宠物物种:鸭、鹅、猫、龙、章鱼、水豚、幽灵、六角恐龙、机器人等
• 5 级稀有度:普通 (60%)→优秀 (25%)→稀有 (10%)→史诗 (4%)→传说 (1%)
• 确定性生成:同一种子 / 账号,永远生成同一只宠物,无法篡改
• ASCII Art 动画:每只 3 帧循环,纯文本渲染,不占图片资源
• 五维属性:调试能力、耐心、混乱度、智慧、吐槽力,带性格描述
• 离线可运行:数据存在 Flash,断电不丢档
我做的硬件版,1:1 还原 Claude Buddy 核心逻辑,同时适配 ESP32-P4 + LVGL 9.3,触摸交互、动画、存储全打通。

二、硬件 & 环境准备
1. 硬件清单
• 主控:ESP32-P4(或 M5Stack Tab5,屏幕 1280×720 最佳)
2. 开发环境
• ESP-IDF:5.5.2(必须对应,避免驱动兼容问题)
• LVGL:9.3.0(GUI 渲染核心)
• 字体:lv_font_unscii_16等宽字体(保证 ASCII 对齐不变形)
• 系统:Windows/Linux 均可,推荐 VSCode + IDF 插件
三、项目核心架构
我完全沿用 Claude Buddy 的设计思想,做嵌入式适配:

• 数据层:宠物结构体、稀有度、属性、种子生成逻辑
• 渲染层:ASCII 精灵、3 帧动画、缩放变换
• 交互层:触摸按钮、喂食 / 玩耍 / 刷新宠物、数据保存

四、保姆级构建:从 0 编译烧录
Step 1 拉取 / 创建项目文件
创建 ESP-IDF 项目,新建buddy组件目录,放入 3 个核心文件:
Plain Textmain/apps/tools/buddy/ ├── buddy.h // 数据结构、枚举、接口 ├── buddy_sprites.h // 18种宠物ASCII精灵数据 └── buddy.cc // 生成、渲染、存储、UI逻辑
main/apps/tools/buddy/ ├── buddy.h // 数据结构、枚举、接口 ├── buddy_sprites.h // 18种宠物ASCII精灵数据 └── buddy.cc // 生成、渲染、存储、UI逻辑
Step 2 关键代码配置
1. 宠物数据结构(和 Claude 完全对齐)
c
typedef enum {
BUDDY_DUCK, BUDDY_GOOSE, BUDDY_BLOB, BUDDY_CAT, BUDDY_DRAGON,
BUDDY_OCTOPUS, BUDDY_OWL, BUDDY_PENGUIN, BUDDY_TURTLE, BUDDY_SNAIL,
BUDDY_GHOST, BUDDY_AXOLOTL, BUDDY_CAPYBARA, BUDDY_CACTUS, BUDDY_ROBOT,
BUDDY_RABBIT, BUDDY_MUSHROOM, BUDDY_CHONK,
BUDDY_SPECIES_COUNT
} buddy_species_t;
typedef struct {
buddy_species_t species;
buddy_rarity_t rarity;
bool shiny; // 1%闪光变种
// 五维属性
uint8_t debugging, patience, chaos, wisdom, snark;
char name[32], personality[64];
uint32_t hatched_at, user_seed;
} buddy_t;2. 确定性随机生成(Mulberry32 PRNG)
保证同种子 = 同宠物,离线也能复现:
c
static uint32_t rng_state = 0;
static uint32_t rng_next(void) {
uint32_t z = (rng_state += 0x6D2B79F5);
z = (z ^ (z >> 15)) * (z | 1);
z ^= z + (z ^ (z >> 7)) * (z | 61);
return z ^ (z >> 14);
}3. NVS 存储(断电不丢档)
c
#define NVS_NAMESPACE "buddy_app"
void buddy_save(const buddy_t* buddy) {
nvs_handle_t handle;
nvs_open(NVS_NAMESPACE, NVS_READWRITE, &handle);
nvs_set_blob(handle, "buddy_data", buddy, sizeof(buddy_t));
nvs_commit(handle);
nvs_close(handle);
}4. LVGL 动画(500ms 一帧,流畅不卡)
c
anim_timer = lv_timer_create(anim_timer_cb, 500, NULL);
static void anim_timer_cb(lv_timer_t* timer) {
current_frame = (current_frame + 1) % 3;
update_sprite_display();
}Step 3 编译 & 烧录
1. 命令行进入项目目录
2. 配置:idf.py menuconfig(开启 NVS、LVGL、屏幕驱动)
3. 编译:idf.py build
4. 烧录:idf.py flash monitor
看到屏幕出现 ASCII 宠物,恭喜你 ——硬件版 Buddy 上线了!
五、上手使用:你的第一只硬件电子宠物
1. 首次启动
• 开机自动用设备唯一 ID 作为种子生成宠物
• 显示:精灵动画 + 名字 + 稀有度 + 五维属性 + 性格描述
2. 交互操作(触摸按钮)
• 喂食:耐心 + 5,播放开心帧,自动保存
• 玩耍:混乱度 / 智慧随机提升,触发随机表情
• 新宠物:重置种子,重新生成(可刷传说 / 闪光)

六、总结
Claude Code 的 Buddy 本来只是个终端彩蛋,但把它搬到 ESP32 硬件后,才真正体会到:
轻量算法 + ASCII 渲染 + 确定性生成 = 嵌入式趣味应用的完美模板
整个项目代码≈15KB,精灵数据≈8KB,运行内存≈2KB,资源占用极低,非常适合 LVGL 入门、ESP-IDF 练手,或者做桌面小摆件。
你也可以直接拿我的框架,换精灵、改交互、加屏幕,快速做出属于自己的电子宠物。
https://gitee.com/genvex/m5stack_-osystem
这是我构建的针对m5stackTab5构建的板卡支持框架,上面的应用均基于这个框架生成。在Vibe coding 的加持下,每日一App的速度向前狂奔,后面我会把一些有趣的项目继续分享出来。
我要赚赏金
