Skip to content

Repository files navigation

🎨 你画我猜 · 多人在线白板游戏

一个类似 Skribbl.io 的网页版「你画我猜」游戏。玩家通过房间码加入同一个房间,轮流当画手作画,其他人在聊天框打字猜词,根据速度计分,多轮后决出胜负。支持手机和电脑浏览器,可部署到公网让朋友通过链接加入。

状态 Node License

✨ 功能特性

  • 🎮 完整游戏循环:大厅 → 选词 → 作画猜词 → 轮次结算 → 排行榜,3 轮分胜负
  • 🖌️ 实时绘画同步:画手的笔画实时广播给所有玩家,支持鼠标和触屏
  • 🌈 绘画工具:12 色调色板、3 档笔刷、橡皮擦、一键清空
  • 💬 聊天 + 猜词:所有人可聊天;猜对自动识别并加分,不透露答案
  • ⏱️ 倒计时 & 提示:作画限时 80 秒;半程后给猜词者显示首字提示
  • 🏆 动态计分:越早猜对得分越高;画手每有人猜对也得分
  • 🔗 房间码邀请:4 位房间码,点击复制分享链接
  • 📱 移动端适配:响应式布局,手机也能玩
  • 🔌 断线自动重连:基于 Socket.io,刷新/掉线可重新加入并恢复画布
  • 📦 零数据库:数据全在内存,单进程即可运行,部署极简

🚀 快速开始

环境要求

  • Node.js ≥ 18(推荐 20 LTS 或更新)—— 下载地址

本地运行

# 1. 安装依赖
npm install

# 2. 启动服务器
npm start

# 3. 打开浏览器访问
#    http://localhost:3000

打开多个浏览器标签页(或让朋友用同一局域网的设备访问 http://<你的IP>:3000),创建房间后把房间码分享出去即可开玩。

开发模式(文件改动自动重启)

npm run dev

🎯 玩法说明

  1. 创建房间:输入昵称 → 创建房间 → 获得 4 位房间码
  2. 邀请朋友:点击房间码复制邀请链接,朋友打开链接输入昵称即可加入(2-8 人)
  3. 开始游戏:房主点击「开始游戏」
  4. 轮流作画
    • 被选中的画手从 3 个词中选一个,限时 15 秒
    • 画手用工具栏作画,限时 80 秒
    • 其他人在右侧输入框打字猜词
  5. 计分:越早猜对分越高(基础 50 + 剩余秒数×2);画手每有一人猜对加 40 分
  6. 决出胜负:所有人各画 3 轮(默认)后,按总分排名

🛠️ 技术栈

技术 说明
运行时 Node.js 服务端 JavaScript
HTTP 服务 Express 托管静态资源
实时通信 Socket.io 房间/广播/断线重连
前端 原生 HTML/CSS/JS 零构建,Canvas API 绘画
数据 内存 无数据库,进程重启即清空

📁 项目结构

tyagame/
├── server.js                 # 入口
├── src/
│   ├── server.js             # Express + Socket.io 配置
│   ├── socketHandler.js      # 实时事件处理(timer 管理在此)
│   ├── rooms.js              # 房间管理器
│   └── game/
│       ├── Game.js           # 房间游戏状态机(纯状态转换)
│       ├── Player.js         # 玩家模型
│       └── words.js          # 中文词库
├── public/                   # 前端(浏览器加载)
│   ├── index.html            # 首页(创建/加入房间)
│   ├── room.html             # 游戏房间页
│   ├── css/
│   │   ├── common.css        # 全局样式
│   │   └── game.css          # 游戏页样式
│   └── js/
│       ├── landing.js        # 首页逻辑
│       ├── game.js           # 房间主逻辑(UI 状态协调)
│       ├── canvas.js         # 画布绘制 + 网络同步
│       └── chat.js           # 聊天/猜词面板
├── test/
│   └── e2e.js                # 端到端冒烟测试
└── package.json

☁️ 部署到公网

本项目是单进程 Node 应用,任何支持 Node 的平台都能部署。

方式一:Render(推荐,最简单)

  1. 把代码推到 GitHub 仓库
  2. render.com 新建 Web Service,连接仓库
  3. 配置:
    • Build Command: npm install
    • Start Command: npm start
  4. 部署完成后获得 https://你的应用.onrender.com,分享给朋友即可

方式二:Railway / Fly.io

流程类似,参考各平台 Node.js 部署文档。

方式三:VPS(自有服务器)

# 服务器上
git clone <你的仓库>
cd tyagame
npm install --production
PORT=80 npm start

建议配合 nginx 反向代理 + pm2 守护进程 + HTTPS 证书。

环境变量

变量 默认值 说明
PORT 3000 服务监听端口(部署平台通常会自动注入)

🧪 测试

# 先启动服务器
npm start

# 另开终端运行端到端测试(模拟 2 个玩家走完整局)
node test/e2e.js

测试会验证:创建/加入房间、选词、作画、绘画同步、猜对、计分、游戏结束等核心环节。

⚙️ 自定义配置

修改 src/game/Game.js 顶部的常量:

const TIMING = {
  SELECTING: 15,   // 选词限时(秒)
  DRAWING: 80,     // 作画限时(秒)
  ROUND_END: 5,    // 轮次结算展示(秒)
};

const SCORE = {
  GUESSER_BASE: 50,   // 猜对基础分
  GUESSER_TIME: 2,    // 每剩余 1 秒额外加分
  DRAWER_PER: 40,     // 画手每有人猜对得分
};

this.maxRounds = 3;  // 在 Game 构造函数里改轮数

修改词库:编辑 src/game/words.js,按 easy / medium / hard 分类添加。

🔧 常见问题

Q: 朋友无法加入?

  • 确认房间码正确(4 位,不区分大小写)
  • 本地开发时,朋友需和你在同一局域网,且用你的内网 IP(不是 localhost)
  • 公网部署后,直接分享邀请链接最方便

Q: 画的东西别人看不到?

  • 只有当前画手能画;确认你是画手(玩家列表里有「画」标记)
  • 检查网络连接,Socket.io 会自动重连

Q: 能多少人玩?

  • 建议 2-8 人。代码限制单房间最多 8 人。

📝 后续可扩展

  • 自定义词库 / 玩家上传词包
  • 自定义回合数、时长的房间设置
  • 头像上传
  • 排行榜持久化(加数据库)
  • TypeScript 重构
  • Redis adapter 支持多实例横向扩展

📄 License

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages