计分器
过节的时候总少不了几桌牌:朋友相聚,或是家人团聚,人凑齐了,茶泡上了,牌也切好了,真正让人烦的往往不是牌技,而是记分。有一回也是这样,屋里坐了满满一桌,从下午打到晚上。一开始有人拿了张纸,歪歪扭扭记着谁赢谁输。打着打着有人起身倒水,有人接电话,回来就问「刚才那把我是不是赢了」,记分的人翻半天才找到一行,旁边又有人说不对、那把是他输的。纸上的字越来越挤,名字缩成一个字,数字涂了又改。一局结束大家围着那张纸对账,对了十分钟还对不齐。后来有人提议改用手机,微信群里报「我 +8」「你 -3」。消息刷得飞快,有人口袋模式没看见,有人回了条闲聊,记分的话就被顶上去了;晚到两把的人问自己多少,得往上翻,翻到一半又不确定哪几条算进今晚这桌。想改上一把,有人说改了有人说没看到,最后各说各的。也有人自己开备忘录另记一份,桌上同时两套账,对起来更乱。散场时大家都明白,输赢倒在其次,烦的是不停停下来问分、对分、解释分——牌是娱乐,记分却成了义务劳动,还容易伤和气。
散场后我就在想,有没有一种东西专门伺候「这一桌、这一晚」:别围着纸问,也别靠群里自觉看消息;每人手机上是同一份结果,记错能改、改完立刻看见,倒个水或闪一下信号别把整桌搞乱,打完还能说清今晚各自多少。后来也搜过别的计分小程序。不少奔着某一种牌去,麻将番杠写得很满,或者先选游戏类型、勾「标准玩法」——可朋友家人这桌偏偏最不标准,今天可能是谁带来的地方打法,下次又换一种,桌上口头约定比说明书管用。想记的那种算法,小程序里根本没有对应项;硬套又对不上,等于规则不支持。就算碰巧沾边,界面也常绕:层级多、按钮碎、记一笔要点好几下,长辈盯着屏幕找半天才下手,牌都凉了。规则嵌死、操作又拖沓,现场一别扭就还是回到纸和群聊。我想要的更窄:你们打什么、怎么算胡,口头说定就行;工具只管把分记清楚、同步好,记一笔尽量干脆。轧平、流水、只看谁赢多少,那是记分方式上的差别,不是再内置一本牌谱。
于是就有了「计分器」。建个房间,报房号或扫码,人进同一间房;选平账、记账或赢钱,开局、记账、确认、结算。屏幕上跟的是同一套分,不管你们叫什么牌,桌上说了算,它只管别记乱、别各看各的;弱网不断人,没打算走房间还在,还能回去接着记。它不教打牌,也不用标准规则框住临时约定——就是过节那张桌上缺的那一块。
我是做开发的。那晚对完账,与其说灵感爆发,不如说憋屈:明明是加减法,却被工具和习惯搞糟心。回去就想自己做一版——需求清楚、边界清楚,正好练从想法到上线;不做大而全,做自己聚会时愿意掏出来用的小东西,顺便把实时同步、房间状态、弱网这些坑踩一遍。
技术上没搞花活,大致是这样:
| 层级 | 选型 | 干什么 |
|---|---|---|
| 小程序 | Taro(React) | 首页建房/进房、房间内记分与分享 |
| 接口 | NestJS | 登录、房间、局次结算、小程序码 |
| 实时 | Socket.IO(仅 WebSocket) | 房内状态同步;微信端不走 polling |
| 数据 | PostgreSQL + Prisma | 用户、房间、成员、局与分数 |
| 约定 | monorepo 共享包 | 事件名、状态结构前后端共用 |
| 部署 | Docker + 反代 | 服务拉起、域名对外 |
后来也收紧过读路径:成员累计分落库维护,拉房间状态时少扫一堆历史流水,人多、局久一点时,「看一眼现在多少」别被拖慢。
| 记分模式 | 更适合 |
|---|---|
| 平账 | 输赢要对平的玩法 |
| 记账 | 流水账,不强求轧平 |
| 赢钱 | 主要看赢家赢了多少 |
它仍然很小,没有融资故事,就是补上过节桌上那一块,顺便写点顺手的代码。如果你也嫌分记到最后大家都不痛快,或者想试试小房间实时同步,欢迎扫码试试(正式版,进首页),建个房拉人打两把就知道顺不顺手。用着别扭、缺功能、模式对不上你们家规矩,都直接说——朋友家人那桌的反馈,往往比我臆想的需求清单靠谱。