欢迎文末添加好友交流,共同进步!
一、项目介绍
本项目是实现一个网页版的五子棋对战游戏,玩家通过浏览器即可进行实时对弈。项目采用C++ 后端 + HTML / JS 前端的架构,后端使用 WebSocket 协议实现双向实时通信。
接下来让我们一起开始学习此项目!!!
核心功能
- 用户管理:用户注册、用户登录、获取用户信息、天梯分数记录、比赛场次记录
- 匹配对战:两个玩家根据天梯分数匹配对手,进行五子棋游戏对战
- 聊天功能:两个玩家在下棋的同时可以进行实时聊天
二、项目演示
2.1 用户界面(前端)
玩家通过浏览器进行注册登录、匹配对手、五子棋对战、实时聊天。
注册失败,登录失败,游戏完毕都会返回响应的注册页面,登录页面以及环境大厅页面。
2.2 后端界面(服务器)
服务器运行在 Linux 上,处理 WebSocket 连接、匹配、对局逻辑。
- 服务端收到用户的注册请求后,对请求信息进行校验,校验通过后将用户的账号、密码等信息存储到用户数据库中进行统一管理,注册成功后数据库才会留存该用户的有效信息。
- 服务端收到用户的登录请求后,在用户数据库中验证用户账号是否存在、密码是否正确;验证通过则登录成功,为该用户创建专属会话管理,会话管理作为用户的在线身份凭证与游戏通信桥梁,用于后续全流程的身份校验与连接绑定,登录成功后才会为用户分配客户端会话。
- 用户进入游戏大厅页面后,向服务端发起WebSocket长连接请求;服务端收到请求后,通过会话管理对当前用户的登录状态进行校验,验证通过后完成长连接建立,将用户加入游戏大厅的在线用户列表中,在线用户管理维护所有长连接用户,包含用户与socket连接的对应关系。
- 服务端维护在线用户管理模块,该模块分为两个核心部分:一是游戏大厅,用于承载所有登录成功、处于等待状态的在线用户;二是游戏房间,用于为匹配成功的两名对战用户创建专属的独立对战空间。
- 用户在游戏大厅中发起游戏对战匹配请求,服务端收到请求后先进行会话验证,验证通过后根据用户的分数将其分配到对应等级的匹配队列中;当某一匹配队列内的用户数量≥2时,匹配成功,从队列中取出队首两名用户,为其创建专属对战房间,并将两名用户加入该房间。
- 对战匹配成功后,用户跳转至游戏房间页面,向服务端发起房间内的WebSocket长连接请求;服务端收到请求后,先进行会话验证,再验证用户是否已有对应游戏房间,两项验证均通过后,两名用户即可在房间内开始五子棋对战与实时聊天;对局结束或所有用户退出房间后,房间被销毁,用户断开连接并返回游戏大厅。
- 后续所有用户通信均由服务端中转:服务端通过用户ID获取其所在房间ID,将请求广播给房间内的所有用户(同时完成棋局信息的逻辑处理),客户端仅在收到服务端推送的请求后,才会渲染对应落子或聊天信息。
三、项目架构总览
3.1 项目整体模块:
┌─────────────────────────────────────────────┐ │ gobang.cpp(主入口) │ ├─────────────────────────────────────────────┤ │ server.hpp(服务器主模块) │ │ HTTP路由分发 + WebSocket连接管理 │ ├────────┬────────┬────────┬──────────────────┤ │session │ online │ matcher│ room(房间) │ │(会话) │(在线) │(匹配) │ 棋盘+胜负判定 │ ├────────┴────────┴────────┼──────────────────┤ │ db.hpp(数据库) │ util.hpp(工具) │ ├──────────────────────────┼──────────────────┤ │ logger.hpp(日志) │ │ └──────────────────────────┴──────────────────┘ 后端 C++ 前端 HTML/JS3.2 模块依赖关系
logger.hpp ← 日志模块(最底层,无依赖) ↓ util.hpp ← 工具类(MySQL/JSON/字符串/文件操作) ↓ db.hpp ← 数据库用户表管理 session.hpp ← 会话管理(Cookie/登录状态) online.hpp ← 在线用户管理(大厅/房间) ↓ room.hpp ← 游戏房间(棋盘+胜负判定+房间管理) ↓ matcher.hpp ← 匹配系统(三段位匹配队列) ↓ server.hpp ← 服务器主模块(HTTP路由+WebSocket处理) ↓ gobang.cpp ← 主入口3.3 通信流程
客户端(浏览器) 服务端(C++) │ │ │── HTTP POST /reg ───────────→ │ 注册 │←── JSON响应 ────────────────── │ │ │ │── HTTP POST /login ─────────→ │ 登录(返回Cookie: SSID=xxx) │←── Set-Cookie: SSID=xxx ────── │ │ │ │── WS连接 ws://host/hall ────→ │ 进入游戏大厅(长连接) │←── hall_ready ──────────────── │ │ │ │── WS消息: match_start ──────→ │ 开始匹配 │←── match_success ──────────── │ 匹配成功 │ │ │── WS连接 ws://host/room ────→ │ 进入游戏房间 │←── room_ready ──────────────── │ │ │ │── WS消息: put_chess ────────→ │ 下棋 │←── 广播给双方 ──────────────── │四、开发环境
| 工具 | 说明 |
| 操作系统 | Linux( Ubuntu-22.04) |
| 编辑器 | VSCode |
| 编译器 | g++(需支持 C++11) |
| 调试器 | gdb |
| 构建工具 | Makefile |
五、核心技术
| 技术 | 用途 |
| HTTP/WebSocket | HTTP 处理登录注册,WebSocket 处理实时游戏通信 |
| WebSocket++ | C++ 的 WebSocket 服务器库 |
| JsonCpp | JSON 序列化/反序列化 |
| MySQL | 用户数据持久化存储 |
| C++11 | 智能指针、线程、lambda、auto 等 |
| BlockQueue | 阻塞队列实现匹配系统 |
| HTML/CSS/JS/AJAX | 前端页面与交互 |
六、环境搭建
以下给出 Ubuntu 22.04 系统的环境搭建步骤。
6.1 更新软件源
sudo apt update6.2 安装编译工具链(gcc/g++/gdb/make)
Ubuntu 22.04 自带的 gcc 已支持 C++11,直接通过build-essential一次性安装:
sudo apt install -y build-essential gdb cmake git # 验证 g++ --version gdb --version git --version cmake --version6.3 安装 boost 库
WebSocket++ 依赖 boost 的 asio 组件:
sudo apt install -y libboost-all-dev #验证 dpkg -l | grep libboost-all-dev6.4 安装 JsonCpp 库
用于 JSON 数据的序列化与反序列化:
sudo apt install -y libjsoncpp-dev # 验证头文件是否存在 ls /usr/include/jsoncpp/json/ # 应看到: assertions.h json.h reader.h value.h writer.h ...6.5 安装 MySQL 数据库服务及开发包
6.5.1 安装 MySQL 服务端、客户端及开发包
sudo apt install -y mysql-server mysql-client libmysqlclient-dev6.5.2 启动 MySQL 服务
sudo systemctl start mysql sudo systemctl status mysql6.5.3 设置 MySQL 密码
Ubuntu 22.04 的 MySQL 默认使用auth_socket认证,需要切换为密码认证:
sudo mysql # 在 MySQL 命令行中执行(将 '你的密码' 替换为实际密码) mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; mysql> FLUSH PRIVILEGES; mysql> quit6.5.4 验证登录及字符集
mysql -uroot -p # 输入刚才设置的密码 mysql> show variables like '%chara%'; # 确认相关项为 utf8mb4(Ubuntu 22.04 MySQL 8.0 默认字符集)6.6 安装 WebSocket++ 库
WebSocket++ 需要从源码编译安装:
# 克隆源码 git clone https://github.com/zaphoyd/websocketpp.git # 编译安装 cd websocketpp mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr .. sudo make install验证安装是否成功:
cd ../examples/echo_server g++ -std=c++11 echo_server.cpp -o echo_server -lpthread -lboost_system # 编译成功即表示安装成功6.7 依赖的第三方库总结
| 库 | 安装方式 | 用途 |
| boost | apt 包管理器 | asio 异步 IO(WebSocket++ 依赖) |
| JsonCpp | apt 包管理器 | JSON 序列化与反序列化 |
| MySQL | apt 包管理器 | 用户数据存储 |
| WebSocket++ | 源码编译安装 | 搭建 HTTP + WebSocket 服务器 |