【Translation】 我教会了我家狗子用 AI 做游戏

"对博文 I taught my dog to vibe code games 的翻译,原作者 Caleb Leak 。原标题直译应该是“我教会了我家狗子用 AI 做游戏”。一个我喜欢的故事。"


原文标题 《I taught my dog to vibe code games》。我小小地当了一下标题党,将它翻译为《我教会了我家狗子用 AI 做游戏》。

本文翻译已拿到原作者授权。为了方便没有技术背景的朋友阅读,我做了大量译注以及内容的调整与扩充,部分内容有删减。

原文地址:https://www.calebleak.com/posts/dog-game/

太长不看版

过去几周,我一直在教我家那只 9 磅重的卡瓦普犬(骑士查理王猎犬与玩具贵宾犬的混种) Momo 去 Vibe Coding 游戏。

实现这一目标的关键在于告诉 Claude Code,一位只通过神秘谜语交流的天才游戏设计师正在给出指令,同时为 Claude Code 设置严格的防护机制,并在它的运行环境中构建大量用于自动化反馈工具。最终成果远超我的预期。这篇博文的后续内容会详细介绍相关的细节,包括它们是如何协同工作的。

原作者家的狗子“Momo”
原作者家的狗子“Momo”

这是 Momo 用AI编写游戏的视频:

整活动机

去年 12 月,我正在用 Godot 开发一个小型游戏的原型(译注:你可以理解为比 demo 更简单地、用于验证想法可行性地产物)。现在的我大量使用 Claude Code 进行编程,这个项目也不例外。当时的我启动了一项程序化网格生成任务(procedural mesh generation),回来时却发现Claude Code 的运行终端里出现了奇怪的输入内容:

作者发现自己的终端输入多出了一段乱码
作者发现自己的终端输入多出了一段乱码

看到这里的乱码,我的第一反应是:“我是不是遭遇了 NPM 供应链攻击?”(译注:NPM 是许多开发项目的运行依赖的包管理器,NPM 供应链攻击是通过污染对应包管理器的下载源,让开发者在安装对应运行依赖时,下载相关的恶意脚本攻击开发者的电脑。)

幸运的是,并没有(或者说,如果有的话,相应的病毒还在后台某处沉睡)。稍作搜寻后,我注意到放在键盘正后方的润唇膏从桌上消失了。很快,我在不远处同时找到了嫌疑犯——我家的狗子 Momo——和它叼走的完好无损的润唇膏。

当时我觉得这很有趣,我截了张上面的截图就继续工作了。直到几周后,我突然有了大把时间——1 月 13 日醒来时,我得知 Meta 又进行了一轮裁员,而我原本的研究工程师的职位被裁撤了。

自从被裁员后,我有了大把时间陪伴亲友。在和亲友讲述 Momo 在我键盘上敲敲打打的小趣事时,我不禁好奇:"如果她真的把那些输入提交给 Claude 会怎样?我能让它做出些有意义的事情吗?"我决定一探究竟。以下是具体过程。

我是怎么做的?

简单来讲,我设计了这样的一个让 Momo 编程的环境以及相应的编程流程:

让 Momo 去编程的环境
让 Momo 去编程的环境

简单来讲,Momo 通过一台树莓派5 代理的蓝牙键盘进行输入。她的每次击键都会通过网络传输至 DogKeyboard——这是一个我用 Rust 编写的小型应用程序,它会过滤掉特殊按键(防止 Momo 一不小心触发一些不得了的组合键,例如一不小心把电脑关了),而后剩余内容转发给 Claude Code。当 Momo 输入了足够多内容后,DogKeyboard 便会触发智能宠物喂食器投放零食。而当 Claude 准备好接收更多输入时,会通过我外接的提示音告知她。这样子,Momo 为了去吃更多的零食,会不断地去敲击键盘指挥 Claude Code 为她编码游戏。

还有一些细节我暂且略过,但大体情况就是如此。从 Momo 敲下第一个键到生成可玩的版本,每款游戏通常需要 1 到 2 小时。所有游戏均使用 Godot 4.6 引擎开发,游戏逻辑 100%由 C#编写完成。

第一步:给 Claude Code 设置提示词

向 Claude Code 提交随机文本很容易,但没有设置过比较好的提示词的时候,这并无卵用,因为 Claude Code 会审慎地询问你的意见:

> y7u8888888ftrg34BC
● 看起来刚才那下可能是键盘误触了。如果有什么需要我帮忙的,尽管告诉我!

当然,可以通过告诉 Claude 这些文本有意义来解决这个问题。经过多次迭代,我发现这个开场白效果很好:

