Simon Willison 用 Claude Code 做出音频联机的 RTS 游戏 Battle Drones
Battle Drones—a vibe coded RTS with audio-based multiplayer
Simon Willison 发布用 Claude Code 全程 vibe coding 开发的即时战略游戏 Battle Drones,经过 12 个大版本、321 次提交,可在手机和桌面浏览器运行。游戏包含 9 种建筑、7 种地面载具、6 种空中载具和 3 种步兵单位,支持战争迷雾、随机地图生成、AI 对战 AI 以及两个 LLM 互相对战的 Agent 对战模式。他还实现了两台设备通过麦克风音频同步游戏状态的联机方式,并因音频引发头痛问题补充了基于 WebSockets 中继服务器的在线联机。
正文 · AI 翻译
#smallhead
Battle Drones——一款通过音频实现多人联机的 vibe coding 即时战略游戏
2026年10月20日
我最新的 vibe coding 游戏实验是一款《命令与征服》风格的即时战略(RTS)游戏,名为 Battle Drones(可在此游玩)。与我之前的实验不同,这一款玩起来确实有趣。我有点不好意思承认,我是靠告诉 Claude“让它有趣得多”才做到这一点的。它还支持附近设备之间通过音频同步游戏状态来实现多人联机!以下是我目前构建的内容,以及一路走来学到的一些东西。
v10:Goliath,以及智能体对战
更新:在线多人联机支持
Battle Drones
我最初的目标是打造一款能在手机上玩的《命令与征服》风格 RTS 游戏。我对 1995 年的原版有着美好的回忆(我也喜欢《红色警戒》),想重新找回一点那种魔力。
经过 12 个大版本迭代(以及编码智能体提交的 321 次提交,主要是 Claude Code),我现在有了一款可在移动端和桌面端运行的浏览器游戏,它拥有多种游玩模式、数张地图(包括随机地图生成器),甚至支持两台处于彼此麦克风范围内的设备进行多人联机。
以下是 Battle Drones 在桌面浏览器中运行的视频演示:
目前的功能包括:
9 种建筑、7 种地面载具、6 种空中载具、3 种步兵单位——全部为 3D 模型,可在此浏览
战争迷雾
需要不同的武器才能攻击空中或地面载具
六张地图,横跨五种生物群系——温带、沙漠、极地、火山、热带
随机地图生成器
遭遇战模式——红方对蓝方,地图呈旋转对称
背水一战模式——一名玩家抵御尽可能多的敌人波次
空投补给箱,提供额外资源
随事件变化的游戏内音乐——战斗爆发时音乐会变得更加激烈
AI 对 AI 模式,可以观看那些个性鲜明的 AI 互相对战
Goliath——一台巨大的重踏机甲,拥有激光眼和臂炮,并能建立新基地
添加额外规则或变化的变异器
“每日行动”挑战
等级与成就(勋章)
智能体对智能体模式,两个 LLM 可以互相对战 Battle Drones
基于两台邻近手机通过音频消息通信的多人联机模式,这是我早先 Chirp Pong 实验的延伸
我是如何构建它的
Battle Drones 高度依赖 vibe coding——我几乎没有审查过任何代码,而且它是用一种我自己很少使用的语言(TypeScript)构建的。不过我进行了相当多的试玩测试,自项目开始以来它经历了大量迭代。
以下是该项目迄今为止的大致历程,包括关键提示词和对话记录链接。
v1:最初的雏形
我在七月从 Claude Fable 5 开始:
我们要构建一款移动端友好的 RTS 游戏——命令与征服风格——名为 Battle Drones,其中两支无人机军队(包括飞行和地面单位)为领土和资源而战
让我们从 MVP 设计开始,问我一些问题
这是一份共享对话记录。我给 Claude Code for Web 设置了一个包含 OpenAI API 密钥的环境变量,并让它使用 OpenAI 图像生成 API 来制作素材,这让我得到了一些基础精灵图。
你可以在此试用 v1——它看起来是这样的:
它一眼就能看出是 RTS,具备建造机制、选择和指挥单位的能力,以及一个可供对战的基础 AI。
这第一个版本勉强算是个概念验证,玩起来一点也不有趣。
Claude 在这些早期版本中使用了 Phaser 2D 游戏框架。我直到好几轮迭代之后才意识到这一点!
v2:完整精灵图
第二个版本(在此试用 v2)为所有载具添加了精灵图,并加入了“AI 对 AI”模式,这样我就能观看游戏自动进行,而无需自己直接操控。
Claude 在提示 OpenAI 的图像模型生成精灵图方面表现得相当称职。你可以在 public/assets/sprites 文件夹中浏览 v2 的精灵图。
v3:多样化的地形
它仍然不怎么好玩,画面也很无聊。当时已经是十月,我已经升级到了 Claude Opus 5.5。我告诉它:
大幅改进这款游戏。让画面和玩法更好(保持移动端友好)。使用最新的 OpenAI GPT 图像 API(查询详情)渲染新图形,API 密钥放在环境变量中。添加新的单位类型,并更好地平衡玩法。还要添加新建筑以及更好、更多样化的地形。
这带来了五张新地图,配有各种风格的生成背景图块,可在此查看。Opus 还重新生成了精灵图,使它们在视觉上更具吸引力。你可以在此试用 v3——它看起来是这样的:
这开始感觉像一款真正的游戏了!不过玩起来仍然不太有趣——我发现自己很快就感到无聊了。
v4:趣味更新
到目前为止,我的 Battle Drones 实验证实了我先前的看法:编程智能体可以做出一个看起来像游戏的东西,但实际上无法做出真正引人入胜、让人想玩的游戏。
我在晚餐时和某人分享了这个理论,然后心想,我应该给这些模型一个真正的机会来证明我错了。我在手机上向 Opus 5.5 输入了提示词:
这个游戏还不够好玩。让它好玩得多。
这一次我运行在 Ultracode 模式下,Claude Code(这里是 Claude Code for Web)在该模式下运行“动态工作流”,其文档中的描述是:
动态工作流是一个 JavaScript 脚本,可以同时编排许多子智能体。
这启动了长达数小时的工作。我在晚上启动它,直到第二天凌晨才得到一个可玩的结果。但结果非常惊艳。
你可以在此试用 v4——它看起来是这样的:
我让 Claude 写了自己的发布说明——以下是亮点:
现在每场遭遇战和每日行动都以一次选择开局,给落后的一方一条翻盘之路,并把军队拉向地图中央。此外还有两种新的游玩方式。
开局选择:在计时开始前选择闪击、工业或空军。
呼叫能力:弹幕、EMP、空投舱和天锤轨道打击。
目标与回收:上行链路中继、补给空投和值得回收的残骸。
手感:战斗打击感、自适应音乐、单位语音和播报员。
指挥:战斗警报、游戏速度、保存小队和触屏放置。
新模式:最后防线生存波次和 8 个任务的行动战役。
进度:英雄、带奖励的战后报告、职业生涯、7 个变异器和每日行动。
战斗持续时间更长,局势波动也更大。在 Normal 难度下的 1,200 场 AI 对 AI 测试对局中,25 分钟后仍未分出胜负的对局比例从 14% 降至 0.9%。曾落后 800+ 废料的一方最终获胜的比例从 24% 升至 46%。
Claude 耗时如此之久的部分原因在于,它运行了一千多次模拟试玩会话,并利用这些结果重新平衡现有单位、添加新单位并引入新功能。
v5:Battle Drones 走向 3D
在 Ultracode 于“让它好玩得多”这一任务中取得成功后,我决定更加大胆:
将这款游戏移植到 three.js,为所有建筑、载具和地形使用 3D 模型
这又是一次通宵运行。我醒来时看到了这个 v5 版本:
新的 3D 模型完全由 Claude 用 TypeScript 代码构建。
v6(在此游玩 v6)增加了一些视觉打磨。v7(游玩 v7)增加了机器人步兵(步兵、火箭小队、狙击手)以及一架“Condor”运兵飞机。
v8:群岛
我开始感到愧疚,因为我对游戏的实际设计投入太少了——过去几个版本确实只是我在说“让它更好玩”和“增加视觉打磨”。
我注意到 AI 并不经常使用 v7 中新增的步兵和运兵飞机——并没有很好的战略理由去使用它们。
如果我们有一张新地图和一种新的游戏机制,能主动鼓励玩家用步兵机器人装载 Condor 并将它们派往地图各处,那就太好了。
这促成了我迄今为止最长的提示词:
设计一张新地图。目标是创造不同的战略激励,鼓励使用步兵、Condor 和空中载具。
为此,地图上的收割机资源将很有限,但会有更多上行链路——不过上行链路将位于陆地载具或步兵无法到达的岛屿上。这些上行链路也无法用空中载具占领。获得它们的唯一方式是用 Condor 将步兵空运过去。
军队始终以一架 Condor 和一个小队开局。如果一支军队没有 Condor,将免费获得一架新的,从最靠近其总部的边缘飞入并降落在那裡。这架免费 Condor 将搭载一个免费小队。
两个总部应完全被水域隔开,但仍可通过地图上不同位置的两座桥梁供载具通行
我想鼓励围绕上行链路展开争夺。
地图尺寸应是其他地图的几倍——仍为正方形
先研究,然后批判这个设计。只有在我们就任何修改达成一致后才开始构建
你可以为此设计一个新的生物群系
结果就是热带群岛地图,有七个岛屿上行链路,玩家只能通过用 Condor 空运步兵来占领。一旦你掌握了较简单地图中的基本游戏机制,这绝对是最有趣的地图。v9 版本让这张地图更有趣了一些——它现在看起来是这样的:
v10:Goliath 与智能体对战
我决定在游戏中加入巨型机器人机甲——想想《环太平洋》中的 Jaeger,或《战锤 40,000》中的 Titan。
以下是我用来与 Claude 头脑风暴的一些提示词:
帮我头脑风暴为这款游戏加入巨型机器人的想法——想想 W20K 中的无畏机甲或泰坦——我们怎样才能以一种增强玩法、保持平衡、增加独特变化的方式来做到这一点?现在先不要想太多
我们继续头脑风暴吧。我喜欢这个想法:它是一个移动基地——可以接收采集来的废料,可以在它附近建造建筑(即使它之后会移动走),还能生产步兵单位。与 Condor 的某种互动会很棒,但我不知道那会是什么。
想法:当它受到伤害时,会失去发射某些武器的能力——默认情况下它有眼部激光(像 Lancer 那样)和手臂加农炮(像 Titan 那样),还有两门肩部迫击炮,外加类似一队士兵的机枪
伤害会先打掉迫击炮,然后是激光——它始终保留机枪。你不能在仅仅因为机甲才建在那里的建筑旁边建造,你需要机甲在场才能进行基地外建造,而且只能在其三格范围内
[…] 我们让两架 Condor 来运载机甲吧
最终结果真的很酷。
Goliath 可以通过 Gantry(龙门架)建造——这是一种只有在先建造了 Fab、Bay、Airpad 和 Tech Lab 之后才能创建的建筑物。你可以看到 Goliath 正在建造中,然后它会从 Gantry 中走出来,并在地图上四处行进。
Goliath 可以“锚定”,也就是把自己固定在地面上。在锚定状态下,它们可以充当新的总部,在新区域建造步兵单位和额外建筑。
两架 Condor 飞机可以钩住一架 Goliath,此时它就可以被空运到地图各处!
现在,游戏会在你摧毁敌方总部建筑以及他们可能建造的任何 Goliath 时结束。
还有几个与 Goliath 相关的变异器:
Goliath Armada 让双方开局时各有四架空中 Goliath(每架配一对 Condor),且没有其他单位。
Robot Love 增加了一条特殊规则:如果敌方的 Goliath 在战场上彼此靠近,它们就会坠入爱河,游戏以平局结束。(这要感谢 Natalie)。
智能体对战
v10 的另一个功能是智能体对战。在思考多人游戏可以如何运作时,我有了一个想法:如果不同的 LLM 能在游戏中一决高下会怎样?
有趣的额外挑战:想一想我们如何让多人游戏对编程智能体可用。如果我们能安排一场例如 GPT-6 Sol 与 Claude Opus 5.5 之间的对战,那就太棒了,每个模型都可以访问一个工具,该工具为它们提供游戏信息(大概是非可视化的,但仅限于它们能通过战争迷雾等看到的信息),并让它们控制自己的单位等 […]
查阅 ~/dev/llm/docs,并在该文件中加入关于如何通过新的工具插件在此处使用 LLM 的说明
Opus 5.5 着手处理这件事,产出了这份 AGENT-BATTLES.md 提案,然后实现并测试了它。该功能还包括录制和回放这些对战的能力——这里是 Claude Haiku 5.5 对阵 GPT-6 Luna 的回放,这里是同一场对战在一个单独的调试工具中的回放,该工具展示了底层的提示词响应。
驱动智能体对战的提示词可以在这里看到。
README 中还链接了更多类似的回放。我希望将来某个时候能把它变成一个完整的联赛积分榜。
v11:随机地图
这个版本纯粹是因为有一天我瞥了一眼我的 Claude 使用量页面,发现我只用了每周额度的 75%,而它将在 45 分钟后重置。我决定看看能否用剩余的 token 额外做出一个 Battle Drones 功能,并选择了“随机地图”作为目标:
设计并实现一个机制,使用任意可用的生物群系生成随机地图——它应当达到最大地图的尺寸,河流、桥梁、岩石、森林、废料和水晶都要参与其中。让它们具有旋转对称性,并使用种子,以便之后可以选中或复用它们。你有 45 分钟来构建这个!发挥创意。
以下是文字记录,以及 Claude 生成的一张用来向我展示其工作成果的图片:
v12:通过声音实现多人游戏
我刚刚才让它跑通,所以还没有太多时间主动测试它。最新的 Battle Drones 现在支持多人游戏了,只需两台设备彼此处于麦克风可拾音的距离内即可!
这个功能最初源于我上周的 Chirp Pong 实验。我把 Claude Code 指向那个可用的概念验证:
从 GitHub 克隆 Simonw/tools,并查看最近的分支,找到那个使用网页麦克风通过音频信号在两部手机之间实现多人游戏的示例乒乓球游戏
为 battledrones 构建一个该游戏的版本
Opus 构建了这个 Radio Probe 工具,用来测量两台设备之间能获得多少带宽;基于该工具取得的积极结果,它实现了一套完整的音频调制解调器系统。到目前为止,我已经在笔记本电脑、iPhone 和 iPad 之间试过它,效果似乎非常好!
为什么用声音来实现这个?因为我喜欢零运行成本的静态 HTML,而且我不想在某处启动一台服务器,然后还要在任何人可能想玩这个游戏的整个期间一直负责让它保持运行。
一些想法
我对游戏开发几乎一无所知。这使它成为一个绝佳机会,可以在我现有软件工程经验对结果影响较小的领域里试用编程智能体。
游戏的风险也极低。最坏的情况也不过是我的某个傻乎乎的游戏实验出了个 bug。
今天早上(通过 Hacker News)我看到了《Steam 玩家恳求推出无 AI 过滤器,因为 Steam Next Fest 充斥着粗制滥造之作》。我个人做梦都不会把 Battle Drones 提交到这样的活动中——它仍然太过粗糙,不足以被视为一个正经的独立游戏项目。
……但我现在能看到,像这样由 vibe coding 生成的游戏被认真对待的一条路径。Battle Drones 很好玩,画面不错,还有创新功能(据我所知,这种通过音频实现多人游戏的方式在 RTS 中尚属首次)。
我很想看看一个比我更有品味、并且有强烈热情去打造真正卓越作品的人能构建出什么!
关于这个项目,还有几点其他观察:
静态 HTML 和 JavaScript 是游戏开发的绝佳媒介。WebGL 运行良好,而 Three.js(以及之前的 Phaser)是极佳的基础平台,当前的模型对它们了如指掌。
这也让它们能作为渐进式 Web 应用运行——我并没有要求这一点,但 Battle Drones 可以离线工作。我能在飞机上玩它,尽管从未直接安装过——我的手机缓存了它。
给 Claude 一个 OpenAI API 密钥,并让它使用 OpenAI 的模型生成图像,效果非常好。它能查看自己生成的图像,并据此迭代提示词。
Opus 5.5 在使用 Three.js(以及 Blender,无疑还有其他 3D 应用)进行 3D 建模方面表现出色。GPT-6 Astra 也是如此。它们完全有能力为 3D 游戏项目构建模型。
对于回放和多人游戏这类功能来说,拥有一个确定性的模拟引擎很有用。有一次,Claude 不得不把对 Math.sin()、Math.cos() 等函数的调用替换为自定义版本,因为不同浏览器(例如 Chrome 与 Safari)返回的数值略有差异,导致回放不同步。
Opus 5.5 能创作音乐!这个项目里没有任何音频文件——配乐完全由代码生成,会随不同地图而变化,甚至会随着战斗升温而变得更加激烈。参见 Scrimshaw Jukebox,那是此前用 Claude 进行音乐创作的一次实验。
我至今仍对“让它有趣得多”这条提示词的效果之好感到难以置信。
工具基本上是免费的。我提示它做出了 Radio Probe、模型浏览器、Agent vs. Agent 调试工具,而 Claude Code 还为自己构建了一堆连我自己都还没探索过的工具。
静态 HTML 游戏之间基于音频的多人联机是可行的!我希望看到更多游戏采用同样的模式——今天我四处查证了一番,除了 Alon Horesh 的 Siner 和 Georgi Gerganov(也是 llama.cpp 的作者)的 ggwave 之外,并没有找到多少先例。
Claude Code 的“Ultracode”模式消耗 token 如流水,但它也能仅凭一条提示词就解决复杂问题(比如加入基于音频的多人联机)。
我仍然没能完全摆脱以这种方式构建软件的愧疚感。我觉得自己并没有资格在一个我几乎没有相关经验的领域里创造出这么好的东西!到了这个阶段,我已经私下把它展示给了足够多的人,以至于不把它发布出来让其他人看到并从中学习,反而让我觉得不对劲。
更新:在线多人联机支持
在本文前面我说过:
游戏的风险也极低。最坏的情况也不过是我的某个傻乎乎的游戏实验出了个 bug。
然后我试着和 Natalie 一起玩多人版本……结果那尖锐的调制解调器音效让她头痛得厉害!
这是个相当严重的 bug。我加了一条警告,随后受到启发,决定构建真正的网络多人联机。我尝试让 WebRTC 跑起来,但即便是在我自己的 WiFi 网络上,也无法在我自己的两台设备之间建立连接,于是我让 Claude 改为构建一个简单、无状态的 WebSockets 中继服务器:
如果我想以极低的成本支持两台设备之间的多人联机,且不在服务器上存储任何状态,我能否用一个运行在最便宜的 Fly 实例上的小型 asyncio Web 服务器来实现?
构建服务器以及用于部署它的 fly.toml,使用 Fly 应用名 battledrones-relay——把它放在仓库中的一个文件夹里,并在该文件夹的 README 中包含部署说明
下面是最终得到的服务器。由于它可以缩容到零,并且运行在单个 Fly.io shared-cpu-1x 实例上,它每月最多应该只花我 2.19 美元——而且这还是假设它一直保持热运行并全程处理连接的情况下。
Battle Drones 现已支持在线多人联机。点击“Duel a friend online”(与好友在线对战),然后通过你常用的消息应用分享生成的房间 URL,或者让对方拍下显示的二维码。
我还添加了一个功能:比赛结束后,你可以复制比赛的 JSON,然后将其输入回放功能,重看你的对局。
我没想到会这么快就引入在线多人联机,但那个让人头痛的 bug 让我觉得有必要紧急提供一个替代方案。
更多近期文章
你好 Python 3.15,再见 3.10,现在我可以使用 3.11 - 2026年10月12日
我的博客新功能,用我的声音构建 - 2026年10月9日
Claude Haiku 5.5 - 2026年10月7日
我们几乎需要对所有东西设置默认的硬性预算上限 - 2026年10月3日
这就是 Battle Drones——一款由 Simon Willison 用 vibe coding 开发的、支持基于音频的多人联机的即时战略游戏,发布于 2026年10月20日。
系列文章:我如何使用 LLM 和 ChatGPT
用 vibe coding 开发 SwiftUI 应用非常有趣 - 2026年3月27日,晚上8:59
将 Moebius 0.2B 图像修复模型移植到浏览器中,用 Claude Code 运行 - 2026年6月22日,晚上11:43
我的博客新功能,用我的声音构建 - 2026年10月9日,下午12:54
Battle Drones——一款用 vibe coding 开发的、支持基于音频的多人联机的即时战略游戏 - 2026年10月20日,晚上7:34
上一篇:你好 Python 3.15,再见 3.10,现在我可以使用 3.11
每月简报