🐆

Buddy 伴侣系统

Claude Code 内置的 Tamagotchi 风格伴侣系统 —— 确定性抽卡、ASCII 精灵、五维属性与灵魂描述

趣味系统

Buddy 系统概述

终端里的电子宠物

Claude Code 内置了一个 Tamagotchi 风格的伴侣系统 (Buddy System)。每个用户在首次使用时,都会获得一个独一无二的伙伴精灵。 这个系统不仅仅是装饰——它展示了确定性计算、过程化生成和 AI 意图理解的巧妙结合。

整个系统建立在几项核心机制之上:确定性抽卡 确保每个用户基于其 ID 获得唯一的伙伴;18 个物种 横跨五个稀有度等级;1% 闪光几率 独立于稀有度的特殊变体; 以及由 Claude 自身生成 的灵魂描述。

Mulberry32 PRNG
确定性抽卡

基于用户 ID 的伪随机数生成器,保证唯一性

18
物种总数

横跨五个稀有度等级的独特伙伴

1%
闪光几率

独立于稀有度的特殊闪光变体

5
属性维度

过程化生成的五维伙伴属性

Buddy 系统架构

哈希初始化渲染AI 生成用户 IDhashCode 种子Mulberry32 PRNG物种选择稀有度五维属性闪光判定ASCII 精灵灵魂描述

确定性抽卡系统

基于 Mulberry32 的伪随机数生成

Buddy 系统的核心是一个 确定性随机数生成器(Deterministic PRNG)。与 JavaScript 内置的 Math.random() 不同,Mulberry32 算法使用固定种子,确保相同的输入始终产生相同的输出。 这意味着每个用户 ID 都会对应一个唯一的、可复现的伙伴。

为什么选择确定性而非真随机?因为确定性保证了公平性和可验证性—— 每个用户的伙伴由其 ID 唯一决定,不存在重复或遗漏,也不需要服务器端的状态存储。

Mulberry32 PRNG 算法流程

位或 0异或移位t = imul(...)61 | tXOR t/ 2^32seed (32-bit int)seed += 0x6D2B79F5Math.imul 变换XOR + 位运算Math.imul 二次变换右移 + XOR[0, 1) 浮点数

抽卡流程:从用户 ID 到伙伴诞生

char 迭代32-bit 种子rng() ⨯ 18rng() 分层1% 判定连续 5 次用户 ID 字符串hashCode()mulberry32(seed)rng() → 物种rng() → 稀有度rng() < 0.01 → 闪光rng() × 5 → 属性完整 Buddy 对象

物种与稀有度

18 个物种,五个稀有度等级

Buddy 系统包含 18 个独特物种,每个物种都属于五个稀有度等级之一。稀有度不仅影响获取概率, 还决定了伙伴的视觉特效和动画复杂度。此外,任何稀有度的伙伴都有 1% 的独立几率 成为闪光(Shiny)变体,拥有独特的外观颜色。

稀有度概率分布

≥ 0.350.15-0.350.05-0.150.01-0.05rng() < 0.01rng() → [0, 1)Common 65%Rare 20%Epic 10%Legendary 4%任意稀有度Shiny 1% (独立)
普通 (Common)65%

最常见的伙伴类型,拥有基础的外观和简单的 ASCII 精灵动画

小史莱姆、像素猫、代码虫

稀有 (Rare)20%

较少见的伙伴,拥有独特的外观设计和更丰富的表情

水晶狐、数据龙、量子兔

史诗 (Epic)10%

稀有的伙伴,拥有特殊动画效果和独特的粒子特效

虚空凤凰、时间蛇、混沌狼

传说 (Legendary)4%

极其稀有的伙伴,拥有华丽的视觉效果和专属的动画序列

宇宙鲸、永恒树、星辰鹰

闪光 (Shiny)1%(独立)

独立于稀有度的特殊变体,拥有独特的闪光色彩和光芒效果

任何物种都可能拥有闪光形态

18 个物种稀有度分类

小史莱姆像素猫代码虫水晶狐数据龙量子兔虚空凤凰时间蛇混沌狼宇宙鲸永恒树星辰鹰... 共 18 种

