ARTICLE · 1158600
本来想让 AI 帮忙记桌游积分,最后却用 Agent 搓了个 App,还开源了
我本来只想让朋友少按几次计算器,最后却做出了一个 App。代码、图片、多人测试,连介绍视频,都由 Agent 替我执行完成。而我推进这些工作,全程只在 Agent 的聊天框里做一件事:和它聊天。
第一版大约一小时就能运行,接下来却又磨了几天。 最让我意外的,是它连测试用的“朋友”都能自己凑齐,却会在手机上的一个输入框前反复绕圈。也正是这些顺利和不顺利,让我慢慢看清:当实现变得容易,人还有哪些事值得花时间。
开源项目:https://github.com/Snowdar/weizhuo。附开发记录、问题复盘与经验沉淀,文中有成品演示和声音对比。

事情的起因是这样的。
国庆下大雨,闲着无聊,之前不怎么玩牌的朋友,竟然叫我一起玩炸金花,说想博弈一下心态。
那肯定得记分,输赢有了记录,才能回头看看心态怎么变,也借此体会人为什么容易上头、为什么要远离赌博。可我一看,他们竟然拿着手机计算器,手动加加减减地记分。
给我惊呆了。
算术倒不难,难的是过程。炸金花是一个典型的按回合持续记分的游戏:谁看了牌,谁跟了多少,谁又加了多少,现在轮到谁,一局里有一串连续动作。只留下最后一个总数,中间算错了,连回头核对都费劲。
麻将里常见的是一局结束后结算,炸金花却得一路跟着记。新手还要边玩边问规则,大家既要解释,又要推进流程。我找过记分器,有的收费,有的有广告,有的要全桌下载,更关键的是,能加减分,也未必适合这套玩法。
拿着计算器玩了几局,规则竟然都还没统一,也没人能完整讲明白。边玩边问,问着问着,又发现大家理解得不一样。
这时我想到手机上的语音助手。AI 会多轮对话,能接着前面的话聊,让它听着我们说话、顺便记下来,似乎很合适。
一试才发现,一桌人聊天,和一个人对着手机说话,差得远了。
几个人的声音混在一起,它要听、理解,再回答,桌上的人却不会整齐地等它。“我要跟”和“我已经跟了”,还得对应到正确的人和回合。新手自己没弄明白,又要先解释给 AI 听。
更要命的是,大家还得安安静静等它回复,确认没问题了,才能进行下一步。这还没玩完一局,朋友们就已经不耐烦了。
我本来想省下解释的麻烦,结果多了一个要解释的对象。
这时我突然冒出个念头:现在 Agent 都能写软件了,要不直接让它帮我搓一个?
玩家在手机上点自己的操作,全桌同步看进度,就不用让 AI 在一旁听着猜了。大家连着同一个 Wi-Fi,建个共享房间,扫码进来,应该就能玩。
01 一小时能跑,关掉网页却找不回自己
这个工具后来叫围桌。一台设备建房间,朋友连上同一个 Wi-Fi,扫码加入,各自操作,全桌共享积分和进度。
朋友负责把炸金花的规则弄明白,我来想程序怎么组织,再和 Agent 聊怎么做。第一版就有大厅、房间和游戏流程,不过界面很简单,基本就是文字、表格和按钮。
大约一小时,一个能运行的版本就有了。

