Simon Willison 又做了一次"氛围编程"(vibe coding,指几乎不亲自读代码、靠自然语言指挥模型写程序的开发方式)实验:用 Claude 系列模型从零做出一个《命令与征服》风格的即时战略游戏 Battle Drones,浏览器里跑,手机和桌面都能玩,前后迭代了 12 个大版本。
起点:一个不够好玩的原型
项目 7 月启动,第一版用的是 Claude Fable 5。他给模型的初始提示很朴素:做一个移动端友好的 RTS,两军争夺地盘和资源,先出 MVP,有什么不清楚的先反过来问他。素材靠给 Claude Code for Web 配一个 OpenAI 图片生成 API 的 key,让模型自己调用生成精灵图。
结果是"能看出是个 RTS"——有建造、有选中单位、有基础 AI 对手——但几乎不好玩。第二版补齐了所有载具的精灵图,并加入"AI 对 AI"模式,让他不用自己操作也能看游戏跑起来。
换更好的模型,先把画面做对
到 10 月,他把模型换成 Claude Opus 5.5,给了一条很"贪心"的指令:大幅改进画面和玩法,保持移动端友好,用新的图片 API 重画素材,加新单位、新建筑、更多样的地形,顺便把数值平衡调好。
这一版产出了五张带生成式背景贴图的地图,精灵图也全部重画,观感明显上了一个台阶。但核心问题没解决:玩几分钟就腻。
他此前一直有个判断——编程 Agent 能做出"看起来像游戏"的东西,却做不出真正让人上瘾的玩法。为了给模型一次翻案的机会,他在手机上发了一句后来被反复引用的话:"这游戏还不够好玩,让它好玩非常多。"
"让它好玩非常多":一次跑通夜的动态工作流
这条指令不是在普通会话里执行的,而是在 Claude Code for Web 的"动态工作流"(dynamic workflow,用一段 JavaScript 脚本编排大量子任务并行推进)里跑的。晚上发出,第二天上午才拿到可玩的结果——中间模型自己跑了超过一千次模拟试玩,用结果反推数值、加功能。
效果可以用数字衡量:在 1200 场 AI 对 AI 的测试对局里,25 分钟仍分不出胜负的比例从 14% 降到 0.9%;原本落后 800 以上废料的阵营翻盘获胜的比例,从 24% 升到 46%。也就是说,比赛更能拖、更能翻盘,而不是一边倒。
这一版新增的内容包括:开局三选一的战术(闪电战、工业、空军)、四种呼叫打击(弹幕、EMP、空投舱、天锤轨道打击)、中立的传输中继与补给点、战斗音效与自适应配乐、单位语音和播报员、老兵等级与战后报告、7 个改变规则的"变异器",以及一个每日挑战。
从 2D 到 3D,再到"两个模型对打"
下一个指令只有一句:把游戏移植到 three.js,所有建筑、载具、地形都换成 3D 模型。又是一夜跑完,醒来就是成品——而且这些 3D 模型不是导入的素材,是模型直接写成 TypeScript 代码构造出来的几何体。
之后的版本补上机器人步兵(步枪兵、火箭班、狙击手)和"秃鹫"运兵载具,加入巨型机甲 Goliath(自带激光眼与臂炮,还能就地建基地),再往后是随机地图生成器和"Agent 对战"模式——两个大模型各自操作一支部队互相打,人可以只当观众。
最离谱的一步:用声音联机
最后一个大版本实现了两台设备之间的对战,同步方式不是 WebSocket,也不是 WebRTC,而是**用扬声器和麦克风传数据**:两台手机凑在彼此能听见的范围内,靠音频报文同步游戏状态。这是他把早前一个音频传输实验直接搬过来的结果。他自己也承认,这条路带来了不少头疼的调试问题,后来又补了常规的在线联机。
值得记下的几点
- 他几乎没有读过这个项目的代码,用的还是自己并不熟的 TypeScript。质量靠的是**大量试玩 + 高频迭代**,不是代码审查。
- 真正让游戏变好玩的不是"写得更漂亮",而是让 Agent 有能力**自己跑模拟、自己评估结果**。上千次自动对局是这次质变的关键。
- 画面、玩法、移植这些任务可以拆成互不干扰的大块,正好适合交给能长时间自主运行的 Agent。相比之下,需要精细手感的调优仍然离不开人一遍遍试玩。
原文附有每个版本的关键提示词和对话记录链接,想复现这条路径的话值得逐条看。
内容与图片版权归原作者所有 · 原文: https://simonwillison.net/2026/Oct/20/battledrones/