# PoetryGame **Repository Path**: KEDIT/PoetryGame ## Basic Information - **Project Name**: PoetryGame - **Description**: A simple poetry game that is completely AI-generated. - **Primary Language**: CSS - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-08-08 - **Last Updated**: 2025-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 古诗词接龙联机版 这是一个基于 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 ``` ## 安装与运行 ### 1. 环境准备 确保你的电脑上已经安装了 [Node.js](https://nodejs.org/) (推荐 LTS 版本)。 ### 2. 安装依赖 在项目根目录下,打开终端并运行以下命令来安装项目所需的所有依赖库: ```bash npm install ``` 这将会安装 `express`, `socket.io`, `body-parser`, `cookie-parser`, 和 `express-session`。 ### 3. 首次运行与管理员设置 第一次运行服务器前,需要设置管理员密码。运行以下命令启动服务器: ```bash node setup.js ``` 此时,**请查看你的终端**,会看到类似 `请设置管理员密码:` 的提示。在终端中输入你的密码并按回车。密码将被加盐哈希后保存在 `data/admin.json` 文件中,之后启动将不再需要此步骤。 ### 4. 启动服务器 设置完密码或之后再启动服务器,只需运行: ```bash node server.js ``` 当你在终端看到 `服务器正在端口 3000 上运行` 的提示时,说明服务器已成功启动。 ### 5. 开始游戏 打开你的网络浏览器 (推荐 Chrome 或 Firefox),访问以下地址: [http://localhost:3000](http://localhost:3000) 你将看到游戏大厅。你可以: - **创建新房间**: 点击按钮,输入你的昵称,即可创建一个拥有随机ID的新房间。 - **加入房间**: 点击房间列表中的“加入”按钮,输入你的昵称,即可加入一个已存在的房间。 - **通过URL加入**: 将一个房间的链接 (例如 `http://localhost:3000/room/ABCD`) 分享给朋友,他们可以通过该链接直接尝试加入你的房间。 ## 部署 推荐使用云服务器 (VPS) 进行公网部署,配合 PM2 和 Nginx 以获得最佳效果。 1. **服务器**: 购买一台云服务器(如阿里云/腾讯云),选择 Ubuntu 等主流 Linux 发行版。 2. **环境**: 在服务器上安装 Node.js, npm, 和 Git。 3. **代码**: 将项目代码上传到服务器。 4. **进程守护**: 使用 `pm2` 来启动并守护 `server.js` 进程,确保服务在后台持续运行并在崩溃后自动重启。 ```bash npm install pm2 -g pm2 start server.js --name poetry-game ``` 5. **反向代理 (推荐)**: 使用 `Nginx` 作为反向代理,将来自 80 端口 (HTTP) 的请求转发到 Node.js 应用的 3000 端口。这对于配置域名和未来的 HTTPS 至关重要。**注意**:配置 Nginx 时,必须正确设置 `Upgrade` 和 `Connection` 头,以确保 WebSocket (Socket.IO) 能够正常工作。 ## 后台管理功能 访问 `http://localhost:3000/admin` 进入后台管理页面。 1. **登录**: 输入您在首次运行时设置的管理员密码。 2. **房间管理**: - 查看所有当前存在的房间及其在线人数。 - **永久存在**: 勾选此项,可使房间在无人时也不会被服务器自动销毁。永久房间内的玩家也不会因长时间离线而被踢出。 - **管理玩家**: 查看房间内的所有玩家(包括离线玩家),并可以强制将某个玩家从房间中移除。 - **删除**: 强制删除一个房间,房间内的所有玩家将被断开连接。 3. **诗句缓存管理**: - **搜索**: 实时搜索已缓存的正确诗句。 - **添加**: 添加新的正确诗句到缓存中。 - **删除**: 从缓存中移除某个诗句。 ## 游戏规则概览 1. **进入大厅**: 玩家首先进入游戏大厅,可以查看、创建或加入房间。 2. **开始游戏**: 房间内至少需要2名玩家才能开始游戏。游戏开始后,系统会给出一个起始字。 3. **回答**: 玩家需要根据当前的起始字,在输入框中输入一句不含标点符号的古诗词。 4. **提交与排队**: - 每个玩家在队列中最多只能有一个待验证的答案。 - 所有提交的答案会进入一个验证队列,系统会按顺序处理。一旦队列中有一个答案被确认为正确,该轮抢答结束,队列将被清空。 5. **验证与投票**: - 系统会先检查答案是否在“已验证诗句”的缓存中。 - 如果不在,该诗句将交由房间内除提交者外的所有其他玩家进行投票。 - 投票限时15秒,超时或掉线默认计为**赞同**。 - 当赞同票数**严格多于**反对票数时,诗句被确认为有效。 6. **得分与新回合**: - 回答正确的玩家获得一分。 - 该玩家将获得从他回答的诗句中选择一个新的起始字的权利。 - 选定新字后,新一轮开始。 7. **撤回**: 玩家可以随时撤回自己提交的答案,即使它正在被投票。如果撤回的是正在投票的答案,该次投票将立即中断。