
早些时候,做了个联网版的数字炸弹小游戏。两个晚上,42 次提交,跑在免费额度上,没花钱。游戏本身不值一提,真留下点什么的,是开工前我先写的那份"不做"清单。清单之外还撞上了两处坑,一并说了。
以前我和我媳妇在微信里玩数字炸弹:各想一个四位数,轮流猜对方的,对方只回答"对几个位置"。记录和排除全靠她脑子里过,没几轮就开始喊我找纸笔开始记录计算;聊天记录往上一翻,刚才几轮就被顶出屏幕,还得回头翻。游戏本身好玩,配套动作累人。我想,那就做成个网页,对局过程全摆在屏幕上。
先说清楚不要什么再让它动工
代码交给 AI 之前,我先写了一份文档,里面专门一节列"明确不做":不做注册登录,不做陌生人匹配,不做排行榜,不做观战,不做任何策略提示,一共七条。
这份清单是拿来防 AI 过度热情的。你跟它说"做个猜数字游戏",它很可能顺手加个提示功能:根据前几轮,猜哪个数命中的概率更高。这功能一出现,游戏就废了。数字炸弹的乐趣一半就在笨笨地排除,系统开始教你玩,味道就没了。
后来发现这份清单还防了另外的东西,它防的是你自己。项目做半成品的时候最痒,你总想"要不顺便把那个也做了"。提前写清楚不做什么,拒绝的时候手里有个把柄。
搭起来其实就四块,全在免费额度里
先说清楚这玩意儿是用什么搭的,有同样需求的人可以照着拼。全部都在 Cloudflare 一个账号的免费额度里,个人玩完全碰不到收费线。
第一块,前端。React 写的单页应用,Vite 打包。不用服务器,构建产物直接塞给 Workers 自带的静态托管(Assets),跟后端一起部署,传完就有 CDN。
第二块,接口层,Workers 本体。可以理解成一个没有服务器概念的函数:来一个请求,验一下房间码和玩家身份,处理完返回。创建房间、加入房间这些动作走它。
第三块,也是真正的主角:Durable Objects。双人游戏的核心难题是"两个人看到的是同一局",两份手机状态得有个地方合流。传统做法是起台服务器加数据库,DO 把这事变成了一个原生概念:一个房间码,全局对应一个独立实例。这局的密码、每一轮的猜测、现在轮到谁,全存在这个实例自己的 SQLite 里。房间和房间天然隔离,不用建表,也不用考虑别人把你的内存搞爆。
第四块,Alarms。DO 自带闹钟:两小时没人凑局的房间,到点自己销毁,不用单独跑定时脚本。顺带说一句,这也是为什么房间码特意排除了 0、O、1、I:房间是按码找实例的,码拼错了就"找到"别人家去了。
实时通道走 WebSocket,手机直接和房间的 DO 实例保持连接。代码全在一个仓库,一份 wrangler 配置文件,一条命令部署;后来加了个 GitHub Actions,push 到 main 自动测试、构建、上线,连那条命令也省了。
整个账本:零台服务器、零个数据库要养、零消息队列。这就是我说的"无压力":该会动的零件平台都替你造好了,你只管拼自己的需求。
第三轮还说不出为什么不行,换脑子
游戏逻辑写得飞快,我跟 AI 都觉得快完事了。然后卡在一个朴素的问题上:我这边提交一个猜测,她那边屏幕得跟着动。就是弄不通,AI 顺着这条线一直修,这里补一块那里改一块,测试全绿,真机一打开就失败。
最后还是换了模型一下就修复了。这个体验很直观:AI 是有档位的。档位不够的时候它全程殷勤地陪你,产出的一直是跑不通的东西,而你容易怀疑是自己需求没讲清楚。来回修到第三轮还说不出为什么不行的话,可以考虑换个脑子,接着试也白搭。
卡住的那晚我先退了一步,能立刻玩比什么都要紧:让手机每隔一秒多主动问一遍服务器"有动静吗"。回合制猜数字,等一秒半和即时根本感觉不出差别,笨办法立刻能玩。但这笔账不能细算:问一次就是一笔调用,俩人连续对局,两边各一秒一问,一晚上就能把免费的调用次数啃掉一大块,玩的人一多直接顶爆。所以后来把通道问题理顺,第一件事就是换回正经的双向长连接,WebSocket,一条连接挂着,有事才走消息。平台还有个贴心机制叫连接休眠:没消息的连接放一边,不占服务器的计算,等消息来了再唤醒。这两个词还是当时文档里就定死的规格,中间那次绕道,纯粹是为了"先能玩"。
剩下一半全是不体面的小事
能玩那天我以为完事了。后来加了个最基础的统计,才知道真实情况:12 次连接里,10 次中途断过、又重新连上。手机就这样,WiFi 切蜂窝要断,进电梯要断。所以这个游戏必须假设玩家随时掉线:断线前你提交的那个数不能丢,信号一回来,局面得和断之前一模一样。
分享也是个坎。我们自己页面上做了个"分享"按钮,点开游戏的人按它,一点反应都没有:从微信里打开网页时,用的不是手机自带浏览器,而是被塞进一个简化过的壳子里,调系统分享菜单的那套接口在壳子里是禁用的,按钮点了等于白点。改法不体面:不指望系统菜单了,把房间链接直接印在页面上,下面配一个大大的复制按钮,点一下,去微信粘贴。房间还得有寿命:没人来凑局的,两小时自己散掉;打完的一周以后也自动删干净。
这些都不费技术,单拿哪一件出来都是一句话的事,加起来占了两个晚上里的一半。用 AI 做东西,“能跑起来"一晚上就行;要到一个真实的人敢放心用,剩下全在这种小事上。
结尾
现在我们玩数字炸弹,各自躺自己床上掏手机,每一轮的结果都摆在屏幕上,没人再喊找纸笔。
这两个晚上留给我的其实是一副能复用的骨架:点开链接进房、两个人看到同一局、断了能自己接上、没人玩的房间到点自己消失。以后再做双人的小东西,猜拳决定谁洗碗也好,成语接龙记个分也好,换掉的只有规则那一层。
两个晚上,42 次提交,0 元服务器,和一个不用再去找纸笔的人。
游戏地址:digital-bomb.lizhaowen.site
仓库:hawkeye-xb/digital-bomb