2020年上半年,全球居家。一群朋友想在线上玩桌游SET,找了半天没有像样的免费版本,于是其中一个人干脆自己写了一个——周末量级的工程,React加Node,架起来一个网址,朋友点链接进房间就能抢答。这个网站叫Set with Friends,仓库就在GitHub上:ekzhang/setwithfriends。四年过去,它还在稳定运行,代码还是那个周末量级的代码,但它把“为什么有些游戏就是让人停不下来”这个问题,用81张牌回答得干干净净。
对想搞副业的开发者来说,这个仓库的价值不在它本身多能赚钱——它一分钱不收——而在于它是一台被拆开给你看的“上头机器”:规则一分钟学会,核心逻辑几百行,同步机制现成可抄,而你随手给它换个皮、加个钩子,就是一个能挂广告、能进小游戏平台的完整产品。
| 项目 | 信息 |
|---|---|
| 仓库 | ekzhang/setwithfriends |
| 作者 | Eric Zhang(GitHub ID: ekzhang),个人开发者,另一个知名作品是协作记事本 Rustpad |
| ⭐ Star | 数百量级(据仓库页面;本轮未能联网核实,动手前以实时数据为准) |
| 语言 | JavaScript/TypeScript,React 前端 + Node.js 后端(据仓库README) |
| License | MIT(据仓库页面) |
| 首发与维护 | 2020年上半年上线,长期维护至今(据仓库页面) |
| 在线Demo | setwithfriends.com(据仓库README) |
说明:本文数据来自仓库页面与README,本轮调研未能实时联网核对,具体数字请以仓库当前页面为准。
一句话:SET纸牌的线上实时抢答版——一桌人盯着同一片牌海,谁先看出合法组合,谁抢锁、谁得分。
SET本身的规则简单到离谱。整副牌81张,每张牌有四个属性,每个属性三种取值:
三张牌构成一个“set"的条件只有一条:每个属性要么三张全相同,要么三张全不同。不许有“两张一样一张不一样”这种骑墙情况。比如三张牌都是红色(全同)、分别是1、2、3个椭圆(全不同)、条纹(全同)、实心(全不同)——合法。
玩法流程看这个循环图:
flowchart TD
A["开局: 桌面发12张牌"] --> B["全场玩家同时扫桌找set"]
B -->|"有人发现"| C["点击SET键抢锁作答权"]
C --> D["再点选3张牌提交"]
D --> E{"每个属性全同或全不同?"}
E -->|"合法"| F["加1分, 3张撤下, 空位立即补牌"]
E -->|"不合法"| G["扣1分, 冻结数秒, 目送别人抢答"]
F --> B
G --> B
B -->|"全场无人出手"| H["系统判定无set, 自动补3张"]
H --> B
F -->|"81张牌打光"| I["结算: 分数榜 + 各自战果统计"]
I -->|"不服, 再来一局"| A
桌面默认12张,谁觉得看到了set就点SET键锁权,再选三张提交。对了,+1分,三张牌撤下,牌堆立刻补新牌上桌;错了,扣1分并且冻结几秒,眼睁睁看别人把你刚看到的东西抢走。全场卡住没人出手,系统自动补3张。81张打光,结算,看榜,再来。
这个游戏背后的数学很漂亮:81 = 3⁴,全牌一共藏着1080个合法set;任意抽三张,构成set的概率恰好是1/79;而随机发12张,一张set都没有的概率只有约3%(约三十分之一)——所以桌面几乎永远有得找,实在卡死还有补牌机制兜底。顺便一提,桌面无set的牌最多能堆到20张,这是组合数学里“帽集”(cap set)理论的经典结论。一副牌,一座矿。
它的来历也有意思:SET是1974年由研究动物遗传的科学家Marsha Falco发明的——当年她做遗传数据记录时,用符号卡片给牛群做标记,玩着玩着玩出了这套牌,1991年正式商业化发行,如今是欧美数学课堂和桌游柜里的常青树。一个科学家为了记录数据随手画的符号,五十年后还在让全世界抢答——这本身就是“简单机制才长寿”的最佳注脚。
Set with Friends把这套规则搬到了线上,并加上了原版实体牌做不到的东西:实时多人同屏竞速。建个房间生成短码,朋友点链接进来,所有人看同一片桌面,同一时刻开抢。它还带单人练习模式,一个人也能刷。上线后在Hacker News等社区露过脸(据当时社区讨论),四年后网站还在跑——个人项目里,这算活得非常健康的那种。
拆开看,它的每一层钩子都踩在点子上。
第一层:并行搜索的心流陷阱。 找set这件事,大脑要同时追踪四个维度、每个维度三种状态,在12张牌两两之间做“全同/全不同”校验——这几乎是工作记忆满载的强度。它难到让你专注,又没难到让你放弃:答案永远“就在眼前”,你看得到轮廓,就差一下。这种“答案在视野边缘晃”的体验,是解谜游戏里最毒的一种,比数独毒,因为数独要推理,这个只要看见。
第二层:抢答机制把解谜变成了竞技。 单人找set是益智,多人抢set就是肾上腺素。你知道那个组合存在,别人可能也看到了——谁先点SET键谁拿走。“我也看到了,就慢了半秒”的挫败感,是人类最不服气的情绪之一,而“不服”正是“再来一局”的心理学名字。
第三层:错误惩罚轻,但羞辱感重。 答错扣1分、冻结几秒——数值惩罚很小,但冻结的那几秒你是全场唯一动不了的人,别人在继续得分。这种“社会性惩罚”比扣分狠得多,且它激发的不是挫败而是下一局要扳回来。
第四层:零死时间。 答对立刻补牌、卡死自动加3张、牌光立刻结算——整个流程没有一处需要等待加载或倒计时。节奏感是休闲竞技的命,这里没有任何一处给注意力留逃生的缝隙。从开局到结算一轮三五分钟,正好是一次“就玩一把”的心理单位,然后结算页的分数榜直接把你顶进下一把。
第五层:完形快感。 “全同或全不同”本质上是格式塔心理学的完形机制——大脑天然偏爱“整齐的完整模式”。当你眼睛锁定三张牌、四个属性逐一对上、最后一格“咔哒”闭合的那一瞬间,大脑给一小针多巴胺。答对的一秒钟和答错的三秒冻结,一正一负,比单纯的奖励更让人停不下来——间歇性、带竞争压力的即时反馈,是行为设计里反馈强度最高的配方。
把这五层收拢成一句话:规则一分钟学会、一局三五分钟、答案永远近在咫尺、旁边还有人跟你抢。这四件事同时成立的游戏,几乎不可能不好玩。
这个仓库对开发者最大的价值,是它把“实时多人网页游戏”的全部基础设施,用最少代码摆好了。
技术栈(据仓库README):前端 React,后端 Node.js + Express + Socket.IO,仓库带部署配置,npm装完依赖就能本地跑,也能一键架到自己的服务器或PaaS平台上。没有数据库、没有重依赖——这个体量的游戏不需要。
架构上值得抄的三个点:
服务端单一权威状态。 桌面上有哪些牌、谁锁了作答权、分数多少,全部由服务端的状态机维护,客户端只做渲染和输入。这就是为什么它天然防作弊——你本地改内存改不出分。任何带竞技性质的网页游戏,这套“权威服务端 + 事件广播”的模式都是标准答案,仓库里就是一个极简范本。
房间制实时同步。 Socket.IO的房间(room)机制天然契合“短码建房、链接拉人”:建房生成短码,加入者emit进同一个room,服务端广播状态变更。你要做任何多人小游戏——你画我猜、抢答、合作解谜——这层代码几乎可以原样搬走,改动只在游戏规则本身。
核心规则是纯函数。 SET的验证逻辑就是一个小函数:三张牌、四个属性、逐一判断全同或全不同,几百字节搞定。补牌逻辑也简单:扫一遍当前桌面,若无合法set则发3张。“规则引擎极小 + 状态机极简”正是小游戏适合副业开发的原因——游戏性全在机制设计上,工程复杂度被压到了地板。
可直接复用的组件清单:Socket.IO房间管理(建房/加入/断线重连思路)、服务端游戏状态机、React牌桌渲染与点击状态流转、一键部署配置。想练手实时多人开发,把它fork下来跑通再改造,比自己从零搭快一周。
代码量级:这是个周末项目量级的仓库,前端加后端核心逻辑,一个人一到两周完全可以吃透并二改。它同时也是一份很好的“实时多人游戏最小可行架构”教学样本——比任何教程都短,比任何教程都完整。
先说仓库本身:零变现痕迹。没有广告、没有内购、没有赞助链接,setwithfriends.com是纯公益运行,作者自己贴服务器钱。它是那种典型的“因为想和朋友玩而写”的项目,写完顺手开源。
但这个品类周围的商业生态,热得发烫:
这个仓库的位置很微妙:它证明了“SET线上化”有真实需求(四年的自然流量就是证据),但它又故意不商业化——等于把一块被验证过的地,圈好了围墙,没盖房子,留给你。
三个可直接动手的方向,按投入从小到大排。
灵感一:每日SET——一个HTML文件的打卡生意。 把单机找set做成“每日一题”:每天全服同一题,做完生成emoji方块分享图(类似wordle的🟩🟨战报),连击天数存localStorage。纯前端、零后端、一个HTML文件足够,一个周末出MVP。起量靠分享裂变,变现靠网页广告位或直接搬进微信小游戏接平台广告。工作量最小、离钱最近的一条路。要点:换名字换美术,避开商标。
灵感二:汉字SET——换掉四个属性,打进教育市场。 SET的四个属性可以是任何东西:把牌面换成汉字,属性改为部首、笔画数段、声调、结构(左右/上下/包围),一样是81张、一样是全同或全不同。玩家在抢答中重复辨认部首和声调——这是家长和语文老师会主动转发的东西。渠道走小红书/教师社群,变现走itch.io付费下载、教具定制或打赏。工作量2到4周,大头在题库内容设计而非代码。数学老师的版本同样成立:属性换成运算符号和数字区间,就是口算训练器。
灵感三:抢答竞技场——fork原仓库,加一层“人”的生意。 房间制实时同步代码是白送的,你只需要加两样东西:自定义牌组上传(公司logo、团队梗图、产品知识题面),和一个积分周榜。它就从游戏变成了团建工具和直播互动件——主播出题观众抢答、企业培训竞答、年会暖场,全都是付费场景。变现走免费引流+定制服务订阅。工作量:改皮一周内,商务逻辑另计。
三条路的共同底座是同一套代码,可以先做灵感一验证流量,用同一套核心规则往上叠灵感二、三的产品形态——一次开发,三次收钱,这是选机制型游戏最划算的地方。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