早期文字与表格界面,图为这一阶段迭代中的真实测试截图,还没有后来的固定牌桌。
这速度确实让人兴奋。可把网页关掉再打开,我就发现了一件尴尬的事:怎么找不到自己的位置了?
系统根本不知道,回来的是刚才那个人。开发时我关心怎么建房、怎么行动、怎么结算,却漏了一个再日常不过的动作:退出以后再回来。
于是补上身份恢复和参与过的房间入口。既然已经做了,也把德州和自由记分加进来,覆盖更多玩法。
不实际用一下,我还真没想到这一点。脑子里觉得流程挺完整,拿到手里一试,连退出再回来都没考虑。好在现在改起来快,发现漏了什么,就能接着补。
后来几版大概是这么改过来的:
先跑通:大厅、房间、炸金花,随后补身份恢复,扩展到德州和自由记分。
再收拢画面:长网页改成固定牌桌,记录与操作按需打开。
再加声音:有人漏看自己的回合,用播报提醒。
再做减法:有人嫌花哨,补简约视图,放大按钮。
最后磨设备:键盘、声音、横竖屏、不同终端,反复验证。
列出来没几行,实际做的时候,有些地方快得出乎意料,有些小问题却能卡上好久。
02 它连测试用的“朋友”都能自己凑齐
第一版能记分,却很快变成一条长网页。玩家状态、当前行动、奖池、按钮和记录都摊在上面。想看看刚才发生了什么,要划;轮到自己,找按钮还要划。
聚会本来是为了玩,结果大家得先学会找东西。
第二版我就想,干脆把牌桌固定在屏幕里,再加个全屏模式。玩家和轮到谁一直看得见,记录、设置、操作要用时再弹出来,不用全挤在一页。这样也更像大家围着一张桌子玩。

后来逐步完善的牌桌界面。玩家与行动集中显示,记录和操作按需打开。
背景、图标、筹码素材怎么办?Agent 调用生图工具生成,再调整尺寸、压缩、放进界面。积分和流程仍由程序实时显示。我原先担心一个人顾不过来的素材工作,也能一起往前做了。
到了测试,它又让我意外了一次。
它用 Computer Use,也就是操作电脑和浏览器的能力,打开多个独立玩家页面:一个建房,另外两个加入,轮流行动,再检查其他人的页面有没有同步。
以前我得自己来回切,或者找朋友配合。现在,Agent 连测试用的“朋友”都能自己凑齐。
这就省事多了。我不用自己切来切去,也不用为了测一下同步,先把朋友叫齐。后来连演示视频,也是它操作页面、模拟对局,再录制和剪辑的。
但它能做出一张漂亮牌桌,不代表朋友就喜欢。
后面有人反馈,自由记分有点花里胡哨。想想也对:德州有座位和回合,自由记分有时只是几个人互相记一笔。于是保留牌桌,同时补了简约视图,操作按钮也放大,方便手指直接点。

