开会太无聊?团建没气氛?工位上想摸鱼又怕被抓?这个开源项目,可能是你今年最需要的那一行代码。
一、每个程序员都经历过的社死现场
周一下午三点,会议室。
你和同事们在玩"谁是卧底"。正当你说出那句精心设计的描述——"它经常出现在早餐桌上,但有时候也会出现在深夜"——老板推门进来了。
所有人瞬间收声。手机屏幕亮着,桌上摊着卡片。
"在干嘛?"
"在……讨论技术方案。"
这种尴尬,从此不会再有了。
二、DoubleTake:伪装成系统诊断工具的"谁是卧底"
DoubleTake 是一个用 Go 语言写的命令行版"谁是卧底"。但它的精髓不在于"命令行",而在于一个字——装。
开启 --stealth 模式后,整个游戏界面长这样:
[sysmon] v2.4.1 — diagnostics mode
[session:0000] 输入游戏参数
玩家人数 (4-10): 6
卧底人数 (1-3): 1
白板人数 (0+, 回车默认 0): 0
[session:0000] 房间已创建,房间码: deP6OMsz (等待 6 名玩家加入...)
[session:0000] 小明 joined [1/6]
[session:0000] 人已齐,输入 start 开始游戏
[session:0000] 游戏开始!
[node-00] assigned token: 苹果 [平民]
[node-00] 轮次 1,发言顺序: 小明 → 小红 → 小刚 → 小李 → 小王 → 小张
[node-00] 等待 小明 描述...
谁看了不说一句:这哥们在排查生产环境问题呢?
[sysmon]、[session:]、[node-]、warning: —— 每一个前缀都散发着运维工程师的专注气息。隔壁工位的同事凑过来看一眼,只会默默走开,心想"别打扰他,线上肯定出事了"。
三、怎么玩?三步搞定
第一步:有人当裁判
doubletake --role judge --stealth
裁判负责:
- 设定人数(4-10人)、卧底人数(1-3人)、白板人数
- 把生成的房间码告诉小伙伴们
- 设定平民词语和卧底词语(比如"苹果"和"梨子")
第二步:其他人加入
doubletake --role player --stealth
输入房间码,起个名字,就进去了。
第三步:开杀
游戏自动流转:轮流描述 → 投票淘汰 → 循环往复。直到平民消灭所有卧底,或者卧底反杀成功。
整个过程,你的屏幕上只有冰冷的技术日志。
四、不只是"装"——它真的好玩
别以为这只是个玩具项目。DoubleTake 的游戏机制做得很完整:
PK 机制:平票不将就
投票出现平票?直接进入 PK 环节——平票玩家再次轮流描述,所有人重新投票。没有"算了下一轮吧"的敷衍,每一轮都有交代。
白板玩法:暗夜中的赌徒
白板玩家什么词都没有,全靠听别人的描述来猜。你可以随时输入 guess 苹果 来一发豪赌——猜对了,直接获胜;猜错了,继续装。这种刺激感,其他角色给不了。
断线重连:掉线不掉队
网络波动?没关系。重新连接,输入之前的昵称,游戏状态自动恢复。掉线期间你的发言/投票回合会等你 60 秒。就算你去上了个厕所回来,游戏还在等你。
多局连续打
一局结束?裁判可以选择继续开新一局,不用重新建房间。团建一整个下午,一个 doubletake 进程就够了。
五、技术人会爱上的细节
作为一个开源项目,DoubleTake 在技术实现上也有不少值得玩味的地方:
纯 Go 实现:零依赖(除了标准库),编译出来就是一个二进制文件。Windows、macOS、Linux 全平台覆盖。go build 一下就完事。
TCP 长连接:裁判端和玩家端之间通过 TCP 保持长连接,消息实时推送,没有轮询延迟。
房间码编码:IP 地址 + 端口号经过 Base62 编码,生成一个短字符串作为房间码。比如 192.168.1.100:8127 会被编码成 deP6OMsz 这样的 8 位码,方便口头传达。
完整的协议设计:JOIN、ROLE、ROUND、TURN、DESC、VOTE、RESULT、WIN、PK_START、RECONNECT……十几种消息类型,覆盖了游戏的所有状态流转。
游戏实现的秘密
实际上,这个游戏安全是 AI生成的, 人类没有写一行代码,你可以在github上追踪这个游戏从零开始如何实现的。
不止于此,甚至连需求文档都是 AI 生成的。整个项目从设计到任务拆解到实现,都是在 AI 的指导下完成的。
开局就是一个Story,从网上找的《我是卧底》的游戏规则。然后使用autoresearch的 /prd skill 生成了一个详细的需求文档(就是上面那个规则说明)。
接着又使用 /prd 基于这个需求文档拆解成features,并在github上创建相应的issues。
你可以围观这些issues,里面详细描述了此功能和验收标准:
然后 autoresearch 花了一天一夜的时间,动用了三个编码智能体和三家的模型服务,完成了每一个issue的开发:
- claude code/mimo-v2.5-pro: 小米赠送了 2 亿token,但是这一天已用了73%,不禁用呀
- codex:智谱5.1 lite套餐
- opencode: opencode go套餐
每个游戏的issue完成后autoresearch都会自动加上实现摘要:
六、真实使用场景(认真的)
场景一:公司团建
HR 组织团建,大家围坐一圈。掏出终端,doubletake --role judge,三十秒开局。不用下载 App,不用扫码注册,不用关注公众号。
场景二:技术社群线下聚会
一群 Go 开发者 meetup 完了想玩点什么。有人提议"谁是卧底",然后有人说"等等,我有个好东西"。
场景三:远程会议间隙
Zoom 开会太无聊?同事之间开一局。反正大家都是对着屏幕打字,和正常工作毫无区别。
场景四:真的在摸鱼
工位上,四五个同事各自开着终端。老板巡视时,所有人屏幕上都是 [sysmon] v2.4.1 — diagnostics mode。老板满意地点点头:"这帮人真敬业。"
七、快速上手
安装
直接去 Releases 页面下载对应平台的二进制文件。
或者从源码编译:
git clone https://github.com/smallnest/DoubleTake.git
cd DoubleTake
make build
需要 Go 1.26.2+。
开一局试试
# 终端 1:裁判
./doubletake --role judge --stealth
# 终端 2-N:玩家(用裁判给的房间码)
./doubletake --role player --stealth
八、最后说两句
"谁是卧底"是一款已经有十多年历史的桌游,从线下火到线上,从实体卡片火到手机 App。但 DoubleTake 给了它一个新的打开方式——把它藏在程序员最熟悉的界面里。
这不仅仅是一个游戏项目。它是一种态度:
工作要认真,摸鱼也要认真。
Star 一下,下次团建用得上。