MuelsyseKen/DrawGuess

你画我猜网页版 Draw & Guess Web

★ 0Forks 0JavaScriptGitHub ↗Compare

README

你猜我画(暂命名)

署名:Muelsyse & long_ken & Claude

这是什么

一个本地部署、可通过网页对外访问的多人"你画我猜"类游戏。分两种模式:

  • 竞猜模式:一人上台画画,其他人在聊天框里猜,猜得越早分越高。
  • 接龙模式:所有人同时画自己抽到的词,然后把画传给下一位玩家猜,猜完再基于"猜到的词"接着画下一轮,最后看首尾词是否一致来计分。

一期目标:先做出能跑起来的网页版(本地部署 + 局域网/公网可访问)。不是这一期的目标:Unity 客户端本身(详见下方"关于 Unity")。

技术栈(已确定)

层 选择
前端 Vue3(多页面为主,允许局部做成 SPA)
后端 Node.js + Express
实时通信 Socket.io(房间状态、画板笔迹、聊天、计分广播)
数据库 SQLite(用户账号、历史战绩、排行榜、作画记录)
房间/对局状态 纯内存,服务重启即清空(不追求断线续玩的持久化)

关于 Unity

产品定位是协议先行:房间状态、笔迹数据、词库、计分规则全部走一套清晰的 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 拆分,一个 Phase 一条 Git 分支,原则上也对应一次对话。完整的 Phase 列表和范围见 FULLREADME.md 第9节。简要流程:

  1. 从最新 main 拉出当前 Phase 的分支。
  2. 在这条分支上开发,不直接动 main。
  3. Phase 完成后开 PR,不自行合并,等用户确认后合并。
  4. 下一个 Phase 从更新后的 main 重新拉分支。

协作用的 GitHub Token 仅限本仓库,权限只有 Contents + Pull Requests,具体限制见 Agents.md。

本地开发(Phase 1 起可用)

# 后端
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.sh

start.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 对应章节,再动代码。

Contributors

MuelsyseKenclaude

Issues