Simon Willison 用 vibe coding 做出支持音频联机的即时战略游戏 Battle Drones
Battle Drones - a vibe coded RTS with audio-based multiplayer
Simon Willison 公开了浏览器即时战略游戏 Battle Drones,可在手机和桌面上游玩,两台处于麦克风距离内的设备能通过音频消息同步对战。
20th October 2026
我最新的氛围编程游戏实验是一款 Command & Conquer 风格的 RTS(即时战略)游戏,名为 Battle Drones(在此游玩)。与 我之前的实验 不同,这一款玩起来真的很有趣。我有点不好意思承认,我是靠告诉 Claude“让它有趣得多”才做到的。它还支持附近设备之间用音频同步游戏状态来进行多人游戏!以下是我目前做出的内容,以及我在这个过程中学到的一些东西。
- Battle Drones
- 我是如何做出它的
- v1:最初的原型
- v2:完整精灵图
- v3:多样地形
- v4:趣味更新
- v5:Battle Drones 走向 3D
- v8:群岛
- v10:Goliath,以及智能体对战
- 智能体对战
- v11:随机地图
- v12:通过声音进行多人游戏
- 一些想法
Battle Drones
我最初的目标是做一款能在手机上玩的、风格类似 Command & Conquer 的 RTS 游戏。我对 1995 年的原版怀有美好回忆(我也很喜欢 Red Alert),想重拾一点点那种魔力。
经过 12 次重大迭代(以及编程智能体——主要是 Claude Code——做出的 321 次提交),我现在有了一款基于浏览器的游戏,可在移动端和桌面端运行,拥有多种游戏模式、若干地图(包括一个随机地图生成器),甚至支持两台处于彼此麦克风范围内的设备进行多人游戏。
以下是 Battle Drones 在桌面浏览器中运行的视频演示:
目前的功能包括:
- 9 座建筑、7 种地面载具、6 种空中载具、3 种步兵单位——全部是 3D 模型,你可以在此浏览
- 战争迷雾
- 瞄准空中或地面载具需要不同的武器
- 六张地图,跨越五种生物群系——温带、沙漠、极地、火山、热带
- 随机地图生成器
- 遭遇战模式——在旋转对称地图上红方对阵蓝方
- 最后坚守模式——一名玩家尽可能抵挡更多波次的敌人
- 范围效果武器:Barrage、EMP、Drop Pod、Sky Hammer
- 补给箱空投,附带额外资源
- 会随事件变化的游戏内音乐——战斗打响时会变得更加激烈
- 不同的游戏内AI 个性(Balanced、Rush、Air Swarm、Boom、Skyforce、Ironclad)
- AI 对 AI模式,用来观看这些个性互相对战
- Goliath——一台会重步践踏的巨型机甲,拥有激光眼和臂炮,并能建立新基地
- 修改器,用于添加额外规则或变化
- 一项“Daily Op”挑战
- 等级与成就(勋章)
- 智能体对智能体模式,两台 LLM 可以互相对战 Battle Drones
- 一种多人模式,基于两部附近的手机通过音频消息进行通信,是我早前 Chirp Pong 实验的延伸
我是如何做出它的
Battle Drones 在很大程度上是用氛围编程完成的——我几乎没有审阅过任何代码,而且它是用一种我自己几乎没用过的语言(TypeScript)构建的。不过我已经玩测了不少,自项目启动以来也经历了大量迭代。
以下是这个项目迄今的大致历程,包括关键提示词以及对话记录的链接。
v1:最初的原型
我早在七月就开始使用 Claude Fable 5:
We are going to build a mobile friendly RTS game - command and conquer style - called Battle Drones, in which two armies of drones (both flying and ground-based) battle for territory and resources
Let's start with a MVP design, ask me some questions
这是一份共享的对话记录。我给 Claude Code for Web 设置了一个包含 OpenAI API key 的环境变量,并让它使用 OpenAI 的Image Generation API来制作素材,由此得到了一些基础精灵图。
你可以在这里试玩 v1——它看起来是这样的:

它能被认作一款即时战略游戏,具备建造机制、选择并指挥单位的能力,以及一个可供对战的基础 AI。
这第一个版本几乎只是一个概念验证,玩起来一点也不有趣。
Claude 在这些早期版本中使用了 Phaser 2D 游戏框架。直到好几轮迭代之后,我才意识到这一点!
v2:完整精灵图
第二个版本(在这里试玩 v2)为所有载具添加了精灵图,并加入了“AI 对 AI”模式,这样我就可以观看对局,而不必亲自直接操控。
事实证明,Claude 在提示 OpenAI 的图像模型生成精灵图方面相当胜任。你可以在 public/assets/sprites 文件夹中浏览 v2 的精灵图。

