AI Agents

我如何用 Claude 打造 Quads——一款手机桌游:从 2 小时黑客松到应用商店

Alejandro Rioja
Alejandro Rioja
1 分钟阅读
TL;DR

Quads 是一款手机桌游——对经典抽象游戏 Quarto 的一次清爽演绎——它始于我和一位朋友在哥伦比亚的 2 小时黑客松,最后上架了应用商店。这是我如何用 Claude 构建的完全公开版本:并行的智能体 worktree、一个真正的(非 LLM)游戏 AI、离线优先的设计,以及那些让我付出时间代价的具体的坑。

免费新闻通讯

每周三。28,400+ 读者。纯干货。

目录

更新于 2026 年 7 月。

太长不看: Quads 是一款手机桌游——对经典抽象游戏 Quarto 的一次清爽演绎——它始于我和一位朋友在哥伦比亚的 2 小时黑客松,最后上架了应用商店。这是我如何用 Claude 构建的完全公开版本:并行的智能体 worktree、一个真正的(非 LLM)游戏 AI、离线优先的设计,以及那些让我付出时间代价的具体的坑。

[运营者视角] 我在一家咨询品牌和 Pickleland 之间运行着 30 多个生产环境的智能体——Pickleland 是我在奥斯汀都会区的匹克球场馆。我构建的大多数东西都是严肃的商业软件,手册我都保密。Quads 恰恰相反——一个我可以从头到尾展示给你看的有趣副业。如果你想确切地看到我怎么和 Claude 协作、一点都不打磨掩饰,那就是这篇文章。你可以在 playquads.com 找到这款游戏。

它始于哥伦比亚的一场 2 小时黑客松

它的起源随意得几乎有点难为情。我当时在哥伦比亚旅行,一位朋友和我给自己定了个 2 小时的黑客松:挑个小东西,用 AI 把它做出来,看看能走多远。我们选定了 Quarto——一款漂亮的小型抽象策略游戏,易学却出人意料地有深度。两个小时后,我们有了一个能玩的原型,而这个点子太好了,不该被丢在一台笔记本电脑里。

一个限时挑战开的头,最后变成了 iOS 和 Android 上一款真正上架的手机 App。这条弧线——玩笑式原型到商店上架——正是我认为这个项目值得一写的全部原因。「有趣的点子」和「陌生人能下载的东西」之间的距离已经坍塌,而 Quads 是一个清晰的案例,展示了它是怎么坍塌的。

先岔开说说名字。这款游戏是对 Quarto 的重新实现,而 Quarto 是 Gigamic 拥有的注册商标游戏。所以第一个非代码的决策,就是不要在任何客户能看到的地方管它叫 Quarto。它从 Quarto(玩法机制),经过几个过渡名字,变成了 Quads——一个我可以正当使用的名字。如果你在重新实现一款经典游戏,在你爱上某个名字之前,先把商标问题处理清楚。

Quads 到底是什么

给不熟悉的人:Quads 在一个 4×4 的棋盘上、用 16 枚各不相同的棋子来玩。每枚棋子都有四个二元属性——高或矮、深或浅、方或圆、实心或空心——这 16 枚棋子把每一种可能的组合恰好各覆盖一次。你通过凑成一条四枚棋子的线来取胜,这四枚棋子只要共享任意一个属性即可。

让它变得精妙的转折是:你不能选自己要放的棋子。是你的对手把它递给你的。 然后你再把对手要放的递给他。所以每一回合都是双重困境——你要在不给对手做局的前提下放下别人递给你的那枚棋子,同时挑一枚不会把胜局白送给对手的棋子递过去。它优雅,而且是真的难。

这款 App 提供四种玩法,全都完全离线:跨五个难度档次与电脑对战、在一台设备上轮流传玩、每日谜题,以及一种异步的「向朋友发起挑战」模式。无需账号、无需服务器、无需登录。这个离线优先的决策驱动了大量工程实现,也是单人构建之所以可行的一大原因。

游戏逻辑:一整套规则从位运算里自然掉出来

这是我最喜欢的部分,因为它属于那种无论 AI 有没有参与都令人满足的东西。

16 枚棋子里的每一枚,只不过是一个从 0 到 15 的整数。四个二进制位里的每一位,就是一个属性。就这么简单——整套棋子就是 0–15 这些数字,因为四个位恰好给你 16 种组合。

于是判定胜负几乎变得不值一提。对任意一条四枚棋子的线,你维护两个累加器:在每一枚棋子里都为 1 的那些位,以及在每一枚棋子里都为 0 的那些位。如果走完四枚之后任一累加器非零,这些棋子就至少在一个属性上一致——那就是胜局。整套规则坍缩成了几个按位与运算。

