← 文章 / 编程开发
Simon Willison 3小时前 · 2026-10-24 16:42:20 · 6 阅读

Battle Drones:一款基于音频同步的实时策略游戏开发手记

战斗无人机——用氛围编程打造的音频多人实时策略游戏

2026年10月20日

我最近一个用 vibe coding 开发的游戏实验是一款名为 Battle Drones(在线游玩)的即时战略游戏(RTS),风格类似《命令与征服》。与 我之前的实验 不同,这款游戏的可玩性确实很强。我有点不好意思承认,当时我只是告诉 Claude:“让它变得有趣得多”。它甚至支持附近设备间的多人游戏,通过音频同步游戏状态!以下是我目前构建的内容以及过程中学到的一些经验。

战斗无人机

我最初的目标,是打造一款能在手机上游玩的 RTS 游戏,风格致敬 《命令与征服》。我对 1995 年的原作(以及《红色警戒》)有着美好的回忆,渴望重温那份魔力。

历经 12 个重大迭代(以及编码智能体,主要是 Claude Code,的 321 次提交),我现在已拥有一个基于浏览器、兼容移动和桌面端的游戏。它具备多种游玩模式、多张地图(含随机地图生成器),甚至支持两台设备在麦克风能彼此收听到的范围内进行多人联机。(更新:如今也支持 线上多人联机;之前的音频联机功能倒是让人头疼不已!)

下面是一段 Battle Drones 在桌面浏览器中运行的演示视频:

目前功能包括:

  • 9 种建筑、7 种地面载具、6 种空中载具、3 种步兵单位——全为 3D 模型,可在此 浏览
  • 战争迷雾
  • 需使用不同武器分别针对空中或地面载具
  • 六张地图,横跨五种地貌——温带、沙漠、极地、火山、热带
  • 随机地图生成器
  • 遭遇战模式——红蓝对抗于旋转对称的地图中
  • 坚守模式——一名玩家尽可能抵御多波敌军
  • 范围伤害武器:齐射、EMP、空降舱、天锤
  • 空投补给箱,附带额外资源
  • 与游戏事件联动的配乐——战事升级时氛围愈发激昂
  • 多种游戏内 AI 性格(均衡、速攻、空袭蜂群、爆破、制空铁甲)
  • AI 对 AI 模式,观赏这些性格间的激烈博弈
  • 歌利亚——一台巨型重踏机甲,具备激光眼、臂炮以及建立新基地的能力
  • 突变因子,用于增加额外规则或玩法变数
  • “每日行动”挑战
  • 段位与成就(勋章)
  • 智能体对智能体 模式,两个 LLM 可同台竞技 Battle Drones
  • 基于两台邻近手机通过音频消息通信的多人对战模式,是我之前 Chirp Pong 实验的延伸
  • 我是怎么做的

    Battle Drones 基本上是 vibe coding 出来的——我几乎没审查过代码,而且用的是一门我自己很少接触的语言(TypeScript)。不过我确实反复试玩了很多次,项目开始以来也经历了大量迭代。

    下面是这个项目到目前为止的大致历程,包括关键的 prompt 和对话记录链接。

    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 的图像生成 API 来生成素材,这样就有了一些基本的精灵图。

    你可以在这里试试 v1,当时是这个样子:

    游戏画面。右侧一列是用于建造 Fab、Airpad、Turret、Harv、Sting、Flak、Scout、Wasp、Raptor 的文字图标。2D 战场上有一块块的战争迷雾,地面上有一些宝石、一座正在被渲染粗糙的坦克攻击的总部建筑,还有几辆蓝色载具散布各处。视觉效果不算好,但确实像个基本的 RTS。

    它已经能看出是个 RTS 了,有建造机制、选择和指挥单位的能力,还有一个可以对战的基础 AI。

    这个第一版勉强算个概念验证,玩起来一点都不好玩。

    早期版本用的是 Phaser 2D 游戏框架,直到迭代了好几次之后我才意识到这一点!

    v2:完整的精灵图

    第二个版本(点此体验 v2)为所有载体添加了 sprite 贴图,并加入了“AI 对战 AI”模式,让我无需手动操控即可观看游戏运行。

    Claude 在提示 OpenAI 图像模型生成 sprite 方面表现尚可。你可以在 public/assets/sprites 文件夹中浏览 v2 的 sprite 资源。

    四架飞行单位、三座炮塔、一台收割机和一个空垫现在都有了合适的 sprite。废料场采用了新设计,虽然外观不太理想,但至少使用了一幅图形。

    v3:多样化地形

    游戏依然缺乏乐趣,画面也很单调。当时已是十月,我升级到了 Claude Opus 5.5,并这样指示它:

    大幅提升这款游戏的体验。优化画面和游戏性(保持对移动端友好)。使用环境变量中的 API key,调用最新的 OpenAI GPT 图像 API(请自行查询详情)渲染新图形。增加新的单位类型并更好地平衡游戏机制。此外,添加新的建筑物和更多样化、更精美的地形。

    这一指令促成了五张具有不同风格生成背景贴图的地图,详情可见此处。Opus 还重新生成了 sprite,使其视觉效果大幅提升。你可以点此体验 v3——其效果如下:

    地图变成了冰雪场景,包含雪、冰和碎冰——看起来相当不错。载具和建筑也都进行了外观升级。这开始看起来像一款真正的游戏了。

    这开始有了一款真正游戏的感觉!不过玩起来依然不太有趣——我很快便会感到厌倦。

    v4:乐趣更新

    至此,我的 Battle Drones 实验再次印证了我早先的看法:编码智能体可以构建出看似游戏的作品,但无法创造出真正引人入胜的体验。

    晚餐时我和朋友聊了聊这个想法,随后暗自思忖,应该给模型一个公平的机会来证明我错了。我掏出手机,给 Opus 5.5 输入了指令:

    这游戏还不够好玩。请让它变得非常有趣。

    这次我运行在 Ultracode 模式下,即 Claude Code(此处指 Web 版的 Claude Code)执行所谓的“动态工作流”。其官方文档将这一概念描述为:

    动态工作流是一个 JavaScript 脚本,用于同时协调多个 子代理。

    这一过程开启了长达数小时的工作。我晚上启动任务,直到次日深夜才拿到可玩的结果。不过,最终效果令人惊叹。

    你可以在这里试玩 v4 版本,界面如下:

    The lava map. Uplink satellites are being taken, crystals look better, Elite text is shown above a unit, there is an arrow marked Fight to jump to a fight, the AI vs AI mode has a speed controller - plenty of new features here.

    我让 Claude 自己撰写了更新日志,以下是亮点内容:

    每次遭遇战和每日行动现在都会提供开局选择,为落后方提供翻盘机会,并将双方部队吸引至地图中心。此外,还新增两种玩法。

    • 开局策略:在计时开始前,选择 Blitz(闪电战)、Industry(工业流)或 Air Wing(空军翼)。
    • 呼叫支援:齐射、EMP、空降舱以及天空之锤轨道打击。
    • 目标与残骸:中继卫星、补给空投以及具有回收价值的残骸。
    • 体验感:战斗特效、自适应音乐、单位语音及解说员。
    • 指挥系统:战斗警报、游戏速度调节、小队保存及触控布阵。
    • 新模式:最后防线生存模式及包含 8 个任务的行动战役。
    • 进度系统:英雄角色、含奖励的战后报告、生涯档案、7 种变异体及每日行动。

    战斗耗时更长,局势也更胶着。在 1200 场 Normal 难度的 AI 对 AI 测试对局中,超过 25 分钟仍未分出胜负的比赛占比从 14% 降到了 0.9%;曾经落后 800 以上资源的一方最终翻盘获胜的比例,则从 24% 升到了 46%。

    Claude 跑了这么久,一部分原因是它进行了上千场模拟试玩,并根据结果重新平衡了现有单位、新增了单位,还引入了新功能。

    v5:Battle Drones 迈入 3D

    Ultracode 在「让它好玩得多」这个指令上表现出色之后,我决定玩点更大的:

    把这个游戏移植到 three.js,所有建筑、载具和地形都用 3D 模型

    这又是一次通宵运行。我醒来后看到了这个 v5 版本:

    现在是 3D 了——战场略微倾斜,建筑和载具都是 3D 模型,岩石和树木看起来也有点 3D 的感觉。

    这些新的 3D 模型完全由 Claude 用 TypeScript 代码构建。

    v6(点此试玩 v6)进一步打磨了视觉效果。v7(点此试玩 v7)加入了机器人士兵(步兵、火箭小队、狙击手)和一款名为「Condor」的运兵飞行器。

    v8:群岛地图

    我开始对这个游戏实际参与的设计工作太少感到愧疚——过去几个版本里,我基本就是在说「让它更好玩」「加点视觉打磨」。

    我注意到 AI 并不常用 v7 新增的士兵和运兵飞行器——因为在战略上没什么理由用它们。

    如果我们能有一张新地图,配合新的游戏机制,主动鼓励玩家把机器人士兵装进 Condor 派往地图各处,那就很棒了。

    于是我写出了迄今最长的一条提示词:

    设计一张新地图。目标是创造不同的战略激励,鼓励玩家使用步兵、Condor 和空中载具。

    要实现这一点,地图上的采集资源有限,但设有更多上行链路——不过这些上行链路都位于无法通过地面载具或步兵抵达的岛屿上。空中载具也无法占领它们。唯一的办法是乘坐秃鹰(Condor)把步兵空运过去。

    每支军队初始都配备一架秃鹰和一个步兵小队。如果某支军队没有秃鹰,系统会免费提供一架新的,从距离其总部最近的边缘飞入并在那里降落。这架免费秃鹰会搭载一个免费的步兵小队。

    两个总部应被水域完全隔开,但地图上不同位置设有两座桥梁,确保地面车辆仍可通行。

    我希望鼓励玩家围绕上行链路展开争夺。

    地图规模应为其他地图的若干倍——仍为正方形。

    先推演并批评这一设计,达成共识确认修改后再开始建造。

    你需要为此设计一种新的生物群系。

    最终成果是热带群岛(Archipelago)地图,包含七座拥有上行链路的岛屿,玩家只能通过秃鹰空运步兵来占领。在熟悉了简单地图的基本玩法后,这张地图一定是最有趣的选择。v9 版本让地图变得更具趣味性——现在的样子如下:

    三座岛屿,每座都有一枚上行链路卫星。蓝色方占领一座,红色方占领另一座,一架蓝色秃鹰正飞向被红色战机守卫的红色岛屿,附近有一座桥梁。主题为热带岛屿,观感十分宜人。

    v10:歌利亚(Goliath)与智能体对战

    我决定为游戏加入巨型机甲——想想《环太平洋》里的 Jaegers,或战锤 40,000 里的泰坦(Titans)。

    以下是我与 Claude 进行头脑风暴时使用的一些提示词:

    帮我想想往游戏里加入巨型机甲的思路——参考战锤 20K 的无畏舰或泰坦——如何实现能提升玩法、保持平衡并带来独特亮点?先别过度纠结细节。

    继续头脑风暴。我觉得“机动基地”这个点子不错——它可以接收回收的废料,附近可以建造建筑(即使它之后移动了位置),还能生产步兵单位。能和秃鹰(Condor)互动会很有意思,但我不清楚具体怎么做。

    点子:当它受损时,会依次失去部分武器使用能力。默认配置包括眼部激光(类似 Lancer)、手臂火炮(类似 Titan)以及两具肩扛式迫击炮,再加上类似一个步兵班的机枪。

    受损后先停用迫击炮,然后是激光——机枪始终可用。你不能在仅因机甲存在而建造的旁边再建其他建筑;只有机甲在场时,才能在其周边三格范围内进行场外建筑建造。

    […] 让两只秃鹰能背负机甲。

    最终效果非常酷。

    您的浏览器不支持 HTML 视频。

    建造 Goliath 需要 Gantry——这是一种特殊建筑,只有在先建好 Fab、Bay、Airpad 和 Tech Lab 后才能解锁。你可以看到 Goliath 正在 Gantry 中建造,随后它走出龙门架,可以在地图上自由行军。

    Goliath 可以“锚定”,即深入地面。锚定状态下,它能充当新的 HQ,在新区域生产步兵单位和额外建筑。

    两架 Condor 战机可以挂载 Goliath,届时它就能在空中飞行,横穿整个地图!

    现在,只有摧毁敌方 HQ 建筑以及他们建造的所有 Goliath,游戏才会结束。

    还有一些与 Goliath 相关的变体规则:

    • Goliath Armada 开局时,双方各获得四架处于空中状态的 Goliath(每架配有两只 Condor),没有其他单位。
    • Robot Love 添加一条特殊规则:如果敌方 Goliath 在战场上相互靠近,它们就会坠入爱河,游戏以平局结束。(感谢 Natalie 提供这个创意)。

    Agent 对决

    v10 的另一个功能是Agent 对决。在思考多人模式如何实现时,我有个想法:如果让不同的 LLM 在游戏中互相博弈会怎样?

    有趣的额外挑战:想想怎么让 coding agent 也能玩多人对战。如果能安排一场比如 GPT-6 Sol 对 Claude Opus 5.5 的对决会很酷——每个模型都拥有一个工具,可以获取游戏信息(应该是非视觉的,且只包含它能通过战争迷雾等机制看到的信息),并控制自己的单位等 [...]

    查阅 ~/dev/llm/docs,并在那个文件里补充说明,如何通过一个新的 tools 插件让 LLM 参与其中

    Opus 5.5 随即动手干活,产出了这份 AGENT-BATTLES.md 提案,然后实现并测试了它。这个功能还支持录制和回放对战——这里有一场 Claude Haiku 5.5 对 GPT-6 Luna 的回放,同一场对战也可以在一个独立的调试工具中查看,里面展示了底层 prompt 的响应内容。

    截图展示了一场实时战略游戏回放,由两个 AI 模型对战。俯视视角下,雪地地图左侧是一片布满裂纹冰块的深色冰冻湖泊,上方和右下方分布着松林。顶部栏包含:暂停按钮、“6:27”、“1×”、蓝色的 “anthropic/claude-haiku-5-5 · industry”、红色的 “gpt-6-luna · industry”、标有 “B” 和 “R” 的蓝红双方兵力条,以及 “0:03”。左侧提示:“蓝方:正在向敌方东南边缘推进炮塔。”回放面板显示:“蓝方 anthropic/claude-haiku-5-5 · industry 对阵 红方 gpt-6-luna · industry · frostbite 种子 42”,时间轴滑块位于 “6:27 / 7:48”,下方按钮为 “−30s”、“+30s”、“All”、“Blue's eyes”、“Red's eyes”、“Notes”。场景画面中,几辆蓝色坦克和一台冒着黑烟的大型蓝色歌利亚机甲正向前推进,接近画面中下方的冰缘;其北侧沿冰面排列着一队红色炮塔(其中一座正在燃烧);东侧岩石山脊旁停着红色坦克和卡车;红色基地建筑占据右上角。右上角是小地图,左下角有放大、缩小和闪电按钮。

    驱动 AI 对战的提示词可以在这里查看。

    README 中还链接了更多类似回放。我计划在将来把这部分做成一个完整的联赛积分榜。

    v11:随机地图

    这个版本纯属偶然。有一天我瞥了一眼自己的Claude 用量页面,发现本周额度只用了 75%,而 45 分钟后就会重置。于是我想试试能否利用剩余的 token 再开发一个 Battle Drones 功能,并选中“随机地图”作为目标:

    设计并实现一个随机地图生成机制,可任选可用生物群落(Biome)作为基底。地图尺寸需达到最大规格,融合河流、桥梁、岩石、森林、废料堆和水晶等元素。采用旋转对称布局,并引入种子(seed)参数,支持后续按指定选择或复用。你只有 45 分钟完成这个任务!尽情发挥创意。

    这里是转录记录,以及 Claude 生成的一张示意图,展示了它的产出:

    十张俯视角游戏地图网格图,涵盖温带、沙漠、极地、火山、热带五种生物群落,每种两个。每张图均包含河流或熔岩流,以及桥梁和道路。标题为:

    v12:通过声音实现多人游戏

    这个功能才刚跑通,我还没太多时间进行主动测试。最新版本的 Battle Drones 已支持两台设备通过麦克风距离实现多人联机!

    这个功能起源于我上周的Chirp Pong 实验。我把 Claude Code 指向了那个可用的概念验证原型:

    从 GitHub 克隆 Simonw/tools,查看近期分支中那个利用 Web 麦克风通过音频信号实现双手机多人联机的 pong 游戏示例

    基于此构建一个 battledrones 的版本

    Opus 构建了这个无线电探测器(Radio Probe)工具,用于测量两台设备间的可用带宽。根据该工具测试出的积极结果,它实现了完整的音频调制解调器系统。我已在笔记本、iPhone 和 iPad 之间试用过,效果出奇地好!

    为什么用声音来做多人联机?因为我钟情于零成本的静态 HTML,不想为了一个游戏专门架设服务器,然后没完没了地维护下去。

    几点思考

    我对游戏开发几乎一无所知,这反而是个绝佳机会——可以在我已有软件工程经验影响不了结果的领域,好好检验一下编程 Agent 的能力。

    游戏项目的风险也极低,最坏的情况无非是我的某个游戏小实验出了个 bug。

    今天早上(来自 Hacker News)我看到了这篇文章:Steam 玩家呼吁增加"无 AI"过滤器,因为 Steam Next Fest 上充斥着垃圾作品。我自己是绝对不会把 Battle Drones 提交到这类活动的——它现在的完成度还太低,够不上一个正经独立游戏项目的标准。

    ……不过我现在确实能看到这类 vibe coding 游戏被认真对待的路径了。Battle Drones 好玩、好看,还有创新功能(就我所知,通过音频实现 RTS 联机还是头一回)。

    我很期待看到比我品味更好、又怀有打造真正杰作的热情的人,能用它做出什么!

    这个项目还带来一些其他观察:

    • 静态 HTML 和 JavaScript 是绝佳的游戏开发媒介。WebGL 表现出色,而 Three.js(以及更早的 Phaser)都是优秀的构建平台,当前的大模型对它们了如指掌。
    • 这也意味着游戏可以以 Progressive Web Apps 的形式运行——我并没有主动要求,但 Battle Drones 支持离线运行。我从来没安装过它,却能在飞机上玩——手机已经把它缓存下来了。
    • 给 Claude 一个 OpenAI API key,让它用 OpenAI 的模型生成图片,效果非常好。它可以查看自己生成的图片,并据此迭代调整提示词。
    • Opus 5.5 在利用 Three.js 进行 3D 建模方面表现出色(Blender 及其他 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 跑起来,但即便在同一 Wi-Fi 网络下的两台设备上也无法建立连接,于是让 Claude 帮我构建了一个简单的无状态 WebSockets 中继服务器:

    我想以极低成本支持两台设备之间的多人游戏,且不希望在服务器上存储任何状态,能否用一个运行在 Fly 最低配实例上的极简 asyncio Web 服务器来实现?

    构建这个服务器以及用于部署的 fly.toml 文件,Fly 应用名称设为 battledrones-relay - 将其放入仓库的一个文件夹中,并在该文件夹的 README 里包含部署说明

    这就是最终生成的服务器。由于它可以缩容到零,且运行在单个 Fly.io shared-cpu-1x 实例上,成本不会超过每月 2.19 美元——而这还是在它一直在线并保持连接活跃状态的前提下。

    Battle Drones 现在支持在线多人模式。点击“在线对决好友”,然后通过你常用的聊天软件分享生成的房间链接,或者让对方直接扫描显示的二维码。

    我还增加了一个功能,允许在对局结束后复制匹配数据的 JSON,随后将其输入回放功能以重赛比赛。

    我没打算这么早就上线联机对战功能,但那个让人头疼的 bug 实在逼得我不得不赶紧找个替代方案。

    原始来源: Simon Willison

    评论 (0)