2026年10月20日
我最新的氛围编码游戏实验是一款命令与征服风格的RTS(实时战略)游戏,名为Battle Drones(在此游玩)。与我之前的实验不同,这款游戏实际上很好玩。我有点不好意思承认,我是通过告诉Claude“让它有趣得多”才做到的。它还支持附近设备之间使用音频同步游戏状态的多人模式!以下是我目前构建的内容,以及我在此过程中学到的一些东西。
Battle Drones
我是如何构建这个的
v1:初始原型
v2:完整精灵
v3:多样地形
v4:有趣更新
v5:Battle Drones进入3D
v8:群岛
v10:Goliath与代理对战
代理对战
v11:随机地图
v12:通过声音实现的多人模式
一些想法
更新:在线多人支持
Battle Drones
我最初的目标是构建一款可以在手机上玩的RTS游戏,风格类似命令与征服。我对1995年的原作有着美好回忆(我也喜欢红色警戒),想重温一点那份魔力。
经过12次主要迭代(以及由编码代理主要是Claude Code完成的321次提交)后,我现在有了一款基于浏览器的游戏,可在移动端和桌面端运行,拥有多种游戏模式、多张地图(包括随机地图生成器),甚至支持两台设备在麦克风范围内进行多人游戏。(更新:也支持在线多人;音频多人模式带来了不少麻烦!)
以下是Battle Drones在桌面浏览器中运行的视频演示:
目前的功能包括:
9座建筑、7种地面载具、6种空中载具、3种步兵单位——全部为3D模型,可在此浏览
战争迷雾
需要不同武器来瞄准空中或地面载具
六张地图,覆盖五种生物群系——温带、沙漠、北极、火山、热带
随机地图生成器
遭遇战模式——红方对蓝方,地图旋转对称
最后坚守模式——一名玩家尽可能抵御多波敌人
范围效果武器:弹幕、EMP、空投舱、天空之锤
带有额外资源的补给箱空投
响应事件的游戏内音乐——战斗爆发时会变得更加激烈
不同的游戏内AI人格(平衡、Rush、空中蜂群、Boom、空中力量、铁甲)
AI对AI模式,观看这些人格相互对战
Goliath——一种巨大的重踏机甲,拥有激光眼和臂炮,并能建立新基地
添加额外规则或转折的突变因子
“每日行动”挑战
军衔与成就(勋章)
代理对代理模式,两个LLM可以互相游玩Battle Drones
一种基于两部附近手机通过音频消息通信的多人模式,是我早期Chirp Pong实验的扩展
我是如何构建这个的
Battle Drones高度依赖氛围编码——我几乎没有审查过任何代码,而且它是用我自己几乎没用过的语言(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 个突变器和每日行动。
战斗时间更长且更有波折。在普通难度下的 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)添加了机器人步兵(士兵、火箭小队、狙击手)和一架“秃鹰”运兵飞机。
v8:群岛
我开始对自己在游戏中实际设计输入如此之少感到内疚——过去几次发布真的只是我说“让它更有趣”和“增加视觉打磨”。
我注意到AI很少使用v7中新增的步兵和运兵飞机——并没有很好的战略理由去使用它们。
如果有一张新地图,带有一种新的游戏机制,积极鼓励玩家把步兵机器人装上秃鹰(Condor)然后派往地图各处,那就太棒了。
这导致了我迄今最长的提示:
设计一张新地图。目标是创造不同的战略激励,鼓励使用步兵、秃鹰以及空中载具。
为此,地图将只有有限的收割机资源,但有更多上行链路——这些上行链路位于陆地载具或步兵无法到达的岛屿上。这些上行链路也无法用空中载具占领。获取它们的唯一方式是用秃鹰把步兵空运过去。
军队总是以一架秃鹰和一个小队开局。如果某支军队没有秃鹰,系统会免费提供一架新的,从距离其总部最近的地图边缘飞入并降落在那里。这架免费秃鹰会携带一个免费小队。
两个总部应被水域完全隔开,但仍可通过地图上不同位置的两座桥梁供载具通行。
我想鼓励围绕上行链路展开争夺。
地图应为其他地图的数倍大小——仍保持正方形。
先研究然后批评这个设计。只有在我们就任何修改达成一致后才开始构建。
你可以为此设计一个新的生物群系。
最终成果是热带群岛地图,有七个岛屿上行链路,玩家只能通过用秃鹰空运步兵才能占领。一旦你掌握了更简单地图中的基本游戏机制,这绝对是最好玩的地图。v9版本让这张地图变得更有趣——现在它看起来是这样的:
v10:歌利亚与智能体战斗
我决定在游戏中加入巨型机器人机甲——可以想象《环太平洋》中的机甲猎人,或《战锤40,000》中的泰坦。
以下是我用来与Claude一起头脑风暴的一些提示:
帮我头脑风暴一下如何把巨型机器人加入这个游戏——可以参考战锤40K中的无畏或泰坦——怎样做才能增强游戏性、保持平衡、并加入独特的变化?现在先别想太多
我们继续头脑风暴。我喜欢它作为移动基地的想法——可以接收收割的废料,可以在其附近建造建筑(即使它之后会移动),并且也能生产步兵单位。与秃鹰的互动会很有趣,但我还不知道可以是什么。
想法:随着受到伤害,它会失去部分武器的射击能力——默认拥有眼部激光(类似枪骑兵)和臂部加农炮(类似泰坦),以及两门肩部迫击炮,外加类似于一小队部队的机枪。
伤害会先摧毁迫击炮,然后是激光——它始终保留机枪。你不能在仅因机甲而存在的建筑旁边建造,你需要机甲在场才能进行基地外建造,并且只能在距离它三个方格以内。
[...] 就让两架秃鹰可以运载机甲吧
最终结果非常酷。
您的浏览器不支持HTML视频。
歌利亚可以通过龙门架建造——这种建筑只有在先建造了制造厂、机库、停机坪和技术实验室之后才能创建。你可以看到歌利亚在建造中,然后它从龙门架中走出来,可以在地图上四处行进。
歌利亚可以“锚定”,把自己固定在地面上。在锚定状态下,它们可以作为新的总部,在新区域建造步兵单位和其他建筑。
两架秃鹰飞机可以钩住歌利亚,此时就可以把它飞到地图各处!
现在游戏会在你摧毁敌人的总部建筑以及他们可能建造的任何歌利亚时结束。
还有几个与歌利亚相关的修改器:
歌利亚舰队让双方开局各有四架空中歌利亚(每架配备一对秃鹰),没有其他单位。
机器人之爱增加一条特殊规则:如果敌对歌利亚在战场上靠近彼此,它们会坠入爱河,游戏以平局结束。(感谢Natalie想出这个)。
智能体战斗
v10 的另一个功能是智能体对战。在思考多人游戏如何实现时,我产生了一个想法:如果不同的 LLM 能在游戏中一决高下会怎样?
有趣的额外挑战:思考如何让编程智能体也能参与多人游戏。如果能安排一场例如 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 的回放,这里是同一场对战在独立调试工具中的版本,该工具会显示底层提示响应。
驱动智能体对战的提示可在此处查看。
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 提交到这类活动——它仍然太过低投入,不配被当作正经独立游戏项目来考虑。
……但我现在能看到一条让这类氛围编程游戏被认真对待的路径。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、Model 浏览器、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 现在支持在线多人游戏。点击“与朋友在线对战”,然后通过你喜欢的消息应用分享生成的房间 URL,或者让对方扫描显示的二维码。
我还添加了一个功能,可以在比赛结束后复制比赛的 JSON,然后将其输入回放功能来重新观看你的游戏。
我没想到这么快就引入在线多人模式,但这个令人头疼的 bug 感觉值得一个紧急的替代方案。