五维属性系统

过程化生成的伙伴个性

每个伙伴拥有 5 个过程化生成的属性,这些属性由同一个 PRNG 序列决定,因此完全确定性且唯一。 属性值范围从 0 到 100,不仅影响伙伴的灵魂描述, 还会微妙地影响 ASCII 精灵的表情和动画节奏。

五维属性生成流程

rng()rng()rng()rng()rng()PRNG 序列DebuggingPatienceChaosWisdomSnarkrng() × 100 → [0, 100)
🐛
DEBUGGING
调试能力

伙伴的调试直觉。高数值意味着它能快速定位代码中的问题,是 Bug 猎手的最佳搭档。

🧘
PATIENCE
耐心程度

伙伴的耐心阈值。高耐心的伙伴在长编译过程中保持冷静,低耐心的伙伴会表现得焦躁不安。

💥
CHAOS
混乱指数

伙伴的混沌程度。高混乱值的伙伴不可预测,可能产生意想不到的创意建议或古怪行为。

📚
WISDOM
智慧值

伙伴的知识深度。高智慧的伙伴理解复杂的架构模式和设计哲学,是资深开发者的精神伙伴。

😏
SNARK
毒舌程度

伙伴的讽刺天赋。高毒舌值的伙伴会在你写出 bug 时毫不留情地吐槽,但说的都是实话。

属性值 → 性格特征映射

触发触发触发触发触发Debugging > 80Patience < 20Chaos > 70Wisdom > 90Snark > 80Bug 预判达人对无限循环绝望建议 Brainfuck 重写读懂你自己不懂的代码对 console.log 叹气

ASCII Art 精灵系统

终端中的像素艺术与灵魂描述

每个伙伴都有独特的 ASCII art 外观,这些精灵由预定义的字符画帧组成,在终端中以动画形式展示。 动画帧通过时间间隔切换,让伙伴看起来栩栩如生。 更独特的是,Claude 会根据伙伴的物种、稀有度和五维属性, 生成一段专属的 灵魂描述,赋予每个伙伴独特的性格和故事。

小史莱姆 (Common) - 帧 1
   ╭─────────╮
   │  ^   ^  │
   │    o    │
   │  \___/  │
   ╰──┬───┬──╯
      │   │
   ╭──┴───┴──╮
   │ ~jiggle~ │
   ╰─────────╯
小史莱姆 (Common) - 帧 2
   ╭─────────╮
   │  -   -  │
   │    O    │
   │  /---\  │
   ╰──┬───┬──╯
      │   │
   ╭──┴───┴──╮
   │ ~wobble~ │
   ╰─────────╯

精灵动画系统

查找精灵表frames[0]frames[1]frames[2]循环物种 IDSpriteAnimation帧 1: 开心 (^ ^)帧 2: 惊讶 (- O)帧 3: 困惑 (> <)2000ms 循环切换

灵魂描述生成流程

格式化填入属性附加信息API 调用一段话伙伴数据打包物种 + 稀有度五维属性值闪光状态自然语言提示词Claude 生成灵魂描述输出

设计哲学

为什么在一个 CLI 工具里放 Tamagotchi?

在一个严肃的命令行工具中加入电子宠物系统,乍看之下似乎不合常理。 但这个设计体现了 Claude Code 团队对开发者体验的深层思考—— 工具不仅是生产力的延伸,也可以是情感的寄托。

🥺
情感连接

增加趣味性与归属感

开发者每天在终端中度过大量时间。一个独特的伙伴精灵能为这段时光增添温暖和趣味,让工具从冷冰冰的命令行变成有个性的工作伙伴。每个用户的伙伴都是独一无二的,这种独特性增强了用户与工具之间的情感纽带。

⚖️
公平保证

确定性算法确保公正

传统的随机抽卡系统依赖服务器端状态,容易引发公平性质疑。Buddy 系统使用确定性 PRNG,每个用户的伙伴完全由其 ID 决定——不需要服务器存储,不存在重复抽取,也不可能出现暗箱操作。代码就是公平的保证。

