Battle Drones:12轮迭代的AI编程RTS,用声音实现联机

Simon Willison 用 Claude Code 经 321 次提交做出浏览器 RTS,几乎未读代码。
Simon Willison 借助 Claude Code,经过 12 个主要版本、321 次提交,从一个简单提示词出发,做出了可在手机浏览器中游玩的即时战略游戏 Battle Drones。项目包含代码生成的 3D 模型、随机地图、六种 AI 性格、智能体对战,以及基于声波的多人联机。关键转折是 v4 的一句「Make it a LOT more fun」,在 Ultracode 模式下跑了上千场模拟对局重做数值平衡,使僵局率从 14% 降至 0.9%。技术上,确定性模拟是回放与联机的基础,项目需替换 Math.sin/cos 以消除跨浏览器浮点差异。作者对氛围编程仍持保留态度,认为该项目尚不足以被视为正经独立游戏,但已看到可行路径。
Simon Willison 用 321 次提交、12 个主要版本,把一个「手机上的红警」从无到有做成了浏览器里能玩的即时战略游戏 Battle Drones。这件事本身并不稀奇——稀奇的是他几乎没读过一行代码,而游戏已经具备了 3D 模型、随机地图、AI 对战、甚至用声波完成两台设备之间的多人同步。

一个「氛围编程」的 RTS 能做成什么样
Battle Drones 的起点是一句再朴素不过的需求:做一个能在手机上玩的 Command & Conquer 风格 RTS,两队无人机(空中与地面)争夺地盘和资源。项目从 7 月启动,用的是 Claude Fable 5,后来升级到 Opus 5.5,几乎全程在 Claude Code for Web 中完成。
最终的成品清单相当可观:9 种建筑、7 种地面载具、6 种空中载具、3 种步兵,全部是代码构建的 3D 模型;战争迷雾、对空/对地武器区分、五大生物群系六张地图、随机地图生成器、战役模式、生存模式、区域武器、补给箱、随战况变化的动态音乐、六种 AI 性格、AI 对 AI 观战、巨大的「歌利亚」机甲、变体规则、每日挑战、成就系统,以及 LLM 对 LLM 的智能体对战模式。
作者反复强调的一点是:这不是那种「看起来像游戏但玩起来无聊」的 demo。他自己都承认,这次是真的好玩。
从 v1 到 v12:进化路径里的几个关键转折
v1–v3:能跑,但不好玩
第一版用 Phaser 2D 框架搭建,作者塞给 Claude 一个 OpenAI API Key,让它调用图像生成接口产出精灵图。结果是一个「能认出来是 RTS」的原型——有建筑系统、单位指挥和一个基础 AI,但视觉粗糙,玩起来毫无乐趣。
到了 10 月,升级到 Opus 5.5 之后,一句「大幅改进这个游戏,把画面和玩法都做好,用最新的图像 API 重绘素材,加新单位、新建筑和更多样的地形」,换来了五张风格各异的地图和全面重绘的精灵图。画面终于像个正经游戏了,但作者的判断依然冷静:还是不好玩,玩一会儿就腻。
v4:「让它好玩得多」
这是整个项目最有意思的一步。作者此前一直持有一个观点:编程智能体能造出「像游戏的东西」,却造不出真正让人上瘾的体验。他决定给模型一次机会,在手机上输入了那句后来被反复引用的提示词:
This game isn't fun enough yet. Make it a LOT more fun.
这次他跑在 Claude Code 的 Ultracode 模式下——根据官方文档,它通过 JavaScript 脚本一次性编排大量子代理并行工作。从晚上开始跑,一直到第二天上午才拿到可玩的结果。
结果超出了预期。Claude 自己写了发布说明,其中最核心的是数值层面的变化:在 1200 场 AI 对 AI 的 Normal 难度测试中,25 分钟后仍未分出胜负的对局从 14% 降到 0.9%;落后 800 以上废料的阵营翻盘获胜的比例从 24% 提升到 46%。换句话说,游戏从「容易拖成僵局」变成了「局势会来回摆动」。据作者描述,这部分耗时很大程度是因为 Claude 跑了上千场模拟对局来调平衡。
Ultracode 模式是 Claude Code 提供的一种高强度运行模式,其核心机制是通过 JavaScript 脚本对任务进行编排,将一个大目标拆解并分发给大量子代理并行执行。与常规的串行对话式编程不同,它允许模型在单次任务中启动多个独立工作单元,分别处理数值调优、测试模拟、资源生成等子问题,最后汇总结果。这种模式特别适合需要大量重复实验的任务,例如跑上千场 AI 对 AI 对局来统计平衡性数据——串行执行会耗费数天,而并行编排可以把时间压缩到一夜。代价是 token 消耗显著上升,且需要模型具备较强的任务分解与结果整合能力。
v5–v9:3D 化与一个有设计意图的地图
一句「用 three.js 把这个游戏移植成 3D,所有建筑和载具都做成 3D 模型」,又是一夜运行。第二天早上,所有 3D 模型都由 Claude 用 TypeScript 代码直接构建完成。
作者后来对此感到有些愧疚:连续几个版本都只是「做得更好看」「更精致」这类指令。于是 v8 出现了他最长的一次提示词——设计一张只有把步兵用秃鹫运输机空投到岛屿上才能占领中继点的地图。这张名为 Archipelago 的热带地图,用有限采集资源和只能空运抵达的岛屿中继点,强行制造出围绕制空权和运输的战术博弈。
v10:歌利亚机甲与智能体对战
巨型机甲的设计过程是一连串头脑风暴提示词:先发散想法,再确定它移动基地的定位——可以接收废料、在周边三格内建造、生产步兵;再设计受损后武器逐级失效的机制(迫击炮先坏、激光次之,机枪永远可用);最后决定两台秃鹫才能吊运一台歌利亚。落地的效果作者原话是「真的很酷」。
同一个版本还加入了 agent battles:两个 LLM 通过工具接口获取战争迷雾内的信息并操控部队互相打。项目里有完整的对战回放,比如 Claude Haiku 5.5 对阵 GPT-6 Luna 的冰原地形对局,还附带一个能查看底层模型响应内容的调试工具。作者希望未来能把它做成联赛积分榜。
v11–v12:随机地图与声波联机
v11 的起因很随意:作者看到本周 Claude 额度只用掉 75%、45 分钟后重置,就顺手让模型在限定时间内做出随机地图生成器。产出的地图是旋转对称的,支持种子复用,河桥、岩石、森林、废料与晶体全部参与生成。
v12 则是技术上最新鲜的部分——基于声音的多人联机。两台设备靠近到麦克风能听见彼此的范围内即可同步游戏状态。这个想法延伸自他此前的 Chirp Pong 实验,Claude 先做了一个「无线电探测」工具测量两端可用带宽,确认可行后实现了完整的声音调制解调系统。作者已经在笔记本、iPhone 和 iPad 之间测试过,效果不错。
为什么用声音而不是服务器?他的理由很直接:他喜欢零运行成本的静态 HTML,不想为一个随时可能有人想玩的游戏长期维护服务器。
声音调制解调(acoustic modem) 是一种把数字数据编码为声波信号、通过空气传播并由麦克风接收解码的通信方式。其基本原理与传统的电话拨号调制解调器类似:将比特流映射为不同频率或相位的音频载波,接收端通过频谱分析还原数据。在浏览器环境中,可以用 Web Audio API 生成和播放音频,用 getUserMedia 获取麦克风输入,再通过快速傅里叶变换识别频率成分来解调。实际挑战在于环境噪声、回声、设备扬声器与麦克风的频率响应差异,以及两端时钟不同步带来的采样偏移。可用带宽通常只有每秒几百比特到几千比特,因此只适合传输紧凑的操作指令流而非完整游戏状态。
值得记下的几条工程经验
确定性模拟是回放与联机的地基
为了让回放和多人同步成立,模拟引擎必须是确定性的。项目中途遇到一个细节问题:不同浏览器(比如 Chrome 和 Safari)对 Math.sin()、Math.cos() 的返回值存在极微小差异,足以让回放失步。Claude 的解法是用自定义实现替换这些原生数学函数。
确定性模拟(deterministic simulation) 指在相同初始状态和相同输入序列下,模拟引擎在任意设备上都产生完全一致的结果。它是回放系统和 lockstep 多人同步的前提:回放只需存储初始状态与输入指令流,播放时重新模拟即可;多人联机时各端只交换操作指令,各自本地模拟,只要结果一致就能保持同步。实现确定性模拟的难点在于消除所有非确定性来源,包括随机数生成器(需使用固定种子的伪随机算法)、浮点运算顺序、以及不同浏览器引擎对数学库函数实现的细微差异。一旦某一帧出现偏差,误差会随帧数累积,最终导致回放失步或联机双方状态分叉。
静态 HTML + WebGL 是被低估的游戏载体
Three.js(以及早期的 Phaser)是当前模型非常熟悉的平台。附带的好处是,Battle Drones 意外地成为了可离线运行的 PWA——作者没有主动要求,但在飞机上发现自己手机缓存了它,可以直接玩。
PWA(Progressive Web App) 是一类通过 Service Worker 和 Web App Manifest 增强的网页应用,能够被安装到设备主屏、在离线状态下运行,并具备接近原生应用的体验。Service Worker 充当浏览器与网络之间的可编程代理,可以拦截请求并将资源缓存到本地,使得页面在断网时仍能从缓存加载。对于游戏而言,这意味着一次访问之后即可离线游玩,无需应用商店分发,也无需服务器持续运行。结合 WebGL 的硬件加速渲染能力,纯静态 HTML 页面已经可以承载 3D 实时游戏,而部署成本几乎为零——只需托管静态文件即可。
模型能直接生成 3D 模型和音乐
Opus 5.5 在 Three.js 中构建 3D 模型的能力被作者形容为「spectacular」。同样地,项目里没有任何音频文件,配乐完全由代码生成,随地图变化,并会在战斗激烈时增强。
工具几乎是免费的
无线电探测页、模型浏览器、智能体对战调试器,以及 Claude Code 给自己造的一批工具,都是顺手提示出来的。作者说自己甚至没来得及逐一探索它们。
关于「氛围编程」的自我怀疑
作者的态度并不狂热。他明确表示不会把 Battle Drones 投给 Steam Next Fest 这类活动——同期 Hacker News 上正有一篇文章讨论玩家呼吁 Steam 增加「无 AI」筛选,因为活动里充斥着粗制滥造的作品。他认为自己的项目「努力程度还远远不够」,不足以被视为正经的独立游戏。
但他同时认为,路径已经出现了:这个游戏好玩、好看,还具备一项他认为是 RTS 首创的特性——基于声音的联机。他在文末坦承,自己仍然对以这种方式造软件感到愧疚:在一个几乎没有经验的领域里,他不觉得自己「配得上」做出这样的东西。
这种矛盾感或许比技术细节更值得记录。工具降低了产出门槛,但品味、判断和持续迭代的意愿,仍然决定最终成品能走多远。正如他自己所说:他很想看看,一个品味比他更好、又有强烈执念的人,能用这套东西做出什么。
相关推荐

AI数字分身实战:用DOT自动追踪Bug与用户反馈
DOTS 团队工程师演示如何用 AI 数字分身 DOT 跨平台收集用户反馈、自动归类问题主题、开线程调查 Bug 根因并直接提交 PR,展示 AI 代理参与缺陷分诊的完整工作流与可审计设计。

晶体管为何不再扁平?从平面到环绕栅极的演进
晶体管从平面到FinFET再到环绕栅极的演进:为何栅极需要从三面包裹到四面环绕,以抑制短沟道效应和泄漏电流,延续摩尔定律。

蜂群思维=单个RL智能体?多臂老虎机等价性证明
一篇论文证明蜂群通过局部模仿进行的集体决策,在数学上等价于单智能体强化学习。N个盲目模仿者相当于N个并行环境采样,有效学习率为1/N。本文解读Maynard-Cross Learning算法的推导与影响。