English · 中文
Roundtable 是一款在浏览器里玩的桌游,主题是「用 AI 做软件产品」。2 到 4 名玩家各自起一个想做的产品名,抽一手策略卡牌,比拼谁能在「演示日(Demo Day)」交付出最有说服力的产品。每交付一个功能,房主端的 AI 就会把它构建成一个真实可用的手机 App,可以直接打开使用。
它的体验像一局牌局,而不是一张表单:对手坐在桌子对面、手里攥着扣着的牌,中间一块共享牌桌实时显示每个产品的进度,旁边的日志讲述刚刚发生了什么。
可以联机玩——一人开房,其他人用 5 位房间号在各自的手机上加入、各看各的手牌——也可以在同一块屏幕上轮流传着玩。
- 一起联机玩。 开一局游戏,分享 5 位房间号,朋友们就能在世界各地用自己的设备加入。服务器是权威方,每个人的手牌都对别人保密;牌桌通过轻量轮询实时更新,可以穿透任何隧道或代理。
- 任意输入产品。 产品创意是自由文本——画图、记账、单词卡,什么都行。没有预设菜单;短中文创意(如「画图」)也支持。
- 真正的牌桌。 对手展示成扇形的扣牌;你的手牌在底部正面朝上;点一张牌它会放大弹出,连同完整说明一起展示,方便你看清再出牌。
- 交付成真实 App。 打出新功能卡来添加一个具体功能;在这一回合结束时,系统会把你已积累的功能构建成一个真正能用、自包含的手机 App——真的画板、真的卡片——并实时托管,任何人都能打开。
- 创始人称号。 演示日会根据你的打法,给每位玩家颁发一个略带调侃的称号——卷王、套现离场、保守派……每个都配有与卡牌同款风格的徽章插画。
- 数据驱动的卡牌。 卡牌规则、文案和美术都定义在数据与资源文件里,牌库很容易扩展。
任何一个「交付了功能」的回合,都会把你的产品编译成一个自包含的手机 App——一个单文件 HTML,作为真正可用的应用运行(画布、表单、本地存储),外观仿原生移动界面,并自动适配 iOS 或 Android。房主会实时托管每位玩家的 App,所以你只需点打开应用即可使用或分享,无需下载。
- 房主打开应用,填写昵称和一个具体的产品创意,创建游戏。其他人打开同一网址、用房间号加入(或在一台设备上轮流玩)。泛泛的占位词和「和 Roundtable 自身有关」的创意会被拒绝。
- 在大厅里房主开始游戏——每位玩家发到 5 张私密手牌,且必有至少一张「新功能」。
- 轮到你时,打出一张牌(点击放大,再点出牌),需要目标的卡牌请选择目标。
- 如果这一回合你提交了一个功能,结束回合会花费一些点数并在后台构建你的 App。只打策略牌、或不出牌的回合不会触发构建。
- 七个回合后进入演示日:为所有人结算分数、颁发创始人称号,并托管每个做好的 App。
共 5 张牌,定义在 public/data/cards.json(含中英文案),美术在 public/assets/cards/。
| 卡牌 | 费用 | 目标 | 效果 |
|---|---|---|---|
| 新功能 (New Feature) | 1 | 自己 | 添加一个具体功能——自行输入,或从灵感池中选取。这是壮大 App 的唯一途径,且必定出现在开局手牌里。 |
| 用户反馈 (User Feedback) | 1 | 自己 | 为你的灵感池添加一个与产品相关的功能点子,供之后的「新功能」使用。 |
| 收购功能 (Acquire Feature) | 2 | 他人 | 从另一位玩家那里夺取一个已交付的功能(它会从对方产品中消失)。 |
| 顾问 (Consultant) | 0 | 他人 | 向对手提供有偿咨询;若对方接受,他们付你点数,你则为他们的产品添加一个功能点子。 |
| 云额度 (Cloud Credits) | 0 | 自己 | 为后续构建储备赞助点数。 |
每个产品在牌桌上显示三个数字:
- 进度(0–100%)——只有在构建时才上升。每次构建增加
clamp(20 + 投入点数 × 5, 6, 45)。 - 已交付——产品中的功能数量。
- 点数——剩余的可支配点数(
上限 − 已花 + 赚取)。
演示日:
得分 = 进度 + 已交付 × 8 + min(10, 剩余点数)
……并根据同样这几项给每位玩家颁发一个创始人称号:
| 称号 | 获得条件 |
|---|---|
| 卷王 (The Machine) | 交付功能最多 |
| 收官大师 (The Finisher) | 进度达到 100% |
| 孤注一掷 (All-In) | 有交付,且把点数花得一干二净 |
| 精打细算 (Lean Founder) | 有交付,同时保留了至少一半预算 |
| 稳健创业者 (Steady Builder) | 均衡的中间派 |
| 保守派 (The Conservative) | 什么都没交付,守着开局预算 |
| 套现离场 (Cashed Out) | 什么都没交付,却赚到超过了开局预算 |
- 点数上限——你的初始预算(默认 16),也是你愿意花的上限。
- 赚取点数——来自顾问的报酬和云额度卡;会先于你的上限被花掉,让你不抬高上限也能继续构建。
- 回合花费——一次构建会把你剩余的点数,按剩余回合数平均分摊后花掉一份。
- AI 令牌预算——1 点数对应 800 个模型输出令牌上限;一次构建的 App 可用
回合花费 × 800个令牌。付费的 AI 功能建议每次花费 1 点数。
需要 Node.js 20+。
npm start然后打开终端打印的网址(默认 http://localhost:5173)。
每次功能构建都由房主配置的模型生成——玩家无需任何密钥,因为构建跑在房主的服务器上。什么都不配置时,内置的离线构建器会生成一个基础 App(无需密钥、零配置)。想构建更丰富、真正能用的 App,把 .env.example 复制为 .env,并设置一个 OpenAI 兼容的来源:
本地模型——免费、私密、无需密钥(Ollama / LM Studio / llama.cpp):
AI_API_BASE=http://localhost:11434/v1
AI_MODEL=qwen2.5-coder:7b云端密钥——任意 OpenAI 兼容服务,由房主付费(示例:通过 Anthropic 的 OpenAI 兼容端点调用 Claude):
AI_API_BASE=https://api.anthropic.com/v1
AI_MODEL=claude-sonnet-4-5
AI_API_KEY=sk-ant-...设置 AI_API_BASE/AI_API_KEY 即可开启 AI 构建器;服务器启动时会打印当前模式,GET /api/health 也会以 aiMode 字段报告。
一台机器用 npm start 跑服务器,其他人在浏览器里连进来对战。没有账号——玩家靠房间号这一「每局共享的口令」来认证,所以你只需把网址和房间号给到你邀请的人即可。
-
开一局。 启动服务器、创建游戏,把 5 位房间号(例如
EDLE7)发给你想邀请的玩家。 -
让服务器可达。 同一 Wi-Fi 下,分享你机器的
http://<局域网IP>:5173。要跨互联网玩,就在本地服务器前加一条隧道,改为分享隧道网址:cloudflared tunnel --url http://localhost:5173 # Cloudflare 快速隧道 # 或 ngrok http 5173
两者都会打印一个
https://…网址,且无需在路由器上开放端口。把该网址和房间号一起发给玩家。 -
加入。 远程玩家打开网址、填写昵称和产品创意、输入房间号即可加入。房主会在大厅看到他们出现,并可在开始前移除任何人。
分享邀请链接可预填房间号、昵称和产品(?code=EDLE7&name=…&product=…);链接里的房间号始终优先于本地的旧会话,所以新邀请绝不会把你又带回旧房间。
安全模型。 房间号就是共享口令——请当作密码对待。房间号来自很大的随机空间,且每个连接的加入尝试都有限流,因此基本无法被猜出。只有房主能开始或踢人。游戏只存在内存中,闲置数小时后即被丢弃;提交的文本有长度限制并经过清洗。它面向你邀请的熟人之间的友好对局,而非加固过的公共服务——只把隧道网址分享给你信任的玩家,玩完就关掉隧道。
public/ 提供给浏览器的静态客户端
index.html 联机入口(首页 / 大厅 / 实时牌桌)
online.js 联机客户端:开房/加入、大厅、轮询驱动的牌桌
local.html 单设备「轮流传玩」入口
app.js 轮流传玩的游戏逻辑与渲染
styles.css 首页、牌桌、卡牌、大厅、结算及响应式样式
data/cards.json 卡牌定义与中英文策略文案
assets/cards/ 卡牌美术(每张牌一个 PNG)
assets/awards/ 创始人称号徽章美术
server/
index.js HTTP 服务器:静态文件(gzip)、房间路由、托管 App
engine.js 权威游戏引擎、计分、称号评定、按玩家脱敏的视图
rooms.js 内存中的房间、房间号、轮询/在线状态、构建编排
build.js AI / 离线手机 App 构建器与功能建议
scripts/
screenshot.mjs 重新生成 README 里的牌桌截图
docs/ 本 README 使用的截图
联机游戏是服务器权威的:客户端发送意图(出牌、结束回合),渲染一份通过短轮询拉取的脱敏视图——这比会被隧道缓冲的 Server-Sent Events 更稳——所以玩家永远只会收到自己的手牌。
npm run check # 对客户端与服务器做语法检查
npm run screenshot # 从运行中的应用重新生成 docs/screenshot.pngnpm run screenshot 会启动服务器,在无头 Chrome 中驱动一局简短的演示对局并截取牌桌。它需要安装 Google Chrome 或 Chromium;若安装在非标准位置,请设置 CHROME_PATH。
基于 MIT 许可证 发布。© 2026 Ziwei Zhu。