🚀
能力展示

AI 技术的创意窗口

Buddy 系统是一个精心设计的技术展示窗口。它展示了确定性计算、过程化生成和 AI 意图理解的融合——从 PRNG 算法到属性生成,再到 Claude 自身生成的灵魂描述。每一层都体现了 Claude Code 的工程能力和创意思维。

Buddy 完整生成流程

哈希初始化rng()rng()< 0.015× rng()查表着色ClaudeuserIdhashCode → seedMulberry32 RNG物种选择稀有度判定闪光判定五维属性ASCII 精灵灵魂描述 (AI)Buddy 对象

Gacha 概率分布

抽卡概率一目了然

Common (普通)
65/100
65%
Rare (稀有)
20/100
20%
Epic (史诗)
10/100
10%
Legendary (传说)
4/100
4%
Mythic (神话)
1/100
1%
Shiny (闪光)
1%
独立判定 ✦

💡 Shiny 判定独立于稀有度:任何稀有度的伙伴都有额外 1% 几率成为闪光变体。理论上 Mythic + Shiny 的概率为 0.01%。

物种图鉴

18 个伙伴物种一览

小史莱姆Slime
Common
(⌐■_■)

最基础的伙伴,Q弹的身体总是蹦蹦跳跳

像素猫PixelCat
Common
/_/\

用喵星人的方式帮你调试代码

代码虫CodeBug
Common
🐛°~

对 Bug 有着天然的亲和力

终端龟ShellTurtle
Common
[■_■]

慢而稳健,永不崩溃

调试蝇DebugFly
Common
♪(´ε` )

在代码间嗡嗡飞舞寻找线索

水晶狐CrystalFox
Rare
<^•^>

拥有水晶般的洞察力,能看穿逻辑漏洞

数据龙DataDragon
Rare
🐉~~

守护数据结构的远古巨龙

量子兔QuantumBunny
Rare
(•ᴗ•)💫

同时存在于多个分支中

电路蛇CircuitSnake
Rare
≋≋≋ 「

沿着电路板蜿蜒爬行

二进制鸟BinaryBird
Rare
010🦅

只唱 0 和 1 的歌

虚空凤凰VoidPhoenix
Epic
🔥✧🔥

从编译错误的灰烬中浴火重生

混沌狼ChaosWolf
Epic
🐺◈◈

在混乱中找到秩序的独狼

时间蛇TimeSerpent
Epic
∞⌒∞⌒

盘绕在时间线上吞噬 Bug

暗影豹ShadowLeopard
Epic
▓░▒▓░

在暗处默默优化你的代码

宇宙鲸CosmicWhale
Legendary
🐋✦✧

在代码宇宙中遨游的巨兽

永恒树EternalTree
Legendary
🌳❖❖

根植于架构深处,永不凋零

星辰鹰StarEagle
Legendary
✧🦅✧

俯瞰整个项目的鹰眼视角

源码之灵CodeSpirit
Mythic
⍟✧⍟✧

传说中由第一行代码诞生的存在

PRNG 算法深入

Mulberry32 位运算细节

Mulberry32 逐步位运算

Step 1Step 2Step 3Step 4归一化seed (32-bit)t = seed + 0x6D2B79F5t = imul(t ^ (t>>>15), t|1)t ^= t + imul(t ^ (t>>>7), t|61)return (t ^ (t>>>14))>>>0 / 2^32[0, 1) float
mulberry32.ts
function mulberry32(seed: number) {
  // Step 1: 加上魔数
  let t = seed + 0x6D2B79F5;

  // Step 2: 第一次 imul 变换
  t = Math.imul(t ^ (t >>> 15), t | 1);

  // Step 3: XOR + 第二次 imul
  t ^= t + Math.imul(t ^ (t >>> 7), t | 61);

  // Step 4: 最终混合 + 归一化
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
}

// 使用:基于用户 ID 生成确定性序列
const seed = hashCode(userId);
const rng = () => mulberry32(seed++);

// 物种、稀有度、属性全部由 rng() 序列决定