因为这套逻辑是对整数的纯函数——没有框架、没有 UI、没有状态——它可以直接做单元测试,而且扩展起来轻而易举。Quads 甚至还提供一个自定义规则变体,让九个 2×2 的方块也算作取胜形状,这在同一个位运算技巧之上只是两行代码的增补。当你和一个 AI 伙伴把核心逻辑保持得这么干净,加一个功能就成了乐事,而不是风险。

AI 对手不是一个 LLM(而这才是对的选择)

这里有一个我很在意的教学时刻:不是每一个「AI」都该是一个大语言模型。

Quads 的对手是纯粹的经典游戏 AI,它也理应如此。每一回合它做两个决策——把递给它的棋子放在哪里,以及把哪枚棋子递回去——而难度决定了它思考得有多用力:

  • 新手基本上是随机走棋,还会把胜局白送给你。
  • 中间档次加入了启发式规则:如果存在立即取胜的机会就抓住它,并避免递出一枚对手能借此取胜的棋子,优先选那枚为未来埋下最少威胁的棋子。
  • 大师和特级大师跑一套有界的 negamax 搜索——真正的博弈树搜索——但带一个硬性的节点预算,这样一步棋绝不会卡住手机的主线程。在游戏早期,完美搜索不可行,它会退回到快速的启发式规则;到了游戏后期,博弈树足够小,它就来真的搜索。

这里有两点值得偷师。第一,在这里,一个语言模型会更差——更慢、更贵、不确定、还打不过——远不如五十行 negamax。让工具匹配问题。第二,节点预算才是真正的工程:在一台移动设备上,「正确,但偶尔卡上四秒」是一个失败的功能。把搜索限定住,让一步棋始终很快,哪怕偶尔不是最优——这就是玩具和产品之间的区别。知道什么时候该动用一个 LLM,和我对每一项自动化所用的是同一种判断——这正是我如何判断一个 AI 项目值不值得做的核心。

我究竟怎么驾驭 Claude:在 worktree 里并行跑智能体

现在轮到我在更大的产品上保密、但在这里可以完全展示给你看的那部分。

我不是一次只用一个 Claude 会话来构建。我并行跑好几个,每一个都在它自己的 git worktree、自己的分支上。一个智能体加国际化,另一个搭建每日谜题系统,还有一个做色盲模式,又一个接上音效——每个都隔离在自己的工作副本里,这样它们没法互相破坏,而每一个在通过测试后再合并回来。Quads 的 git 历史是一整面墙的 Merge branch 'worktree-agent-…' 提交,从外面看,那套工作流就长这个样子。

worktree 之所以重要,原因很简单:并行的智能体去编辑同一个工作目录,会瞬间互相踩踏。给每一个一个隔离的检出,你就能真真切切地同时有四个功能在施工,然后像合并任何别的分支那样把它们合并进来。这是对我工作方式撬动力最大的单项改变——我从一次一个对话、一个功能,变成了一支小舰队。

如果你想要那些智能体所依据的提示词背后的纪律,它就是我在如何写出不会在生产环境翻车的 AI 智能体系统提示词中描述的同一种:撬动力在于清晰、当下有效的规格,而不是巧妙的措辞。

那个花了我一个小时的坑(这样它就不会花你一个小时了)

每个项目都会教给你一个又蠢又费钱的教训。在 Quads 上,这个教训是:预览工具并不总是显示你以为它在显示的那个分支。

当你在多个 worktree 里跑多个智能体、并预览它们的成果时,预览可能从一个不同的目录启动——不是你当前会话所在的那个——于是你截了 App 的图,一个改动都看不到,然后开始调试那些「缺失」的、其实从没缺失过的 UI。功能好好的;是预览指向了错误的检出。在我搞明白到底发生了什么之前,我为此白白搭进去了不少时间,后来我把它写进了项目自己的笔记里,好让未来的我(以及我交给这个仓库的任何智能体)在调试幻影 bug 之前先检查一下预览目标。

与之相关的陷阱:定义那些预览的配置文件在并行会话之间是共享的,所以两个智能体同时编辑它,可能会悄无声息地覆盖掉彼此的条目。如果你打算跑一支舰队,就把共享配置当作一种被争用的资源来对待——它只会咬你一次,只要你把这个教训写下来,之后就再也不会了。

这个习惯——把每一个来之不易的坑都记进一个下一个会话会读到的持久文件里——是任何规模下用 AI 构建的沉默脊梁。上下文会在会话之间蒸发;写下来的教训不会。

我引以为傲的那些离线优先的小技巧