同一个自由记分房间,左边简约,右边保留牌桌氛围,共用积分与记录。
朋友是来玩的,不是来参观我做了多少功能的。
现在加点东西太容易了,不合适再改也快。可这又让我容易越做越多。朋友一说嫌花哨,我才又想起来:大家用着省事,比我多做几个功能更要紧。
03 一句声音提醒,怎么还用上了语音大模型
声音是第三版加的,比简约视图还早。这个得单独聊聊,原本只是想让它提醒一句轮到谁,结果后面折腾出了不少东西。
屏幕能显示轮到谁,却不能保证那个人看见。尤其出去郊游,大家边聊边玩,很容易漏掉动作。让房主设备念一句“轮到几号”,总比一直盯着屏幕自然。
提醒很快有了,可系统音色机械、老成,听多了,甚至有点不想玩了。
于是我让 Agent 试了 Kokoro、VITS、Qwen 等 TTS,也就是把文字转成语音的模型。VITS 确实能装进手机,在本地把文字念出来,不过音色听下来还差点意思。Qwen 的 Serena 听着不错,Mac 试听模型却约 2.3 GB,为了记分把它塞进手机,代价又太大。
那提前录好,手机只播放呢?编号、动作、金额一直变,整句话录不完。把“一号”“加注”“一千二百八十分”分别生成再拼,又会出现停顿、语气不连贯,甚至吞字。
我提了个想法:先把完整句子念自然,再对齐文字和声音,从里面取需要的片段。 比如从“二号玩家获得六十分”里取连贯的“获得六十分”,尽量保留原本连着说话的感觉。
Agent 去实现、做试听、调整切点。轻的字头不能当成静音删掉,数字和“分”尽量连着留。后来我又用别的 Agent 产品里的 GLM 5.3 Flash 模型交叉分析,发现一些原始素材本身就拖得异常长,得重新生成。
下面三组先听差别。旧版用短片段拼接,优化版重新合成完整句子,没有靠加速缩短录音。固定提醒可以整句保留;金额、编号不断变化的播报,仍需要切片组合,这三组试听不能代表所有动态拼接的效果。
<轮到一号玩家行动:优化前后对比>
<轮到二号玩家行动:优化前后对比>
<二号玩家加注1280分>
每组先旧版、后优化版:轮到一号、轮到二号、二号玩家加注 1280 分。
片段切好,还得知道它们组合以后有没有问题。一条条听,很快就顾不过来。
那就再找个能听音频的模型来查。我让 Agent 用语音大模型 dots3-note-prev:先不告诉它这句应该说什么,让它听完写下来,再对照有没有吞字、拖音,拼接的地方顺不顺。它找出过片段混进后续数字起音的问题,追查下去,是对齐时把逗号也当成了需要发音的内容。
检查也从最初抽查的 36 条,扩到了 482 条完整播报,包括 419 条事件文案和 63 条扑克流程专项,最终都通过了模型的盲转写和音色对照检查。另外,4,391 个编号、金额和动作组合都能正常组句。这两个数字说的是不同的事:一句话拼得出来,不代表听着就自然。
我提个办法,它做出来,再找另一个模型来查,查出问题接着改。以前这些都得自己一项项做,现在连检查也能让它张罗了。
不过,模型说过关,我自己一听,几个数字的衔接还是不顺,有的整句音调也不对。于是又回去重录,尽量把金额和“分”连着保留,重新检查最终拼出来的整句话,才有了上面这一轮结果。手机上还出过跳音、提示铃盖住语音的问题。模型已经替我查了很多,但最后好不好听,还得拿耳朵听;这批新素材也还要重新打包到手机上验证。
最后留下三个方案、四个音色供选择:“清晰”用系统语音;“松朗”“悦然”用本地 VITS 模型合成整句;“暖语”组合 Serena 预制片段,不把 Qwen 大模型装进手机。
系统方案省空间,手机现场合成得等一等,提前录好的播放快,却又要处理拼接。想好听、想马上出声,还想安装包小,没那么容易全占。所以最后留了几种,让人按自己的设备和喜好选。
04 它说修好了,我拿手机一试,还是不对
能自己模拟多人,又能调用模型查音频,听起来已经很强了。偏偏让我反复花时间的,是手机上的一个输入框。
点金额框,键盘闪出来又退回去;有时卡片顶到上面,下面空出一大片;按钮明明有地方,却挤成两行。
我的要求很朴素:操作区在键盘上方,能输入、能提交。它改布局、检查、打包,说这次应该对了,我拿手机一试,还是不对。
模拟器没能稳定复现,iPhone 镜像也不能完整还原我手指点下去的过程。它看到的证据,和我看到的失败现场,不总是一回事。
我说“还是不对”,它便沿着已有的解释继续找。一轮又一轮,改动越来越多,却未必靠近原因。
后来补现场、查版本、看日志,才发现问题各不相同:有一版安装包带了旧网页;有一次手机白屏,干净模拟器却能启动,是手机留下的旧音色设置触发了异常。另一些问题,GLM 5.3 Flash 提出了网页和原生窗口同时调整位置、互相拉扯的可能,还要按这个方向修改后再验证。
准备重录演示时,我又指出记录区偏位、玩家卡片没有贴住桌沿。查下去,背景和卡片竟然按不同的区域定位,全屏后自然错开。统一基准再检查,短横屏的卡片里还藏着被裁掉的按钮。

