Simon Willison 分享用编码 Agent 开发浏览器即时战略游戏的过程,经过 12 次主要迭代和 321 次 Agent 提交,逐步加入地形、随机地图与多种玩法。游戏兼容手机和桌面,并尝试通过声音同步附近设备的游戏状态。
我最近一次凭感觉编程的游戏实验,是一款名为 Battle Drones 的《命令与征服》风格 RTS(即时战略)游戏(可以在这里试玩)。和之前的实验不同,这次的游戏确实好玩了。有点不好意思承认,我只是让 Claude“让它好玩得多”,就做到了。它还支持附近的设备通过音频同步游戏状态,实现多人对战!下面介绍一下目前做出来的成果,以及我在这个过程中学到的一些东西。
v1:初始原型
v5:Battle Drones 迈入 3D
v10:Goliath 与智能体对战
v12:通过声音实现多人对战
我最初的目标,是做一款能在手机上玩的《命令与征服》风格 RTS 游戏。我对 1995 年的初代作品有着美好的回忆(我也很喜欢《红色警戒》),希望能找回一点当年的魔力。
经过 12 次大版本迭代(以及编程智能体完成的 321 次提交,主要来自 Claude Code),如今这款浏览器游戏已经可以在手机和桌面设备上运行,拥有多种玩法、多张地图(包括随机地图生成器),甚至支持两台处于彼此麦克风收音范围内的设备进行多人对战。
下面是一段 Battle Drones 在桌面浏览器中运行的演示视频:
目前的功能包括:
Battle Drones 在很大程度上是凭感觉编程的产物——我几乎没有审查过代码,而且它使用的语言 TypeScript,我自己也几乎没用过。不过,我确实花了不少时间试玩,而且从项目启动以来,它已经经历了大量迭代。
下面大致回顾一下这个项目到目前为止的发展过程,包括关键提示词和对话记录链接。
我在 7 月开始时使用的是 Claude Fable 5:
我们要构建一款适合手机游玩的 RTS 游戏,风格类似《命令与征服》,名叫 Battle Drones。两支由无人作战单位(包括飞行单位和地面单位)组成的军队,将争夺领土和资源。
先从 MVP 设计开始,问我一些问题。
这里有一份共享的对话记录。我通过环境变量给 Claude Code for Web 提供了 OpenAI API 密钥,并让它使用 OpenAI Image Generation API 制作素材,于是得到了一些基础精灵图。
你可以在这里试玩 v1——它当时是这样的:

它已经能看出是一款 RTS:有建造机制,可以选择单位并下达指令,还有一个基础 AI 作为对手。
这个初版勉强算得上概念验证,而且玩起来毫无乐趣。
Claude 在这些早期版本中使用了 Phaser 2D 游戏框架。我甚至直到好几轮迭代之后才意识到这一点!
第二个版本(可以在这里试玩 v2)为所有载具添加了精灵图,还加入了“AI 对战 AI”模式,这样我就能观看游戏自行进行,而不必亲自操作。
事实证明,Claude 相当擅长编写提示词,让 OpenAI 的图像模型生成精灵图。你可以在 public/assets/sprites 文件夹中浏览 v2 的精灵图。

它仍然不怎么好玩,画面也很乏味。这时已经到了 10 月,我已经升级到 Claude Opus 5.5。我对它说:
大幅改进这款游戏。提升画面和玩法(保持对手机友好)。使用最新的 OpenAI GPT image API(查一下具体用法),配合环境变量中的 API 密钥生成新画面。增加新的单位类型,更好地平衡玩法。还要增加新建筑,以及更好、更丰富的地形。
这次生成了 5 张新地图,使用了多种风格的背景图块,可以在这里查看。Opus 还重新生成了精灵图,让它们在视觉上更有吸引力。你可以在这里试玩 v3——它是这样的:

这开始有点真正游戏的感觉了!不过,玩起来依然不太有趣——我发现自己很快就觉得无聊了。
到目前为止,Battle Drones 这个实验似乎印证了我之前的看法:编程智能体能造出一个看起来像游戏的东西,却做不出真正让人玩得入迷的游戏。
我在一次晚餐时向别人分享了这个观点,随后又想,我应该给这些模型一个充分的机会,让它们证明我错了。我在手机上向 Opus 5.5 输入了这个提示词:
这款游戏还不够好玩。让它好玩得多。
这一次,我使用的是 Ultracode 模式。在该模式下,Claude Code(这里是 Claude Code for Web)会运行“动态工作流”,其文档中的描述是:
动态工作流是一段同时编排多个子智能体的 JavaScript 脚本。
这触发了长达数小时的工作。我在晚上启动任务,直到第二天临近中午才拿到可以玩的结果。但成果非常惊艳。
你可以在这里试玩 v4——它是这样的:

我让 Claude 自己撰写了发布说明——以下是其中的重点:
现在,每场遭遇战和每日行动都会以一次选择开局,给落后的一方提供翻盘机会,并将双方军队引向地图中央。此外,还新增了两种玩法。
- 开局策略:在计时开始前选择 Blitz(闪击)、Industry(工业)或 Air Wing(航空联队)。
- 战场支援能力:Barrage、EMP、Drop Pod,以及 Sky Hammer 轨道打击。
- 目标与回收物:上行链路中继站、补给空投,以及可以回收废料的残骸。
- 体验:更有冲击力的战斗表现、自适应音乐、单位语音和播报员。
- 指挥:战斗提醒、游戏速度调节、可保存的编队和触屏放置操作。
- 新模式:抵御一波波敌人的最后防线生存模式,以及包含 8 个任务的行动战役。
- 成长系统:英雄、带奖励的战后报告、生涯、7 种变异规则,以及每日行动。
战斗持续得更久,局势变化也更大。在普通难度的 1,200 场 AI 对战 AI 测试中,25 分钟后仍未分出胜负的对局占比从 14% 降至 0.9%。曾经落后 800 以上废料的一方,其最终获胜的比例从 24% 上升至 46%。
Claude 花了这么长时间,部分原因是它运行了一千多场模拟试玩,并根据结果重新平衡现有单位、添加新单位,以及引入新功能。
Ultracode 成功完成了“让它好玩得多”的任务之后,我决定再大胆一点:
将这款游戏移植到 three.js,为所有建筑、载具和地形制作 3D 模型。
这又是一次通宵运行的任务。醒来后,我看到了这个 v5 版本:

这些新的 3D 模型,完全是由 Claude 用 TypeScript 代码构建的。
v6(可以在这里试玩 v6)进一步打磨了视觉效果。v7(试玩 v7)加入了机器人步兵(突击兵、火箭小队、狙击手),以及一架名为“Condor”的运兵机。
我开始有些愧疚,因为自己在游戏的实际设计上投入实在太少——过去几个版本里,我确实只是不断地说“让它更好玩”和“打磨一下视觉效果”。
我注意到,AI 很少使用 v7 新增的步兵和运兵飞机——从战略上看,使用它们的理由并不充分。
如果能加入一张带有新游戏机制的地图,主动鼓励玩家把机器人步兵装上 Condor,再运往地图各处,应该会很有意思。
于是,我写下了迄今为止最长的一条提示词:
设计一张新地图。目标是创造不同的战略激励,鼓励玩家使用步兵、Condor 和空中载具。
为此,地图上的采集资源要有限,但要多放几个上行链路站。不过,这些上行链路站都位于岛屿上,地面载具和步兵无法直接抵达。空中载具也不能占领它们。唯一的办法是用 Condor 把步兵运过去。
每支军队开局都配备一架 Condor 和一个步兵小队。如果一支军队没有 Condor,就免费补给一架,从距离其总部最近的地图边缘飞入,并降落在总部。免费补给的 Condor 上还会搭载一个免费的步兵小队。
双方总部之间应当完全被水域隔开,但载具仍然可以通过地图上位于不同位置的两座桥梁抵达对方。
我想鼓励玩家围绕上行链路站展开争夺。
地图的尺寸应该是其他地图的几倍——仍然保持正方形。
先研究,再评估这个设计。只有在我们就修改方案达成一致后,才开始构建。
这次可以由你设计一种新的生物群系。
最终诞生的是热带 Archipelago 地图,包含七座岛屿上的上行链路站,玩家只能用 Condor 运送步兵前去占领。在较简单的地图上掌握基本游戏机制后,这绝对是最好玩的一张地图。v9 又让这张地图变得更有意思了——它现在是这样的:

我决定在游戏中加入巨型机甲——可以想象一下《环太平洋》中的 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 中还链接了几场类似的回放。我希望将来能把它发展成一个完整的联赛积分榜。
这个版本之所以会出现,纯粹是因为某天我瞥了一眼 Claude Usage 页面,发现自己只用了每周额度的 75%,而且还有 45 分钟额度就要重置了。我决定看看能不能用剩下的 token 给 Battle Drones 再加一个功能,于是选定了“随机地图”这个目标:
设计并实现一种随机地图生成机制,可以使用任意现有的生物群系——尺寸要和最大的地图一样,河流、桥梁、岩石、森林、废料和水晶都可以用上。地图要旋转对称,并使用种子,以便以后选择或复用。你有 45 分钟来完成!发挥创意。
这里是对话记录,以及 Claude 为我生成的一张展示成果的图片:

我才刚把这个功能跑通,还没来得及花太多时间实际测试。最新的 Battle Drones 现在支持通过两台彼此处于麦克风收音范围内的设备进行多人游戏!
这个功能源自我上周做的 Chirp Pong 实验。我让 Claude Code 去参考那个已经跑通的概念验证:
从 GitHub 克隆 Simonw/tools,查看最近的分支,找到那个使用网页麦克风、通过音频信号实现两部手机之间多人对战的 Pong 游戏示例。
为 battledrones 构建一个对应的版本。
Opus 构建了这个 Radio Probe 工具,用来测量两台设备之间能达到多大的带宽。测试结果不错,于是它又实现了一套完整的音频调制解调器系统。到目前为止,我已经在笔记本电脑、iPhone 和 iPad 之间试过,效果似乎非常好!
为什么要用声音来实现?因为我喜欢运行起来不花钱的静态 HTML,也不想在某个地方启动一台服务器,然后只要还有人想玩这款游戏,就得一直负责维持它的运行。
我对游戏开发几乎一无所知。这恰好是一个尝试编程智能体的好机会:在这个领域,我已有的软件工程经验对结果的影响没那么大。
而且,做游戏的风险极低。最坏的情况,也不过是我某个胡闹的游戏实验出了个 bug。
今天早上,我通过 Hacker News 看到了一篇文章:《Steam Next Fest 充斥着 AI 垃圾内容,玩家恳求 Steam 推出“无 AI”筛选器》。我个人绝不会考虑把 Battle Drones 提交到这样的活动中——我在它身上投入的心力还远远不够,无法把它当作一个正经的独立游戏项目。
……但我现在能看到,像这样靠凭感觉编程做出来的游戏,有朝一日也能得到认真对待。Battle Drones 很好玩,画面不错,还有创新功能(据我所知,通过音频实现多人联机,在 RTS 游戏中还是头一回)。
我很想看看,一个比我更有品位、又满怀热情、一心想做出真正出色作品的人,能打造出什么!
关于这个项目,还有一些观察:
静态 HTML 和 JavaScript 是开发游戏的绝佳载体。WebGL 表现出色,Three.js(以及此前用过的 Phaser)都是很棒的开发平台,而当前的模型对它们都了如指掌。
这也让游戏能够以渐进式 Web 应用(PWA)的形式运行——虽然我没提这个要求,但 Battle Drones 支持离线运行。我在飞机上也能玩,尽管从来没有专门安装过它——我的手机已经把它缓存下来了。
给 Claude 一个 OpenAI API 密钥,再让它使用 OpenAI 的模型生成图片,效果非常好。它可以查看自己生成的图片,并不断调整提示词。
Opus 5.5 用 Three.js 做 3D 建模的能力非常出色(用 Blender 也是如此,想必用其他 3D 应用也不在话下)。GPT-6 Astra 也是一样。它们完全有能力为 3D 游戏项目创建模型。
对于回放和多人联机这类功能,拥有一个确定性模拟引擎很有帮助。有一次,Claude 不得不用自定义实现替换对 Math.sin()、Math.cos() 等函数的调用,因为不同浏览器(例如 Chrome 和 Safari)返回的数值有极其细微的差异,导致回放失去同步。
Opus 5.5 会作曲!这个项目里没有任何音频文件——配乐完全由代码生成,不同地图的配乐各不相同,甚至还会随着战况升温而变得更加激烈。我之前还做过一个用 Claude 作曲的实验,叫 Scrimshaw Jukebox。
“让它好玩得多得多”这句提示词的效果好得让我至今难以置信。
工具几乎是免费的。我用提示词让它做出了 Radio Probe、模型浏览器、智能体对战调试工具;Claude Code 还给自己构建了一堆工具,连我自己都还没来得及探索。
静态 HTML 游戏之间,真的可以通过音频实现多人联机!我希望看到更多游戏采用同样的模式——今天查找了一番,除了 Alon Horesh 的 Siner 和 Georgi Gerganov 的 ggwave(他也因 llama.cpp 而闻名),我没找到多少先例。
Claude Code 的“Ultracode”消耗 token 简直毫无节制,但它也能仅凭一条提示词就解决复杂问题,比如加入基于音频的多人联机功能。
对于用这种方式构建软件,我仍然有些内疚。在一个自己几乎没有经验的领域里,做出这么好的东西,我总觉得自己还不配!不过,到现在我已经私下给足够多的人看过了,再不公开让其他人看看、从中学点东西,反而让我觉得不妥。
你好 Python 3.15,再见 3.10,现在我终于可以用 3.11 了——2026 年 10 月 12 日
用语音为我的博客开发一个新功能——2026 年 10 月 9 日
Claude Haiku 5.5——2026 年 10 月 7 日
我们几乎需要为所有东西默认设置不可突破的预算上限——2026 年 10 月 3 日
本文为 Simon Willison 撰写的《Battle Drones——一款通过凭感觉编程开发、支持音频多人联机的 RTS 游戏》,发表于 2026 年 10 月 20 日。
本文属于“我如何使用 LLM 和 ChatGPT”系列
凭感觉编程开发 SwiftUI 应用,乐趣十足——2026 年 3 月 27 日晚上 8:59
使用 Claude Code 将 Moebius 0.2B 图像修复模型移植到浏览器中运行——2026 年 6 月 22 日晚上 11:43
用语音为我的博客开发一个新功能——2026 年 10 月 9 日中午 12:54
Battle Drones——一款通过凭感觉编程开发、支持音频多人联机的 RTS 游戏——2026 年 10 月 20 日晚上 7:34
上一篇:你好 Python 3.15,再见 3.10,现在我终于可以用 3.11 了
每月赞助我 10 美元,即可收到一封精心整理的邮件摘要,了解当月最重要的 LLM 进展。
付费支持我,让我给你发得更少!