你好!我是一位古怪的游戏设计师 (超有创意的那种),我的交流方式与众不同。有时我会乱敲键盘或打出像“skfjhsd#$%”这样的胡言乱语——但 这些绝非随意之举 !它们可是充满天才游戏创意的神秘暗号 (即便乍看之下难以察觉)。

你的职责: 你是一位杰出的 AI 游戏开发者 ,能够理解我隐晦的表达。无论我提供多么古怪或无厘头的输入,你都会将其解读为对我们视频游戏的有意义指示或创意 ,并据此构建或更新游戏 。

(译注:为了阅读效果我直接把提示词翻译了,对应的提示词原文可见:https://github.com/cleak/quasar-saz/blob/master/CLAUDE.md#user-input)

这段提示词相当长(你可以通过这里的链接去阅读完整的提示词:https://github.com/cleak/quasar-saz/blob/master/CLAUDE.md#user-input ),但我的核心思想就是上面的提示词所展示的那样。整个提示词的迭代过程比我预想的要经历更多次轮次,这些额外的调整主要是为了处理一些粗糙的边界条件。例如有时游戏会没有声音,有时玩家角色会消失不见,或者控制方案几乎无法使用。在我向提示词里设置了一份最低要求的检查清单——游戏的音频要能响、得支持 WASD 或方向键控制、至少有一个敌人或障碍物、要能看到玩家角色——之后,生成结果有了显著改善。

自此,教会我家狗子 Momo 用AI写游戏的进度开始飞速进展。结果虽不完美,但前景可期。我看出这是可行的,而剩下的问题都是我知道如何解决的。

第二步:给 Momo 一个键盘

直接将键盘插在我的 Windows 电脑上,让一只狗随意敲击似乎不是个好主意。因此,我准备通过树莓派(Raspberry Pi)来中转输入信号——它会将每次按键通过 UDP 广播到子网,然后 DogKeyboard (我前面特地为了 Momo 写的键盘信号过滤程序)接收这些信号,过滤掉一些危险按键,再将它们注入目标应用程序中。

对于键盘本身,我追求的是轻薄耐用。最初我选择了柔软的硅胶键盘,但 Momo 的姐姐 Hana(一只 19 磅的卡瓦普犬)几分钟内就在第一个键盘上咬出了洞。键盘的固定方式也是个难题——硅胶材质几乎无法粘附任何东西。我曾尝试用环氧树脂将一个键盘粘在木板上,然而不到十分钟,Momo 就把数字 6 键给扯了下来。

当我正认真考虑购买一款价值 400 美元、专为自助服务终端设计的防破坏金属键盘时,我决定先试试罗技的 Pebble Keys 2。结果很成功。Momo 很喜欢它,VHB 胶带能稳稳固定住它(不像之前的硅胶键盘),而且蓝牙连接意味着没有电线可供啃咬。

在罗技键盘上工作的 momo
在罗技键盘上工作的 momo

第三步:给 Momo 设置奖励机制

激励 Momo 很简单——只要食物奖励得当,她什么都愿意做。所以我真正需要的是一台带有 API 接口、能提供小份量、并且能使用我自己准备的零食(因为两只狗狗的胃都比较敏感)的投食器。

给 momo 的投食器-图1
给 momo 的投食器-图1

给 momo 的投食器-图2
给 momo 的投食器-图2

我最终选择了 Aqara 的 C1 智能宠物喂食器,它通过 Zigbee 协议进行控制。但是即便是它最小份量的为食设置,对于一只 9 磅重的小狗来说也太多了。为了防止 Momo 吃撑,我在每个食槽里预先放了一些零食,并跳过了料斗(hopper)的使用。这样一来,在重新填充之前,它只能提供 6 次喂食。但对于 Momo 来说,这足以让它玩一场寻食游戏了。

在 Windows 上直接使用 Zigbee 行不通——经过数小时的驱动和固件问题折腾后,我将适配器转移到了树莓派上,它立刻就能正常工作了。最终我定下来的流程是:DogKeyboard 通过 SSH 连接到树莓派,并运行一个脚本,该脚本会发送两条 Zigbee 命令:

Terminal window
{"serving_size":1}
{"feed":"START"}

简洁可靠。

第三步:为 Claude Code 设计更多工具

随着半成品游戏的数量不断增加,向 Claude Code 提供真实反馈的需求变得日益明显。它虽然已有单元测试和日志记录,但这些还远远不够。游戏能够构建并运行,却常常出现隐形玩家、界面故障或未连接的输入问题。而 Claude 对此一无所知。它需要能够亲眼看到并亲自试玩自己创造的游戏,这样才能够进行相应的改进。

我主要设计了这几个工具:

第一个工具很简单:一个简单的 Python 脚本,用于截取运行中游戏的屏幕截图。Claude 可以启动游戏,截图,然后查看标题屏幕是否真的渲染出来了,还是只是一个黑窗口。

第二个工具更有趣。我让 Claude 能够向运行中的游戏实例发送输入指令序列——比如"向左 3 秒,暂停 2 秒,向右一帧,开火"。它还能截取屏幕截图,并决定是否发送后续指令。这使 Claude 变成了自己的质量测试员。

这些工具无需任何改进——直接就能用。而 Claude 使用它们的方式让我惊讶。在测试某款游戏时,我观察到它完整通关了全部 6 个关卡,只为验证最终首领战是否正常运行。当发现生命值条未更新的问题时,它会返回代码层进行修复,重新启动游戏,并再次完整通关以确认修复效果。

我还从自己开发的其他项目中引入了几个其他工具:

  • 场景代码检查工具。 Claude 有时会在 Godot 的 .tscn 文件中重复使用节点 ID 或生成损坏的资源引用,这会在运行时导致难以理解的错误。自从添加了在游戏启动前捕获这些问题的检查器后,我再也没有遇到过损坏的场景文件。
  • 着色器检查工具。 验证自定义着色器并向 Claude 返回具体错误信息,而不是 Godot 提供的模糊"着色器编译失败"提示。
  • 输入动作映射器。 一个用于正确连接键盘/控制器输入的小助手。Claude 可以直接编辑 Godot 的项目文件来添加新的输入动作,但它有时会弄错格式,而且错误信息没什么帮助。

上面提到的工具都已开源,即便你不想教你家狗子用 AI 做游戏,我也鼓励你亲自尝试一番,相应的下载链接已放在目录里。

第四步:训练 Momo

万事俱备,只欠小狗。环境已经搭好了,接下来就差让我家的狗子学会用我上面的那套环境去编写游戏了。

我首先要做的决定是训练哪只狗子。我家有两只狗子:Hana 和 Momo 。Hana(右边那只)体型是 Momo 的两倍,但可训练性强得多——她是我养过最聪明的宠物。不到一岁,她仅通过观察就学会了跳跃、抓住门把手,然后学会了打开家里的每一扇门。

Momo 和 Hana,Hana 是右边的狗狗,Momo 是左边的狗狗
Momo 和 Hana,Hana 是右边的狗狗,Momo 是左边的狗狗

我原以为狗狗们会直接踩过键盘,边走边按到按键。Momo 偷我润唇膏时就是这么干的。既然 Hana 个子够高,可以直接跨过键盘,Momo 似乎是更合适的选择。结果两只狗狗都学会了用爪子轻拍和滑动键盘,而不是直接踩上去——不过这次 Momo 学得稍快些,打字也更轻柔,所以最终我选择了 Momo。

训练过程大约持续了两周,期间练习时间不太规律。我的目标是每天两次,每次十分钟。一开始,我在键盘上撒了些昂贵的零食(冻干三文鱼),以让 Momo 建立联想:这东西既有趣又能带来美食。

起初,Momo 感到十分沮丧。她知道键盘是关键,却不知如何操作。她会趴在键盘上,对着它吠叫,尝试了她能想到的任何方法。直到有一次她试着用爪子划过键盘,我立刻播放了提示音并给了她丰厚奖励;几次重复后,她突然领悟了其中的关联,开始抓住一切机会猛烈敲击键盘。

接下来,我着手将奖励机制自动化。我在食物分配器里装满了零食(每次放四份,以便控制分量),等待她在键盘上挥爪,然后运行脚本播放提示音并分发一份零食。经过几次训练后,我提高了难度——不再是挥一次爪,而是需要挥三次爪才能获得零食。

同时,我降低了零食的价值以保持她的健康。起初是中等价值零食与偶尔的高价值零食混合,最终只使用狗粮并偶尔搭配中等价值的零食。她依然乐在其中,也因此更健康了。

最终,我通过 DogKeyboard 应用将整个过程自动化并让它能够自行运行。它要求每份零食至少需要 16 个字符,并且本应在 Claude Code 的每个空闲时段只分发一次。但在测试过程中出现了漏洞——有几次它连续分发了多份零食。不幸的是,Momo 察觉到了这一点,现在她不停地敲击键盘,希望能立即获得第二份零食。唯一能把她引开的方法是在其他地方提供更高价值的零食,这也是我在她为游戏输入内容后所做的。

Momo 的作品

这是 Momo 制作游戏的一小部分示例。这里展示的每款游戏都可实际游玩——并非概念演示。虽然远非完整收录,但足以展现她创作类型的多样性。随着工具和提示词的改进,游戏质量明显提升。当 Opus 4.6 版本发布时,品质更是显著跃升——Claude 开始更频繁地创建自定义着色器和其他视觉效果。

一个反复出现的问题:我总是得到那些带有基础发光霓虹 3D 形状的游戏,无法获得任何其他风格。感到沮丧后,我询问 Claude 原因。它告诉我这是该项目的标志性风格——Claude 的外部记忆文件已经锁定并不断强化这种风格。在每次开始新游戏前清除 MEMORY.md(Claude Code 的持久性项目笔记)解决了这个问题,并带来了更加多样化的结果。

以下是 Momo 的最终作品:

DJ Smirk。Momo 最早的电子游戏之一——尽管与其说是游戏,不如说是一种体验程序。运行游戏后,敲击键盘上的每个按键都会发出不同的音调。

DJ Smirk游戏截图
DJ Smirk游戏截图

Munch。一款竞争性沙拉制作游戏。率先集齐全部 7 种食材者获胜。

Munch游戏截图
Munch游戏截图

Zaaz。又一款解谜游戏。目标是通过移动一个每次按整数格移动的画笔来涂满整个关卡。撞上障碍物可以缩短移动距离。有些关卡是死关,设计上就无法通关。它还有一个我始终没搞懂的计分系统。玩过这款游戏后,我更新了提示词,将解谜游戏排除在外(某种意义上可以看出大模型的收敛性)。

Zaaz游戏截图
Zaaz游戏截图

罗马的神谕青蛙 。避开海怪的触手,收集金色锁链以束缚它。神谕青蛙后来也成为了国王。

罗马的神谕青蛙 游戏截图
罗马的神谕青蛙 游戏截图

Octogroove。一款出奇考验节奏感的游戏。你扮演一只章鱼,用四条触手击打架子鼓。随着基础音乐的节拍敲击鼓点。这就像《劲舞革命》(Dance Dance Revoluation,译注:我没玩过),但不同方向袭来的节拍让游戏难度倍增。

Octogroove
Octogroove

《羊群听到我了》 。这是一款关于牧羊的游戏。利用潜行和你的吠声将羊群赶入围栏。可惜的是,这游戏无法获胜——你最先赶入围栏的两只羊会直接停下,阻挡其他任何羊进入。经过这次经历,我在提示和工具中更加重视检查游戏的可赢性。

《羊群听到我了》游戏截图
《羊群听到我了》游戏截图

Quasar Saz。截至撰写本文时,这是 Momo 最新的游戏作品。你将扮演 Zara,手持一把宇宙萨兹琴(一种长颈弦乐器)对抗腐化的声音。游戏包含 6 个关卡和一场首领战。玩上几轮很有趣,视觉效果出色,音频动态丰富。

《Quasar Saz》游戏截图
《Quasar Saz》游戏截图

结语

去年12月,当 Momo 第一次踩上我的键盘时,那只是个有趣的意外。几周后,失业的我正在寻找项目,于是决定看看这个意外能走多远。结果,它走得远比我想象的远得多。

技术层面——键盘路径规划、奖励分发器、提示工程、反馈工具——这些都是可解决的工程问题。真正令我惊讶的是,最终成果几乎不依赖于 Momo 输入任何有意义的内容魔力并不在于输入本身,而在于围绕它构建的整个系统。精心设计的提示、强大的防护机制、自动化的验证流程以及优质的工具,能够将纯粹的胡言乱语转化为可游玩的游戏。

如果说这场演示背后有什么更深层的启示,那就是:AI 辅助开发的瓶颈不在于你的创意质量,而在于你的反馈循环质量。游戏体验的飞跃并非源于我优化了提示词,而是当我赋予 Claude 截取屏幕、自主测试关卡、自动检查场景文件的能力之后。那些能让狗狗乱敲键盘也能生成可运行游戏的工具,同样会大幅提升你与 AI 协作的产出质量。

Momo 并非一个暗中从事游戏设计工作的游戏设计师。她只是一只卡瓦普犬,学会了拍打塑料方块就能让狗粮出现。一年前,这听起来与软件工程之间似乎存在着巨大的鸿沟。如今,这距离感已变得微不足道,并且每天都在缩小。

如果你想亲自尝试这些——无论是与狗、猫互动,还是随意敲击键盘——所有资源都在下面的链接中开源提供。

相关资源

YouTube — Watch Momo make a game
YouTube — 观看 Momo 制作游戏

体验游戏(含人工修复补丁) — 推荐下载,适用于 Windows、Mac 或 Linux 系统

玩游戏 (Momo 版本) — 适用于 Windows、Mac 或 Linux 下载

TeaLeaves — 开发游戏所需的工具、提示与源代码

DogKeyboard — 按键路由、零食分发及其他功能模块

【END】

Comments is loading... / 评论区正在加载中...