这是一个基于 Node.js 和 Socket.IO 构建的网页版多人实时联机古诗词接龙游戏。
- 实时联机: 与朋友们在同一个房间里实时对战。
- 房间系统: 创建或加入游戏房间,每个房间的游戏进程完全独立。
- URL路由: 每个房间都有专属链接 (e.g.,
/room/ABCD),方便分享和重连。 - 断线重连: 刷新页面或短暂断开网络后,可以自动返回之前的游戏。
- 民主投票: 诗句的有效性由房间内除提交者外的所有玩家共同投票决定,超时或掉线默认计为赞同。
- 非阻塞验证队列: 玩家可以随时提交答案进入等待队列,系统会自动、依次处理,不会因为一次投票而阻塞所有人的输入。
- 灵活撤回: 玩家可以随时撤回自己提交的、尚未被确认的答案,即使该答案正在被投票。
- 数据持久化: 房间状态和已验证的诗句会被保存在服务器本地,重启服务器后游戏可以继续。
- 后台管理: 提供一个密码保护的后台页面,用于管理房间、玩家和诗句缓存。
- 永久房间: 管理员可以将特定房间设置为“永久”,即使房间内没有玩家也不会被销毁。
- 前端:
- HTML5
- CSS3
- JavaScript (ES6+)
- 后端:
- Node.js
- Express.js (用于提供静态文件和路由)
- Socket.IO (用于实现实时双向通信)
- Express Session, Cookie Parser, Body Parser (用于后台管理身份验证)
- 数据存储:
- 本地 JSON 文件 (用于持久化房间、诗句缓存和管理员配置)
.
├── data/ # 存储持久化数据
│ ├── admin.json # 存储管理员密码的盐和哈希值
│ ├── rooms.json # 存储所有房间的状态
│ └── valid_sentences.json # 存储所有已被确认为有效的诗句
├── public/ # 存放所有客户端静态文件
│ ├── index.html # 游戏主页面HTML
│ ├── style.css # 游戏页面样式
│ ├── client.js # 游戏客户端逻辑
│ ├── admin.html # 后台管理页面HTML
│ ├── admin.css # 后台管理页面样式
│ └── admin.js # 后台管理客户端逻辑
├── server.js # 后端主程序
├── package.json
└── README.md
确保你的电脑上已经安装了 Node.js (推荐 LTS 版本)。
在项目根目录下,打开终端并运行以下命令来安装项目所需的所有依赖库:
npm install这将会安装 express, socket.io, body-parser, cookie-parser, 和 express-session。
第一次运行服务器前,需要设置管理员密码。运行以下命令启动服务器:
node setup.js此时,请查看你的终端,会看到类似 请设置管理员密码: 的提示。在终端中输入你的密码并按回车。密码将被加盐哈希后保存在 data/admin.json 文件中,之后启动将不再需要此步骤。
设置完密码或之后再启动服务器,只需运行:
node server.js当你在终端看到 服务器正在端口 3000 上运行 的提示时,说明服务器已成功启动。
打开你的网络浏览器 (推荐 Chrome 或 Firefox),访问以下地址:
你将看到游戏大厅。你可以:
- 创建新房间: 点击按钮,输入你的昵称,即可创建一个拥有随机ID的新房间。
- 加入房间: 点击房间列表中的“加入”按钮,输入你的昵称,即可加入一个已存在的房间。
- 通过URL加入: 将一个房间的链接 (例如
http://localhost:3000/room/ABCD) 分享给朋友,他们可以通过该链接直接尝试加入你的房间。
推荐使用云服务器 (VPS) 进行公网部署,配合 PM2 和 Nginx 以获得最佳效果。
- 服务器: 购买一台云服务器(如阿里云/腾讯云),选择 Ubuntu 等主流 Linux 发行版。
- 环境: 在服务器上安装 Node.js, npm, 和 Git。
- 代码: 将项目代码上传到服务器。
- 进程守护: 使用
pm2来启动并守护server.js进程,确保服务在后台持续运行并在崩溃后自动重启。npm install pm2 -g pm2 start server.js --name poetry-game
- 反向代理 (推荐): 使用
Nginx作为反向代理,将来自 80 端口 (HTTP) 的请求转发到 Node.js 应用的 3000 端口。这对于配置域名和未来的 HTTPS 至关重要。注意:配置 Nginx 时,必须正确设置Upgrade和Connection头,以确保 WebSocket (Socket.IO) 能够正常工作。
访问 http://localhost:3000/admin 进入后台管理页面。
- 登录: 输入您在首次运行时设置的管理员密码。
- 房间管理:
- 查看所有当前存在的房间及其在线人数。
- 永久存在: 勾选此项,可使房间在无人时也不会被服务器自动销毁。永久房间内的玩家也不会因长时间离线而被踢出。
- 管理玩家: 查看房间内的所有玩家(包括离线玩家),并可以强制将某个玩家从房间中移除。
- 删除: 强制删除一个房间,房间内的所有玩家将被断开连接。
- 诗句缓存管理:
- 搜索: 实时搜索已缓存的正确诗句。
- 添加: 添加新的正确诗句到缓存中。
- 删除: 从缓存中移除某个诗句。
- 进入大厅: 玩家首先进入游戏大厅,可以查看、创建或加入房间。
- 开始游戏: 房间内至少需要2名玩家才能开始游戏。游戏开始后,系统会给出一个起始字。
- 回答: 玩家需要根据当前的起始字,在输入框中输入一句不含标点符号的古诗词。
- 提交与排队:
- 每个玩家在队列中最多只能有一个待验证的答案。
- 所有提交的答案会进入一个验证队列,系统会按顺序处理。一旦队列中有一个答案被确认为正确,该轮抢答结束,队列将被清空。
- 验证与投票:
- 系统会先检查答案是否在“已验证诗句”的缓存中。
- 如果不在,该诗句将交由房间内除提交者外的所有其他玩家进行投票。
- 投票限时15秒,超时或掉线默认计为赞同。
- 当赞同票数严格多于反对票数时,诗句被确认为有效。
- 得分与新回合:
- 回答正确的玩家获得一分。
- 该玩家将获得从他回答的诗句中选择一个新的起始字的权利。
- 选定新字后,新一轮开始。
- 撤回: 玩家可以随时撤回自己提交的答案,即使它正在被投票。如果撤回的是正在投票的答案,该次投票将立即中断。