v3:多样地形
它仍然不怎么有趣,画面也很乏味。当时已经是十月,我已经升级到了 Claude Opus 5.5。我告诉它:
Massively improve this game. Make the graphics and gameplay better (keep it mobile friendly). Render new graphics using the latest OpenAI GPT image API (lookup details) with the API key in the environment variable. Add new unit types and balance the gameplay better. Also add new buildings and better, more varied terrain.
由此得到了五张新地图,它们带有多种风格的生成背景图块,可在这里查看。Opus 还重新生成了精灵图,使它们在视觉上更有吸引力。你可以在这里试玩 v3——它看起来是这样的:

这开始有点像一款真正的游戏了!不过玩起来仍然不太有趣——我发现自己很快就感到无聊了。
v4:趣味更新
到目前为止,我的 Battle Drones 实验正在印证我先前的看法:编程智能体可以做出一个看起来像游戏的东西,但实际上做不出真正引人入胜、让人想玩的作品。
我在晚餐时和别人分享了这个看法,随后心想,我应该给这些模型一个真正的机会来证明我是错的。我在手机上向 Opus 5.5 发出了提示:
This game isn't fun enough yet. Make it a LOT more fun.
这一次我运行的是Ultracode 模式,在该模式下 Claude Code(这里是 Claude Code for Web)会运行“动态工作流”,其文档中的描述是:
动态工作流是一段 JavaScript 脚本,可同时编排多个子智能体。
这开启了好几个小时的工作。我在晚上启动它,直到第二天上午很晚才拿到可玩的结果。但结果非常出色。
你可以在这里试玩 v4——它看起来是这样的:

我让 Claude 自己撰写发布说明——以下是要点:
现在每场遭遇战和每日行动都会以一个选择开场,给落后的一方一条翻盘之路,并把双方军队拉到地图中央。此外还有两种新的玩法。
- 开局选择:在计时开始前选择闪电战、工业或空军联队。
- 呼叫技能:弹幕、EMP、空投舱以及天锤轨道打击。
- 目标与回收:上行链路中继、补给空投以及值得拆成废料的残骸。
- 手感:战斗爽感、自适应音乐、单位语音和一位播报员。
- 指挥:战斗警报、游戏速度、已保存的小队以及触控部署。
- 新模式:最后坚守生存波次,以及一个包含 8 个任务的行动战役。
- 成长系统:英雄、带有奖项的战后报告、职业生涯、7 个变异因子以及一项每日行动。
战斗打得更久,起伏也更大。在 Normal 难度的 1,200 场 AI 对 AI 测试对局中,25 分钟后仍未分出胜负的比赛占比从 14% 降至 0.9%。曾落后 800+ scrap 的一方获胜的占比从 24% 升至 46%。
Claude 耗时这么久,部分原因是它运行了一千多次模拟试玩,并利用结果重新平衡现有单位、添加新单位,以及引入新功能。
v5:Battle Drones 进入 3D
在 Ultracode 成功完成“让它好玩得多得多”之后,我决定更有野心一些:
Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes
那又是一次通宵运行。我醒来就看到了这个 v5 版本:

新的 3D 模型完全由 Claude 用 TypeScript 代码构建。
v6(在此游玩 v6)进一步打磨了视觉效果。v7(游玩 v7)加入了机器人步兵(步兵、火箭小队、狙击手)以及一种名为“Condor”的运兵飞机。
v8:Archipelago
我开始为自己对这款游戏几乎没有实际设计投入而感到愧疚——过去几个版本,基本上就是我说“让它更好玩”和“增加视觉打磨”。
我注意到 AI 并不经常使用 v7 新增的步兵和运兵飞机——使用它们并没有很充分的战略理由。
要是能有一张带新机制的新地图,主动鼓励玩家把步兵机器人装上 Condor,再派往地图各处,那就太好了。
于是就有了我迄今最长的提示词:
Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.
To do this the map will have limited harvester resources but several more uplinks - but uplinks will be on islands that are inaccessible by land vehicles or infantry. These uplinks can also not be claimed using air vehicles. The ONLY way to get them is to fly infantry there in a Condor.
Armies always start with a Condor and a single squad. If an army has no Condor a new one will be provided for free, flying in from the edge closest to their HQ and landing there. That free condor will come with a single free squad on board.
The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places
I want to encourage a battle over uplinks.
The map should be the times the size of other maps - still square
First research and then critique this design. Only build after we have agreed on any modifications
You get to design a new biome for this
结果就是这张热带Archipelago地图,上面有七座岛屿 uplink,玩家只能乘坐 Condor 把步兵空运过去才能占领。等你通过更简单的地图掌握了基本玩法,它绝对是最好玩的一张地图。v9 版本让这张地图更有意思了一些——它现在看起来是这样:

v10:Goliath,以及智能体对战
我决定给游戏加入巨型机器人机甲——想想环太平洋里的 Jaeger,或者 Warhammer 40,000 里的 Titan。
以下是我用来和 Claude 头脑风暴的部分提示词:
Help me brainstorm ideas for adding giant robots to this game - think dreadnoughts or titans from W20K - how could we do this in a way that enhanced gameplay, kept things balanced, added unique twist? Don't overthink this yet
Let's keep brainstorming. I like the idea that it's a mobile base - that can accept harvested scrap and can have buildings built near it (even if it later moves on) and can produce infantry units too. An interaction with condor would be neat but I don't know what that could be.
Idea: as it gets damage it loses the ability to fire some weapons - by default it has eye laser (like lancers) and arm canons (like titan) and two shoulder mounted mortars, plus machine guns similar to a squad of troops
Damage knocks out mortars and then laser - it always has guns. You can't build next to a building that was only put there because of the mech, you need the mech there for off-base building and only within three squares of it
[...] Lets do two condors can carry the mech
最终效果真的很酷。
Goliath 可以用 Gantry 建造——这种建筑必须先建好 Fab、Bay、Airpad 和 Tech Lab 之后才能创建。你可以看到正在建造中的 Goliath,随后它会从 Gantry 中走出,并在地图上行进。
Goliath 可以“锚定”,从而把自己埋入地面。处于锚定状态时,它们可以充当新的 HQ,在新区域建造步兵单位和其他建筑。
两架 Condor 飞机可以钩住一台 Goliath,此时就能载着它在地图上飞行!
现在,只有当你摧毁敌方的 HQ 建筑以及他们可能建造的所有 Goliath 时,游戏才会结束。
还有几个与 Goliath 相关的 mutator:
- Goliath Armada 让双方各以四台空中 Goliath(每台配一对 Condor)开局,且没有其他单位。
- Robot Love 增加一条特殊规则:如果敌对的 Goliath 在战场上彼此靠近,它们就会坠入爱河,游戏以平局结束。(这一条要感谢 Natalie)。
智能体对战
v10 的另一项功能是智能体对战。在琢磨多人游戏可以如何实现时,我有了一个想法:如果让不同的 LLM 在游戏里一决高下呢?
Fun extra challenge: think about how we might make multiplayer available to coding agents. It would be neat if we could set up a battle between eg GPT-6 Sol and Claude Opus 5.5 where each model has access to a tool which gives them information about the game (presumably non-visual, but only the information they could see through fog of war etc) and lets them control their units etc [...]
Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin
Opus 5.5 着手处理这件事,写出了这份 AGENT-BATTLES.md 提案,然后实现并测试了它。该功能还包括录制和回放这些对战的能力——这里是Claude Haiku 5.5 对阵 GPT-6 Luna 的回放,而这是同一场对战在一个单独的调试工具中显示底层提示词响应的样子。

驱动智能体对战的提示词可以在这里看到。
还有另外几个这样的回放链接在 README 中。我希望将来某个时候能把它做成完整的联赛积分榜。
v11:随机地图
这个版本之所以存在,纯粹是因为有一天我瞥了一眼自己的Claude Usage页面,发现每周额度我只用了 75%,而且 45 分钟后就会重置。我决定看看能否用剩余的 token 再挤出一个额外的 Battle Drones 功能,并选了“随机地图”作为目标:
Design and implement a mechanism for generating a random map using any of the available biomes - it should be the size of the largest map and rivers and bridges and rocks and forest and scrap and crystals are all in play. Make them rotationally symmetric and use a seed to allow them to be selected or reused later. You have 45 minutes to build this! Be creative.
这里是对话记录,以及 Claude 生成的一张向我展示其工作成果的图片:

v12:通过声音实现多人游戏
我刚刚才让它跑起来,所以还没多少时间认真测试。最新的 Battle Drones 现在支持两台彼此处于麦克风可听距离内的设备进行多人游戏!
这个功能最初是我上周的Chirp Pong实验。我让 Claude Code 对着那个已经能用的概念验证来做:
Clone Simonw/tools from GitHub and look at recent branches for the example pong game that uses web microphone to implement multiplayer between two phones via audio signals
Build a version of that for battledrones
Opus 做了这个 Radio Probe 工具,用来测量两台设备之间能获得多少带宽,并基于由此得到的积极结果,实现了一套完整的音频调制解调系统。到目前为止,我在笔记本电脑、iPhone 和 iPad 之间试过,看起来效果非常好!
为什么要用声音来做这件事?因为我喜欢静态 HTML,运行不花一分钱,而且我不想在某处架起一台服务器,然后在任何人还可能想玩这款游戏的整个期间一直负责维持它的运行。
一些想法
我对游戏开发几乎一无所知。这让我有很好的机会,在一个我现有的软件工程经验对结果影响较小的领域里试用编程智能体。
游戏的风险也极低。最坏的情况不过是我某个傻乎乎的游戏实验出了个 bug。
今天早上(经由 Hacker News)我看到了Steam 玩家恳求提供无 AI 过滤器,因为 Steam Next Fest 里充斥着劣质内容。我个人根本不会想把 Battle Drones 提交到这样的活动——它投入的精力还远远不够,配不上被视为正经的独立游戏项目。
……但我现在能看到,像这样用氛围编程做出来的游戏被认真对待的一条路径。Battle Drones 很好玩,看起来也不错,还有创新功能(据我所知,通过音频实现多人游戏在 RTS 里还是头一回)。
我很想看看,一个品味比我更好、又怀着强烈热情要做出真正出色作品的人,能打造出什么!
关于这个项目的另外几点观察:
- 静态 HTML 和 JavaScript 是游戏开发的绝佳媒介。WebGL 表现很好,而Three.js(以及在它之前的Phaser)都是非常出色、可供构建的平台,当前的模型对它们了如指掌。
- 这也让它们能作为渐进式 Web 应用运行——我并没有要求这一点,但 Battle Drones 可以离线运行。尽管我从未直接安装过它,我还是能在飞机上玩,因为我的手机已经把它缓存了。
- 把 OpenAI API 密钥交给 Claude,并让它用 OpenAI 的模型生成图像,效果非常好。它能查看自己生成的图像,并迭代优化提示词。
- Opus 5.5 使用 Three.js(以及 Blender,无疑还有其他 3D 应用)进行 3D 建模极为出色。GPT-6 Astra 同样如此。它们完全有能力为 3D 游戏项目构建模型。
- 对于回放和多人游戏这类功能,拥有一个确定性模拟引擎会很有用。有一次,Claude 不得不将对
Math.sin()和Math.cos()及其相关函数的调用替换为自定义版本,因为不同浏览器(例如 Chrome 与 Safari)返回的数值存在极其细微的差异,导致回放不同步。 - Opus 5.5 能写音乐!这个项目里没有任何音频文件——配乐完全由代码生成,会随不同地图而变化,甚至会随着战斗升温而更加激烈。此前用 Claude 进行音乐创作的一次实验,见 Scrimshaw Jukebox。
- 我仍然惊叹于提示词“Make it a LOT more fun”的效果竟如此之好。
- 工具几乎等于免费。我用提示词做出了 Radio Probe、Model browser 和 Agent vs. Agent debug tool,而 Claude Code 还为自己做了一堆工具,其中有些我自己都还没探索过。
- 静态 HTML 游戏之间基于音频的多人联机是可行的!我希望看到更多游戏采用同样的模式——我今天四处查找,除了 Alon Horesh 的 Siner 以及 Georgi Gerganov(亦因
llama.cpp闻名)的 ggwave 之外,没找到多少先前的先例。 - Claude Code 的“Ultracode”烧 token 仿佛没有明天,但它也能凭单条提示词解决复杂问题(例如加入基于音频的多人联机)。
- 我仍然没能完全摆脱以这种方式构建软件的愧疚。在一个我先前经验如此之少的领域里,我不觉得自己有资格创造出这么好的东西!到了这一步,我已经私下向足够多的人展示过,如果不公开发布、让其他人也看到并从中学习,就会觉得不对。
来源:Simon Willison · simonwillison.net