因为 Quads 没有后端,有几个问题需要巧妙的、无服务器的解法:

  • 每日谜题是根据本地的一年中第几天来确定性地选出来的,于是全世界每一位玩家都拿到同一道谜题,零服务器协调。(附赠教训:我上线之后,立刻修掉了那段日期运算里一个夏令时相关的差一错误。日期总是比看上去要难。)
  • **「向朋友发起挑战」**把一道谜题编码进一小段文本代码——类似 QC1-01-03-3 这样的东西——由一个校验和守护着,这样一个笔误就没法产生一个「有效但错误」的挑战。你的朋友把它输进自己那份 App 副本里,就能玩到一模一样的局面,完全离线。没有账号,没有匹配,没有服务器。
  • 富链接预览是我唯一确实用了一点点服务器代码的地方。当你分享一个挑战链接时,一个单独的 Cloudflare Pages Function 会为每段代码渲染出对应的 Open Graph 标签,好让链接在 iMessage 或 WhatsApp 里漂亮地展开。社交爬虫不跑 JavaScript,所以一个客户端渲染的预览会让每个链接看起来都一模一样——一个小小的函数就修好了这一点,而无需一个真正的后端。

这些一旦你看明白了都不难,但每一个都是这样一个地方:偷懒的答案是「起一个服务器和一个数据库」,而更好的答案是「做那个巧妙的离线方案」。完全避开后端,正是为什么一个人能交付并维护这个东西。

从黑客松到商店上架

最后一段路——那个没人会跟你讲的、关于「2 小时项目」的部分——是介于「它在我手机上能跑」和「陌生人能下载它」之间的一切。一次横扫八种语言的国际化。绝不使用那个注册商标名字的商店文案。应用商店的构建工具、版本管理,以及那些让商店审核不把你打回来的平台特定权限清理。这一切毫不光鲜,却是很多副业项目悄然死去的地方。

用 Claude 来做,没有让清单变短,但它让每一项都便宜到了我真的能做完的程度。这才是 Quads 真正的故事:不是 AI 写了一款桌游——很多人都能做出个原型——而是它把最后一公里的成本降到了足够低,让一个黑客松玩笑变成了一个上架的产品。

如果你手里攥着一个一直没动手的小点子,那就是我全部的主张。先做那个 2 小时的版本。你会惊讶于终点线已经移得多近。而如果你想看看这套同样的工作方式往规模上能走多高,我把它一路推到了一整套多租户 SaaS——我如何用 Claude 打造 Courtlines,一款俱乐部管理平台

playquads.com 玩 Quads。

常见问题

Quads 是什么?

Quads 是一款面向 iOS 和 Android 的手机桌游——对经典抽象策略游戏 Quarto 的一次清爽重构。你在一个 4×4 的棋盘上、用 16 枚各不相同的棋子来玩,而转折在于:是你的对手挑选你必须放下的那枚棋子。它免费畅玩,提供单人、轮流传玩、每日谜题和异步挑战等模式。在 playquads.com 找到它。

Claude 写了整款游戏吗?

Claude 写了绝大部分代码,依据的是由我拥有的设计和决策。我并行跑了好几个 Claude 会话,每一个都在它自己的 git worktree 里,构建不同的功能,再由我合并到一起。游戏逻辑、AI 对手、国际化、音效和谜题系统,大体上都是这样构建、并由我审阅的。

游戏里的 AI 对手是由 LLM 驱动的吗?

不是——而且是刻意的。这个对手用的是经典游戏 AI:较低难度用启发式规则,顶级档次用一套有界的 negamax 搜索,带一个硬性节点预算,这样一步棋绝不会卡住设备。对这个活来说,一个语言模型会更慢、更贵、也更弱。为问题选对 AI 的种类,比总是伸手去够那个最大的模型更重要。

Quads 花了多长时间才做出来?

第一个能玩的原型出自我和一位朋友在哥伦比亚旅途中的一场 2 小时黑客松。把那个原型变成一款打磨过、可上架两大应用商店的 App——带国际化、一个真正的 AI 对手、离线挑战,以及商店合规——花的时间要长得多,但每一个单独的步骤在 AI 的帮助下都便宜到足以让这个项目真正抵达终点线。

用 Claude 构建 Quads 最大的教训是什么?

两点。第一,在隔离的 git worktree 里跑智能体,这样你就能并行构建好几个功能而不让它们互相踩踏。第二,把每一个坑都写进一个下一个会话会读到的持久文件里——上下文会在会话之间蒸发,但写下来的教训会复利累积。想看这套工作方式的更大图景,见我如何用 Claude 打造 Courtlines

继续阅读

相关文章

继续阅读

将AI实战手册发送到您的邮箱

每周三。28,400+ 读者。纯干货。

↵ 查看全部结果 esc esc 关闭