当时的问题界面:按钮偏位、设置页控件溢出、给分弹层裁切。
这些问题让我逐渐理解,为什么一小时能跑,后面还要几天。
外框放得下,里面的按钮未必放得下;两人桌正常,十人桌可能遮挡;同一台手机,横竖屏、普通与全屏也可能不同。Mac 的窗口与网络、iPhone 的键盘与前后台、安卓的机型与权限,又各有自己的问题。
它确实能构建多个终端的安装包。但一套代码装进不同设备以后,仍然得分别看、分别试。
从 Python 服务到桌面包,再到手机 App,本来都是为了方便使用。朋友想玩,不能先学配置环境,出去聚会也未必带电脑。可方便朋友的这一步,把更多设备上的细节带到了开发面前。
那几天,从 iPhone build 30、桌面和安卓 build 38,一直改到 iPhone build 46,小到音色选择框,大到网络切换后重启、重新扫码,都还在调整。源码改好了,手机里是否装着新版,也要核对。
一旦 Agent 无法自己验证,时间就重新落到人身上:连接设备、安装、操作、截图、描述,再等下一版。
到后来,我已经不急着催它“再修一下”了。我更想先弄明白:它看到的,跟我手机上出现的,到底是不是同一个问题? 不然再改几轮,也可能还在原地打转。
05 最后做出来的围桌,能用来干什么
说了这些折腾,成品也该摆出来看看。
围桌用于线下桌游的共享记分和流程提示。一台电脑或手机启动服务,其他人连上同一个 Wi-Fi 或热点,扫码用浏览器加入。不必人人安装,也不依赖互联网和云服务。
它目前覆盖三种玩法:
炸金花:看牌、闷注、跟注、弃牌、比牌和结算,跟着回合推进。
德州:盲注、全下、主池与边池分配,也提醒发牌步骤。
自由记分:给分、请求收取、多人交换,支持负分和可选奖池,简约或牌桌视图都能用。
房间与身份能恢复,积分和记录同步;收取需要对方确认,房主能撤回错误动作,规则可以编辑和收藏。房主设备负责播报,连续消息逐条播放,避免全桌手机一起响。
下面是 Agent 录制、剪辑的演示:从启动服务、进入大厅,到德州里的 All-in、弃牌和结算。两位玩家的竖屏画面并排放着,可以看到操作如何同步,也能听到行动提醒。
视频约 56 秒,含介绍旁白和游戏对局测试效果

