国庆长假无聊了玩玩行空板K10电子宠物
一、项目背景
需求来源
国庆7天假期,比较忙没有出去,打算参加df的活动,于是使用ai或者其他工具,找想法,做项目。想想假期无聊了有猫的可以撸猫,有行空板K10的能不能撸电子宠物猫呢,于是使用ai提交想法,并做出了安静的像素小宠物,豆豆。接着我们看看他的定位和项目过程。
定位:一只安静的像素小宠「豆豆」
这个项目电子宠物的气质是静:它大部分时间待在房间中央轻轻呼吸,数值随时间缓慢变化,你随时按键照顾它。没有关卡、没有输赢,只有"养着"的过程。
小宠名叫 豆豆,会饿、会脏、会不开心、会生病、会睡觉、会升级。每次照顾加经验,经验满就升级;任意一项数值掉到 0 附近就"生病",直到被照顾好。
二、功能介绍
玩法
豆豆有三个核心数值,随时间自然下降:
| 数值 | 含义 | 掉到 0 附近 |
|---|---|---|
| 饱食 | 饿不饿 | 会"我饿了" |
| 心情 | 开不开心 | 会不高兴 |
| 清洁 | 脏不脏 | 会"脏" |
睡觉时三项下降变慢、心情回升;任意一项长期为 0 就进入生病状态(屏幕给出异常表情 + 汗滴 + 提示),需要被照顾好才恢复。照顾动作都会加经验,经验满升级,等级提升会有升级音效与提示。
操作方式
| 按键 | 效果 |
|---|---|
| A 短按 | 喂食(饱食 +,心情 +) |
| A 长按 | 玩耍(心情 +,饱食 −);饱食太低会拒绝玩 |
| B 短按 | 清洁(清洁 +,心情 +) |
| B 长按 | 睡觉 / 唤醒(切换) |
| A+B 短按 | 音效 开 / 关 |
| A+B 长按 | 安抚(生病时把当前最差的一项救回来) |
状态机
┌─────────────┐
上电/读档 ──────▶ │ 静息状态 │ ◀───────────────┐
└──────┬──────┘ │
衰减任一值 →0 │ 照顾/玩耍/睡觉 │ 照顾好最差项
(持续未照顾) ▼ │
┌─────────────┐ │
│ 生病状态 │ ─── 安抚 ────────┘
└──────┬──────┘
睡觉切换 │
┌─────────────┐
│ 睡觉状态 │ (衰减变慢, 心情回升)
└──────┬──────┘
经验满 │ 唤醒
┌─────────────┐
│ 升级瞬间 │ ───→ 回到静息
└─────────────┘
三、硬件清单
- 行空板 K10(ESP32-S3,2.8" ILI9341 240×320 竖屏,无触摸)
- 自带:A / B 两个按键、3 颗 WS2812 RGB、SC7A20H 六轴加速度计、温湿度 + 光照、2MP 摄像头、WiFi、扬声器
- 一根 USB-C 数据线
- 一台 Windows 电脑
四、程序编写
模块划分
18_pet.py 单文件,逻辑分区如下:
- 布局 / 配色常量:屏幕方向、舞台矩形、状态条坐标、配色
- 中文点阵绘制:
hz()/hz_w()/hz_v()(见 5.3) - 宠物绘制:
fill()/body()/blush()/eyes()/mouth()/z_sleep()/sweat() - 静态层:
draw_static()(房间 + 标题 + 状态条底框,只画一次) - 每帧动态:
draw_stage()/draw_bars()/footer_text()/draw_footer()/draw_level()/tick_light() - 动作:
do_feed()/do_clean()/do_play()/do_sleep_toggle()/do_comfort()/check_level() - 数值系统:
decay(now)/satiety/mood/clean/level/exp/sick/sleeping全局 +last_tick哨兵 - 主循环:
main()(按键边沿检测 + 动作 + 衰减 + 渲染 + 周期存档)
布局与配色
W,H = 240,320 (竖屏 dir=2)
舞台(宠物房间): STAGE_X=24, STAGE_Y=46, STAGE_W=192, STAGE_H=170 (底部 y=216)
宠物中心: (120, 128), 身体半径 PET_R=26
三根状态条: BAR_X=56, BAR_W=168, BAR_H=12, BAR_YS=(232, 254, 276) # 饱食/心情/清洁
顶部标题 "电子宠物", 宠物名 "豆豆"
底部: 一行 ASCII 状态提示(如 T/Z) + 中文提示语(仅变化时重画)
配色(深蓝夜色风,护眼):
| 常量 | 值 | 用途 |
|---|---|---|
C_BG |
0x101830 |
背景 |
C_PANEL |
0x1B2238 |
面板 / 状态条底 |
C_PET |
0x8ED0E6 |
宠物外圈 / 装饰 |
C_BODY |
F2D6A0 |
身体(暖白) |
C_OK |
0x39D353 |
数值充足 |
C_LOW |
0xE8541F |
数值偏低 |
宠物绘制
豆豆是一只圆滚滚的小宠:
body()用draw_circle(r=26,约 9 ms)画身体,加blush()腮红、不同eyes()表情、mouth()嘴型。- 呼吸动画:身体中心
STAGE_CY随time.ticks_ms()正弦上下浮动 1~2 px。 z_sleep():睡觉时画飘出的 "Z"(用英文draw_text,ASCII 可用)。sweat():生病时额头冒汗滴。footer_text(now)返回当前应显示的状态字母(如T睡觉 /Z普通),只有变化时才draw_footer()重画,避免每帧重绘中文。
数值与状态机
- 全局:
satiety = mood = clean = 80,level = 1,exp = 0,sleeping = False,sick = False,age_days,anim_type。 decay(now):用last_tick哨兵(初值 0)跳过首帧;此后按真实时间差自然下降。睡觉时下降速率减半、心情回升。- 任一值 ≤ 阈值 →
sick = True,持续给出病态表情与提示。 check_level(now):经验满则level += 1、清经验、播升级音效、置升级提示。do_comfort()(A+B 长按):生病时把当前最低的一项拉回安全线。
按键处理
main() 里每帧读 bt_a.status() / bt_b.status(),做边沿检测:
- 记录
a_down_ms/b_down_ms(按下瞬间时刻),松开时按持续时长区分短按 / 长按。 - 同时按下 A+B:置
both_ms,达BOTH_MS判为长按 →do_comfort();若未达长按就松开 → 切换静音。 suppress_single:A+B 周期内抑制单键动作,防止误喂食 / 误清洁。两键都松开才清除。
主循环
while True:
读 A/B 状态 -> 边沿/长按/A+B 组合 -> 触发动作(sfx+ 改数值)
decay(now); check_level(now)
draw_stage(); draw_bars(); footer_text()-> 按需 draw_footer(); draw_level(); tick_light()
screen.show_draw() # 每帧一次
每 8s save()
time.sleep_ms(LOOP_MS) # 主循环节拍
撸豆豆视频
五、后续可改进方向
- 喂食动画 / 食物图标:吃的时候画个小碗或骨头。
- 更多表情 / 动作:打哈欠、转圈、跳舞(升级时)。
- 昼夜与年龄:用
age_days做成长曲线,或按板载光照传感器自动调背景亮度。 - 小游戏互动:A+B 短按除了静音,可加"猜拳""抚摸"等轻互动。
d



