介绍项目
一只住在你电脑桌面上的小猫。它有自己的生活(会饿会困会无聊),也会主动找你互动。你对它做什么,它都会记住,并且慢慢形成自己的性格。市面上的桌面宠物要么是静态壁纸,要么需要联网调用AI接口。我想做一个不一样的:
最终成品是一个200×280像素的透明窗口,一只矢量风格的卡通猫会"住"在你的桌面上。
运行的效果
下载游戏
关注后回复「01桌宠」,我把游戏下载方式和源码链接发你。
| |
|---|
| 左键单击 | 随机触发摸摸头 / 玩耍 / 打招呼,宠物立刻切换表情并说话 |
| 按住左键拖拽 | |
| 右键单击 | |
| 左键单击 | |
| 左键双击 | |
| 右键单击 | |
🎮 互动全表:你做什么,宠物有什么反应
打招呼 🙋
| |
|---|
| |
| 开心 😊(50%)/ 好奇 🤔(30%)/ 活泼 🐾(20%) |
| |
| "你好呀!小咪在这里~"、"嗨!小咪想你了!" 等问候语 |
摸摸头 🖐️
| |
|---|
| |
| |
| 开心 😊(50%)/ 好奇 🤔(20%)/ 犯困 😴(10%) |
| |
| |
| |
称赞 👍
| |
|---|
| |
| |
| 兴奋 🤩(50%)/ 开心 😊(30%)/ 撒娇 🥺(10%) |
| |
| |
| |
喂食 🍽️
| |
|---|
| |
| |
| 开心 😊(50%)/ 好奇 🤔(30%)/ 活泼 🐾(10%) |
| |
| "谢谢你一直陪着我!"、"你对我真好!" 等感谢的话 |
| 你喂了它什么(小鱼干 / 猫粮 / 零食 / 鸡肉 / 布丁) |
下次它可能会说:"你上次喂我鸡肉好好吃~"
送礼物 🎁
| |
|---|
| |
| |
| 兴奋 🤩(50%)/ 开心 😊(30%)/ 活泼 🐾(10%) |
| |
| |
| 你送了它什么(蝴蝶结 / 小铃铛 / 毛线球 / 逗猫棒 / 小毯子) |
洗澡 🛁
| |
|---|
| |
| 开心 😊(50%)/ 活泼 🐾(30%)/ 好奇 🤔(10%) |
| |
| |
治疗 💊
| |
|---|
| |
| 开心 😊(50%)/ 安静 😌(20%)/ 犯困 😴(10%) |
| |
| "谢谢你一直陪着我!"、"你真是世界上最好的人!" |
玩耍 🎾
| |
|---|
| |
| |
| 活泼 🐾(50%)/ 开心 😊(30%)/ 好奇 🤔(20%) |
| |
| |
跳舞 💃
| |
|---|
| |
| 跳舞 💃(50%)/ 兴奋 🤩(30%)/ 开心 😊(10%) |
| |
| |
讲故事 📖
| |
|---|
| |
| 好奇 🤔(50%)/ 开心 😊(20%)/ 犯困 😴(20%) |
| |
| |
| 你讲了什么故事(小猫钓鱼 / 三只小猫 / 猫和星星 / 森林冒险) |
教本领 🎓
| |
|---|
| |
| |
| 好奇 🤔(40%)/ 活泼 🐾(30%)/ 开心 😊(20%) |
| |
| |
| 你教了它什么(握手 / 打滚 / 装死 / 转圈) |
生气 😠
| |
|---|
| |
| |
| 难过 😢(50%)/ 犯困 😴(20%)/ 安静 😌(10%) |
| |
| "呜呜……心情不太好……"、"有点难过……陪陪我……" |
⚠️ 生气会让宠物性格变差,不建议常用。
改名字 ✏️
弹出一个输入框,输入新名字后,宠物会说:"以后我就叫XX啦!"
- 宠物会永远记住它的新名字
查看状态 📊
弹出一个窗口,用进度条显示当前四项属性:
📊 属性详解
四维属性
属性会慢慢变化
即使你什么都不做,属性也会缓慢变化: - 饱腹度 → 慢慢下降(饿了) - 精力值 → 慢慢下降(困了) - 心情值 → 慢慢下降(无聊了) - 健康值 → 在最饿或最累时加速下降
属性决定宠物的情绪
属性影响宠物的自主行为
每隔 15 秒,宠物会自己决定做什么:
这些行为会影响属性,形成循环。
🧠 性格系统
初始性格
每只宠物出生时有 5 个性格维度:
你的行为会改变性格
性格变化很慢(每天有上限),所以不会今天高冷明天粘人。它真的在被你慢慢影响。
性格影响什么
- 爱玩的宠物 → 更喜欢"玩耍"这个行为
- 亲昵的宠物 → 说话更甜,更爱撒娇
- 好奇心强的宠物 → 更爱探索和学新东西
💬 对话系统
宠物有两种说话方式:
1. 模板对话(80% 概率)
预设的中文句子,保证通顺自然: - 开心时 → "我好开心!你真好~" - 饿的时候 → "我好饿呀……有吃的吗?" - 困的时候 → "好困呀……想睡觉……"
2. RNN 自由生成(20% 概率)
宠物用自己训练的小型神经网络现场造句,偶尔会出现意想不到的句子,带来惊喜感。
宠物会记住你说过的话
如果它记得你喂过它鸡肉,可能会说:"你上次喂我鸡肉好好吃~" 如果它记得你教它握手,可能会说:"上次学的握手我还记得哦!"
记忆按 7 天半衰期 衰减,经常提起的事会一直记住,很久不提的会慢慢忘记。
👀 视觉反馈一览
情绪动画(11 种)
互动特效(9 种)
所有特效持续约 2~3 秒后自动消失。
运行游戏注意事项
- 首次启动会自动训练 Char-RNN(约 30 秒),训练完后弹出宠物窗口
- 数据保存在 dist\brain_models\data\,退出时自动保存
- weights.npz 和 corpus.txt 内嵌在 exe 中,运行时自动释放;JSON 状态文件是运行时生成的,不会被打包
❓ 新手常见问题
Q: 它怎么不理我?A: 左键单击它就行,或者右键打开菜单选一个互动。
Q: 它一直在睡觉/发呆?A: 检查一下属性面板,可能是精力太低或心情不好。陪它玩一玩或者喂点吃的。
Q: 怎么关掉它?A: 右键菜单 → 退出,数据会自动保存。
Q: 能重置吗?A: 删除 brain_models/data/ 下的所有文件,重启程序就是全新的宠物。
Q: 健康变成 0 会死吗?A: 不会。它只是进入生病状态(毛色变灰),治疗一下就好了。
Q: 它为什么突然自己动?A: 每隔 15 秒它会自己决定做什么(睡觉/找吃的/散步等),这是它在自主学习。
技术栈选型
数据持久化
所有数据保存在 brain_models/data/ 目录:
| |
|---|
brain_state.json | |
q_table.json | |
memory.json | |
personality.json | |
weights.npz | |
corpus.txt | |
项目结构
AI 大脑架构
整体设计
四个子系统
1. 行为引擎(Q-Learning)
基于 Q-Learning 的决策系统,宠物学习在什么状态下应该做什么。
- 状态空间:
- 饥饿 × 精力 × 心情 × 健康 × 时间段(5 个维度各 3 级离散)
- 动作空间:
sleep, play, explore, cuddle, eat, wander, groom - 学习机制:每个动作获得 reward,Q 表记录状态-动作价值
- 探索率:
状态随 tick(1 秒)自动衰减,使用δt确保帧率稳定: -饥饿每秒+ 0.02/60 - 精力每秒 -0.015/60 - 心情每秒 -0.01/60 - 健康每秒 -0.005/60(饥饿 > 80 或精力 < 20 时翻倍)
2. 性格系统(5 维向量)
- 性格影响 Q-Learning 的 reward 权重(活泼型爱玩,亲昵型爱撒娇)
- 性格随互动缓慢变化(+0.001/次,每日总变化限 ±0.1)
3. 记忆系统(时间衰减)
基于键值存储的记忆系统,所有记忆按 7 天半衰期衰减。
- 权重公式:
weight = e^{-days / 7} - 权重低于 0.05 且记数 < 3 的记忆自动清理
4. 混合对话引擎
微型 Char-RNN
模型规格
| |
|---|
| Embedding → 单层 RNN → Linear |
| |
| |
| |
| |
| |
| |
训练
- 语料库:中英文混合短句,按情绪标签分组(
<happy>, <sad> 等) - 训练方式:纯 NumPy 手动实现 RNN 反向传播(BPTT)
- 每个句子用
<start> / <end> 包裹,标签控制生成风格 - 首次启动自动训练 200 个 epoch(约 30 秒),学习率线性衰减
矢量精灵
宠物以 128×128 的矢量风格卡通形象呈现,使用 Pygame 图元(椭圆、圆、多边形、弧线、抗锯齿线)组合绘制。
情绪动画状态(11 种)
| | | |
|---|
| | | |
| | | bounce_y = abs(sin(frame0.5))6 |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
互动视觉特效(9 种)
每个互动操作会触发对应的叠加特效,持续约 2-3 秒:
精灵完全由代码定义(Pygame 图元 + SRCALPHA 合成),无需任何外部图片资源。
桌面集成
窗口特性
- 透明背景(
WA_TranslucentBackground) - 置顶显示
- 无边框无标题栏
- 无任务栏条目(Windows API
WS_EX_TOOLWINDOW) - 不窃取焦点(
WA_ShowWithoutActivating)
系统托盘
配置文件
config.py 中包含所有可调参数:
- Q-Learning 超参数(学习率 / 折扣因子 / 探索率)