手机界面一览:启动、服务、大厅、两种自由记分视图、炸金花、德州、规则与记录
要注意的是,真实进行桌游时,实体牌仍由人发,胜负由人判断,围桌只负责记分和提示。
现在该项目已经开源,地址已附在文章开头,除了可以直接用 Python 启动网页服务外,端侧也做了一些 build 流程,支持 Mac、Windows、iPhone 和安卓的安装包构建;其中,iPhone 管理较严,需自行签名,构建方法已整理在 README。如果不会构建,召唤 Agent 教你即可。
06 做完之后,我反而更清楚自己该干什么了
回头看,最初那个“让 AI 听大家说话”的想法没有走通,换成“让 AI 帮我做一个工具”,反而做出来了。
朋友用的时候,哪管背后是什么模型。轮到我了,我点一下;没看屏幕,听见提醒再来操作,就够了。我跟 Agent 可以聊来聊去,没必要让朋友记个分也跟着聊半天。
做完围桌,我再想自己爱玩的小游戏、想看的监测仪表,或者按自己的习惯整理东西、记账的小工具,就觉得这些都可以试着搓一个。以前找软件,得看别人做了什么;现在也能从“我想怎么用”出发,做个适合自己的。
但实现容易之后,我并没有少做决定。
自由记分要不要牌桌?声音好听一点,值不值得多等?一个功能已经能用,还要不要继续加?尤其加东西太方便,我更容易忘了,朋友只是想顺手记个分。
TTS 尤其让我体会到,同样是“加个功能”,难度能差很多。把声音播出来是一回事,让数字连读自然、几句话听着像同一个人,又是另一回事。这里已经碰到语音模型本身的能力了,不能指望多改几行代码,就把所有问题都修好。
这次我选的是整句合成、按上下文取片段,再检查最终组合。要是还想更好,或许得换模型、准备更合适的数据,甚至微调,让模型更适合这种播报。但那又是另一份投入了,围桌需要做到哪一步,得由我来拿主意。Agent 能把一个方向展开到成千上万次检查,方向选得不好,也能沿着它折腾很久。
键盘那几天也让我长了个记性。它说完成,我很容易就信了,可背后到底改了哪里,又碰了哪些旧功能,我未必知道。这样一路补下去,项目变成“鸡窝”真不是吓唬人。我就碰到过,修个输入框,最后连 App 都进不去了。
所以后来我会追着问:这次动了哪里?原来的功能查过没有?是在模拟器里看着正常,还是手机上也试过了?隔一段还得让它讲讲程序现在怎么组织,免得我只知道又修了几个按钮,里面已经绕成一团。
有些关系也得早点定好。比如换个外观,不能换一套记分规则;卡片和背景的位置,得按同一张桌子算。不同设备的键盘和声音怎么处理,也得分清。
这些东西在截图里看不出来,下一次改起来顺不顺,却很有关系。早点给它一套成熟的布局和跨端方案,可能比等它修乱了,再陪它来回找问题省事得多。
而且,我自己能用,跟别人轻轻松松就能用,中间还隔着不少事。
围桌现在在同一个 Wi-Fi 下就能玩。如果想让相隔很远的人也能进房间,就得考虑云端服务、数据库存储、域名,以及后续的费用和维护;面向国内提供互联网服务,还要按业务和部署情况处理备案等手续。想改成小程序,大家不用下载安装,入口更方便了,也还有平台适配、审核和备案要做。
即使只做本地 App,也不是打出安装包就能随便发。Windows、Mac 可以走直接下载,仍得考虑签名和安装提示。iPhone 自己连接电脑做开发测试可以用免费账号,但要通过 App Store 或 TestFlight 分发,就要加入付费的 Apple Developer Program,再按渠道走签名、提交和审核流程。代码写得再快,这些事也不会跟着消失。
这次围桌就是先搓出网页版,再一路做成 App。最后确实能用了,但网页里看着正常的东西,到了手机上,键盘、布局、声音又得重新折腾。开始时觉得“能跑就行”,后来才发现,光是让朋友方便地用起来,就有不少活。
再看秒哒、Lovable,以及 Eazo,我大概能理解这类产品在忙什么了:把设计、数据库、登录、预览、发布这些环节接好,让用户从一个想法走到能用的成品时,少自己折腾几道。各家具体能做到什么程度,还得实际试。但做完围桌,我能理解这种需求了,毕竟很多人只想要一个能用的工具,并不想顺便学一遍怎么开发和上线。
这也让我更愿意给它找现成、成熟的办法,而不是每次都从头试。踩过的坑也记下来,不然换次任务、隔几天再改,又得把前因后果重新讲一遍。围桌现在除了代码,还攒了不少这种记录,下次接着做时都用得上。
和朋友聊起 Agent 现在能做到什么,有的还不相信它已经这么强,有的在试却使不上劲,有的会用却不知道做什么,也有的已经拿它做了不少事。我能理解这种差别。只听别人讲,很难知道自己能拿它做什么;亲手做完围桌,才知道哪些活能交出去,哪些判断还得自己来。
现在再碰到自己熟悉的小麻烦,我会多想一下:要不要让 Agent 试着搓个工具?不一定多大,能让几个朋友省点事就行。写代码、做素材这些活它能接过去,我就有时间多想想到底怎么用,做多了还是做少了,再拿到手里试试。
围桌的地址放在前面了,有需要可以试试。我想要的其实很简单:大家扫码进来,顺手把分记了,该谁行动有个提醒,剩下的时间继续跟朋友玩。
你有没有什么一直想要、却找不到合适软件的小需求?欢迎在评论区聊聊。 如果这次折腾给了你一点启发,也欢迎点个赞,转给同样爱折腾的朋友。