署名:Muelsyse & long_ken & Claude
一个本地部署、可通过网页对外访问的多人"你画我猜"类游戏。分两种模式:
- 竞猜模式:一人上台画画,其他人在聊天框里猜,猜得越早分越高。
- 接龙模式:所有人同时画自己抽到的词,然后把画传给下一位玩家猜,猜完再基于"猜到的词"接着画下一轮,最后看首尾词是否一致来计分。
一期目标:先做出能跑起来的网页版(本地部署 + 局域网/公网可访问)。不是这一期的目标:Unity 客户端本身(详见下方"关于 Unity")。
| 层 | 选择 |
|---|---|
| 前端 | Vue3(多页面为主,允许局部做成 SPA) |
| 后端 | Node.js + Express |
| 实时通信 | Socket.io(房间状态、画板笔迹、聊天、计分广播) |
| 数据库 | SQLite(用户账号、历史战绩、排行榜、作画记录) |
| 房间/对局状态 | 纯内存,服务重启即清空(不追求断线续玩的持久化) |
产品定位是协议先行:房间状态、笔迹数据、词库、计分规则全部走一套清晰的 JSON 消息协议(Socket.io 事件)。现阶段不需要为 Unity 做任何额外的解耦或抽象层——把协议设计干净、有版本感即可,以后如果真的要做 Unity 客户端,可以照着协议重新实现一套 UI。当前网页版做完后大概率不会有人接着做 Unity 版,所以不要为了"可能用不到的将来"过度设计。
画板底层必须按"笔迹矢量序列"存储(每一笔的坐标序列 + 颜色 + 粗细 + 时间戳),而不是只存最终 PNG。这样数据量很小,且为将来做"作画回放"功能留好了口子。一期 UI 可以不做回放播放器,但数据结构要按这个来设计,不要偷懒存位图。
README.md(本文件)——粗略介绍 + 交接文档,每次交接给下一个对话/下一个 AI 前更新。Agents.md——协作 AI(可能是 Claude / Deepseek / Gemini 等)必须遵守的规则,开发前必读。FULLREADME.md——完整文档:架构、数据模型、页面结构、协议设计、部署方式,随开发增减,只留必要内容。HISTORY.md——开发历史、踩坑记录,只增不减。ISSUES.md——未解决的问题、待验证事项、已知取舍(活清单,解决后删除并在HISTORY.md记一笔)。
开发按 Phase 拆分,一个 Phase 一条 Git 分支,原则上也对应一次对话。完整的 Phase 列表和范围见 FULLREADME.md 第9节。简要流程:
- 从最新
main拉出当前 Phase 的分支。 - 在这条分支上开发,不直接动
main。 - Phase 完成后开 PR,不自行合并,等用户确认后合并。
- 下一个 Phase 从更新后的
main重新拉分支。
协作用的 GitHub Token 仅限本仓库,权限只有 Contents + Pull Requests,具体限制见 Agents.md。
# 后端
cd backend
cp .env.example .env
npm install
npm run dev # http://localhost:3000
# 前端(另开一个终端)
cd frontend
cp .env.example .env
npm install
npm run dev # http://localhost:5173后端提供 /api/auth/register、/api/auth/login、/api/auth/logout、/api/auth/me 四个账号相关接口,前端大厅页(/)已接入登录/注册弹窗。
日常开发用上面两个 npm run dev 就行;真要把游戏跑起来给别人连(比如同一局域网内几个人用手机/电脑打开网页玩),用这个:
# 第一次部署:先准备后端配置
cp backend/.env.example backend/.env
# 至少改两处:NODE_ENV=production;JWT_SECRET 换成一个随机字符串
#(这两项不满足后端会直接拒绝启动,是有意为之的安全检查,见 ISSUES.md #1)
./scripts/start.shstart.sh 会自动装依赖、构建前端(产物 frontend/dist)、然后用生产模式启动后端,后端顺带把前端静态文件也托管了——局域网/公网访问只需要暴露后端这一个端口(默认 3000),不用额外起 Nginx。脚本结束前会打印出局域网 IP,同一局域网内其他设备用 http://<那个IP>:3000 访问即可(不要用 localhost,那在别的设备上指向的是它自己)。
只改了后端代码、前端没变的话,可以用 ./scripts/start.sh --skip-build 跳过重新构建前端,启动更快。
Windows 请在 Git Bash 里运行脚本(脚本已处理 Git Bash 的路径转换问题;PowerShell/cmd 原生不支持 .sh)。
这套单端口部署只解决"局域网内跑起来";如果要暴露到公网,路由器端口转发/防火墙/要不要上 HTTPS 反代等需要自行评估,脚本不处理这些。
Phase 1~7 全部完成并已合并到 main(FULLREADME.md 第9节所列范围已全部交付),已实机部署并完成一轮 Gemini/Deepseek 交叉审查与修复。
- 两种玩法(竞猜 / 接龙)、房间系统、画板引擎、战绩/排行榜/作画记录、响应式适配、单端口部署脚本均已可用。
- 未解决的问题、待验证事项、已知取舍 → 见
ISSUES.md。 - 各阶段的架构决定、踩坑与修复过程 → 见
HISTORY.md。 - 协议与设计细节 → 见
FULLREADME.md;安全问题跟踪在ISSUES.md。
之后如果继续开发,按"读文档 → 从最新 main 拉分支 → 开发 → 真实测试 → PR(不自行合并)"的流程走,范围以用户在对话里给出的为准。
- 每次 Phase 阶段性完成或切换后,更新本文件的"当前进度"部分(保持简短,细节进
HISTORY.md);发现的新问题/待验证事项写进ISSUES.md,不要堆在本文件里。 - 任何架构性决定(哪怕是"确认沿用之前的方案")都写进
HISTORY.md,不要只在对话里口头确认。 - 涉及需求变更时,先改
FULLREADME.md对应章节,再动代码。