C++项目:网络版五子棋对战(收官总结篇)

news2024/11/23 16:55:59

在这里插入图片描述

文章目录

  • 一、项目背景
    • (一)用户管理
    • (二)匹配对战
    • (三)聊天功能
  • 二、开发环境
  • 三、核心技术
  • 四、项目大流程
  • 五、项目模块介绍
    • (一)实用工具类模块
      • 1.意义
      • 2.设计
    • (二)数据管理模块
      • 1.意义
      • 2.数据库管理
        • (1)功能
        • (2)user_table类设计
    • (三)在线用户管理模块
      • 1.意义
      • 2.功能
      • 3.设计
    • (四)游戏房间管理模块
      • 1.意义
      • 2.功能
      • 3.设计
        • (1)游戏房间类设计
        • (2)游戏房间管理设计
    • (五)玩家匹配管理模块
      • 1.意义
      • 2.功能
      • 3.设计
        • (1)match_queue-匹配队列
        • (2)matcher-匹配管理
    • (六)session管理模块
      • 1.意义
      • 2.功能
      • 3.设计
        • (1)session类设计
        • (2)session_manager管理类设计
    • (七)前端界面模块
  • 六、项目呈现

一、项目背景

本项目主要实现一个网页版的五子棋对战游戏,其主要支持以下核心功能:

(一)用户管理

实现用户注册,用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等。

(二)匹配对战

实现两个玩家在网页端根据天梯分数匹配游戏对手,并进行五子棋游戏对战的功能。

(三)聊天功能

实现两个玩家在下棋的同时可以进行实时聊天的功能。

二、开发环境

  • Linux (Centos-7.6)
  • VSCode/Vim
  • g++/gdb
  • Makefile

三、核心技术

  • HTTP/WebSocket
  • Websocket++
  • JsonCpp
  • Mysql
  • C++11
  • BlockQueue
  • HTML/CSS/JS/AJAX

四、项目大流程

  1. 环境搭建(在Linux环境下安装需要用到的的工具以及第三方库)
  2. 框架设计
  3. 前置知识的了解
  4. 模块开发

五、项目模块介绍

(一)实用工具类模块

在这里插入图片描述

1.意义

实用工具类模块主要是负责提前实现一些项目中会用到的边缘功能代码,提前实现好了就可以在项目中用到的时候直接使用了。

2.设计

  1. 日志宏
    实现程序日志打印
  2. mysql_util
    数据库的连接和初始化,句柄的销毁,语句的执行
  3. Jsoncpp-API
    封装实现json的序列化和反序列化
  4. file_util
    主要封装了文件数据的读取功能(对于html 文件数据进行读取)
  5. string_util
    主要是封装实现字符串分割功能

(二)数据管理模块

在这里插入图片描述

1.意义

数据管理模块主要负责对于数据库中数据进行统一的增删改查管理,其他模块要对数据操作都必须通过数据管理模块完成。

2.数据库管理

(1)功能
  1. 用户信息, 用来实现登录、注册、游戏对战数据管理等功能。
  2. 积分信息, 用来实现匹配功能。
(2)user_table类设计
  1. 成员

MYSQL *_mysql; //mysql操作句柄
std::mutex _mutex;//互斥锁保护数据库的访问操作

  1. 函数

user_table() {};
~user_table() {};
注册时新增用户:bool insert(Json::Value &user);
登录验证,并返回详细的用户信息:bool login(Json::Value &user);
通过用户名获取用户信息:bool select_by_name(const std::string &name, Json::Value &user);
通过用户名获取用户信息:bool select_by_id(uint64_t id, Json::Value &user);
胜利时天梯分数增加30分,战斗场次增加1,胜利场次增加1 :bool win(uint64_t id);
失败时天梯分数减少30,战斗场次增加1,其他不变:bool lose(uint64_t id);

(三)在线用户管理模块

在这里插入图片描述

1.意义

在线用户管理,是对于当前游戏大厅和游戏房间中的用户进行管理,主要是建立起用户与Socket连接的映射关系。

2.功能

  1. 能够让程序中根据用户信息,进而找到能够与用户客户端进行通信的Socket连接,进而实现与用户端的通信。
  2. 判断⼀个用户是否在线,或者判断判断⼀用户是否在线,或者判断用户是否已经掉线。

3.设计

当一个用户发送了消息(实时聊天消息/下棋消息),我们可以找到房间中的其它用户,在在线用户管理模块中,找到这个用户对应的websocket连接,然后将消息发给指定用户。

  1. 通过用户id找到用户连接,进而实现向指定用户的客户端推送消息,websocket连接失败时,会自动在在线用户管理模具爱中删除自己的信息!
  2. 可以判断一个用户是否还在用户管理模块中来确认用户是否在线。
#ifndef __M_ONLINE_H__
#define __M_ONLINE_H__
#include "util.hpp"
#include <mutex>
#include <unordered_map>

class online_manager{
   private:
        std::mutex _mutex;
        //用于建立游戏大厅用户的用户ID与通信连接的关系
        std::unordered_map<uint64_t,  wsserver_t::connection_ptr>  _hall_user;
        //用于建立游戏房间用户的用户ID与通信连接的关系
        std::unordered_map<uint64_t,  wsserver_t::connection_ptr>  _room_user;
   public:
        //websocket连接建立的时候才会加入游戏大厅&游戏房间在线用户管理
        void enter_game_hall(uint64_t uid,   wsserver_t::connection_ptr &conn) {
            std::unique_lock<std::mutex> lock(_mutex);
            _hall_user.insert(std::make_pair(uid, conn));
        }
        void enter_game_room(uint64_t uid,   wsserver_t::connection_ptr &conn) {
            std::unique_lock<std::mutex> lock(_mutex);
            _room_user.insert(std::make_pair(uid, conn));
        }
        //websocket连接断开的时候,才会移除游戏大厅&游戏房间在线用户管理
        void exit_game_hall(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            _hall_user.erase(uid);
        }
        void exit_game_room(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            _room_user.erase(uid);
        }
        //判断当前指定用户是否在游戏大厅/游戏房间
        bool is_in_game_hall(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _hall_user.find(uid);
            if (it == _hall_user.end()) {
                return false;
            }
            return true;
        }
        bool is_in_game_room(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _room_user.find(uid);
            if (it == _room_user.end()) {
                return false;
            }
            return true;
        }
        //通过用户ID在游戏大厅/游戏房间用户管理中获取对应的通信连接
        wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _hall_user.find(uid);
            if (it == _hall_user.end()) {
                return wsserver_t::connection_ptr();
            }
            return it->second;
        }
        wsserver_t::connection_ptr get_conn_from_room(uint64_t uid) {
            std::unique_lock<std::mutex> lock(_mutex);
            auto it = _room_user.find(uid);
            if (it == _room_user.end()) {
                return wsserver_t::connection_ptr();
            }
            return it->second;
        }
};

(四)游戏房间管理模块

在这里插入图片描述

1.意义

对匹配成功的玩家创建房间,建立起一个小范围的玩家之间的关联关系!房间里一个玩家产生的动作将会广播给房间里的其他用户。

2.功能

将这些房间管理起来,以便于进行房间生命周期的控制!

3.设计

(1)游戏房间类设计

管理的数据,处理房间中产生的动作,两个动作,下棋和聊天。

  1. 房间的ID
  2. 房间的状态(决定了一个玩家退出房间时所作的动作)
  3. 房间中玩家的数量(决定了玩家什么时候销毁)
  4. 白棋玩家id
  5. 黑棋玩家id
  6. 用户信息表的句柄(当玩家胜利/失败的时候更新用户数据)
  7. 棋盘信息(二维数组)
(2)游戏房间管理设计
  1. 创建房间 (两个玩家对战匹配完成了,为他们创造一个房间,需要传入两个玩家的用户id)
  2. 查找房间 (通过房间id查找房间信息,通过用户id查找房间所在信息)
  3. 销毁房间 (根据房间id销毁房间,房间中所有用户退出了,销毁房间)

需要管理的数据:

  1. 数据管理模块句柄
  2. 在线用户管理模块句柄
  3. 房间id分配计数器
  4. 互斥锁
  5. using room_ptr = std::shared_ptr; 房间信息的空间使用shared_ptr进行管理,释放了我们还操作,访问错误!
  6. unordered_map<room_id,room_ptr> 房间信息管理(建立起房间id与房间信息的映射关系)
  7. unordered_map<room_id,user_id> 房间id与用户id的关联关系管理! 通过用户id找到所在房间id,再去查找房间信息!
  8. 房间中所有用户退出了,销毁房间。

(五)玩家匹配管理模块

在这里插入图片描述

1.意义

所有玩家,根据得分,分为三个档次!
// 1. 将所有玩家,根据得分,分为三个档次!
// 2. 为三个不同档次创建三个不同的匹配队列!
// 3. 如果有玩家想要进行对战匹配,根据玩家分数,将玩家的id,加到指定的队列中!
// 4. 当一个队列中元素数量 >= 2,则表示有两个玩家要进行匹配,匹配成功
// 5. 出对队列中的前两个元素,为这两个玩家创建房间!
// 6. 给匹配成功的玩家,发送匹配响应,对战匹配成功!

2.功能

进行玩家匹配对战管理。

3.设计

(1)match_queue-匹配队列
  • 目的
    目的是为了实现玩家匹配队列
  • 功能
    1. 入队数据
    2. 出队数据
    3. 移除指定的数据
    4. 线程安全
    5. 获取队列元素个数
    6. 阻塞接口
    7. 判断队列是否为空
(2)matcher-匹配管理
  • 目的
    1. 三个不同档次的队列
    2. 三个线程分别对三个队列中的玩家进行匹配
    3. 房间管理模块的句柄
    4. 在线用户管理模块的句柄
    5. 数据管理模块——用户表的句柄
  • 功能
    1. 添加用户到匹配队列
    2. 线程入口函数
      判断指定队列是否热人数大于2
      出对队列中的前两个元素
      创建房间,将两个用户信息添加到房间中
      向两个玩家发送对战匹配成功的消息!
    3. 从匹配队列移除用户

(六)session管理模块

在这里插入图片描述

1.意义

⼀个浏览器独占⼀个session对象(默认情况下)。因此,在需要保护用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,识别该连接对应的用户,并为用户提供服务。

2.功能

保存客户端的用户状态信息。

3.设计

(1)session类设计
  1. 有自己的表示:ssid
  2. 用户的状态信息
(2)session_manager管理类设计
  1. 创建session
  2. 为session设置过期时间
  3. 获取session
  4. 销毁session(过期被自动销毁)

(七)前端界面模块

1.game_hall.html :大厅界面
2.game_room.html:游戏房间界面
3.login:登陆界面
4.register:注册界面

六、项目呈现

新用户注册:
在这里插入图片描述

登录:
在这里插入图片描述

匹配:
在这里插入图片描述

对战:
在这里插入图片描述
2023.10.26
又一程
善始善终

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1135887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FLStudio2024最新破解版注册机

水果音乐制作软件FLStudio是一款功能强大的音乐创作软件,全名:Fruity Loops Studio。水果音乐制作软件FLStudio内含教程、软件、素材,是一个完整的软件音乐制作环境或数字音频工作站... FL Studio21简称FL 21&#xff0c;全称 Fruity Loops Studio 21&#xff0c;因此国人习惯叫…

当vCenter的证书过期、Root密码过期、Root密码遗忘同时发生时的解决方法与步骤

文章目录 当vCenter的MACHINE证书过期、Root密码过期、权限SSO User密码与Root密码遗忘同时发生时的解决方法与步骤1. 强制修改Root密码2. 强制重新生成权限SSO User的密码3、解决证书过期的问题 当vCenter的MACHINE证书过期、Root密码过期、权限SSO User密码与Root密码遗忘同时…

用别人的网站多不舒服,自己手撸一个密码批量生成器网站

自己手撸一个密码批量生成器网站 自己手撸一个密码生成器网站 小编可以这样给你说&#xff0c;这个是最简单的拉&#xff0c;没有任何的装饰&#xff0c;简单容易上手&#xff0c;还是经过小编测试过的哈 python版本django版本python3.8.6Django3.0.5 声明 这个代码也就是小编…

应用程序架构是如何演变的

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 如果您一直在开发或以某种方式参与应用程序架构&#xff0c;那么在过去的几年中您肯定看到了许多变化。有很多不同类型的架构和技术陆续出现然后消失&#xff0c;以至于…

Windows端口封禁图文教程

文章目录 方式一&#xff1a;打开secpol.msc方式二&#xff1a;Microsoft 管理控制台参考文档 方式一&#xff1a;打开secpol.msc WIN键R输入secpol.msc 在本地安全策略窗口中&#xff0c;选中“IP安全策略&#xff0c;在本地计算机”&#xff0c;右键右侧空白处&#xff0c;选…

ubuntu2004上安装openjdk6

今天因为工作需要要在Ubuntu2004上安装openjdk6&#xff0c;还是有点麻烦的. 这里记录一下过程。 Step 1&#xff1a; openjdk的下载地址在这里&#xff0c;选择对应的架构并将openjdk开头的包全部下载回来。 Step 2&#xff1a; 安装的时候系统缺少以下依赖&#xff1a; …

3d模型轻量化方法以及工具平台

3D模型轻量化是指减少3D模型的文件大小&#xff0c;以便在需要更快的数据传输或更快的渲染速度时使用。 一、以下是几种常见的3D模型轻量化方法&#xff1a; 1、移除不必要的细节&#xff1a;模型中可能存在一些细节&#xff0c;但这些细节对于渲染或使用模型并不重要。通过移…

基于springboot实现乐校园二手书交易管理系统【项目源码+论文说明】

基于springboot实现乐校园二手书交易管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括乐校园二手书交易管理系统的网络应用&#xff0c;在外国二手书交易管理系统已经是很普遍的方式&#xff0c;不过国内的…

如何实现两栏布局?这篇文章告诉你所有的细节!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、背…

031-从零搭建微服务-监控中心(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;mingyue: &#x1f389; 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563

上一章学习了STM32MP1内置RTC外设&#xff0c;了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了&#xff0c;而且成本也低&#xff0c;但是在一些对于时间精度要求比较高的场合&#xff0c;SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…

Halcon 常用通道Scale灰度元操作整理

一、说明 我们将常见的,基于图层信号幅度的操作集中展现出来,以便以后见到相关的操作不会产生唐突。至于这些算子在项目中的灵活应用,我们将在项目中具体指定。 二、基于数量(Scale)的操作 2.1 亮度(Scale)调整 scale_image_max(Image:ImageScaleMax::)

微信批量添加好友,让你的人脉迅速增长

在这个数字化时代&#xff0c;微信作为中国最流行的社交平台之一&#xff0c;已经成为了人们生活中不可或缺的一部分。它的广泛使用为我们提供了无限的社交可能性。你是否曾为了扩大人脉圈子而犯愁&#xff1f;今天&#xff0c;我将向你揭示一个高效添加微信好友的秘密武器&…

Camtasia2024破解版百度云网盘下载

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

居舍系列再续“异国的相遇2023”艺术项目

跨越四城感知艺术声浪&#xff0c;以科技与艺术探索旅行中的情绪共鸣 太古酒店集团旗下居舍系列再度开启两年一度的艺术项目“异国的相遇 2023”&#xff08;Encounters Across Cultures&#xff09;新篇章 — 当艺术与科技同频 &#xff0c;以艺术为媒介&#xff0c;将科技赋予…

16 用于NOMA IoT网络上行链路安全速率最大化的HAP和UAV协作框架

文章目录 摘要相关模型仿真实验仿真结果 摘要 优化无人机到HAP的信道分配、用户功率和无人机三维位置来研究上行安全传输解决非凸问题&#xff0c;采用K-means聚类算法&#xff0c;将成对的用户划分成不同的组&#xff0c;每个簇可以有相应的无人机服务&#xff0c;然后将构造…

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 &#xff08;1&#xff09;四元组的唯一性 &#xff08;2&#xff09;数据的传输过程 &#xff08;3&#xff09;NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 &#xff08;1&#xff09;游戏加…

16、Python --案例实操:控制台打印【 菱形 】和 【 圆 】

目录 控制台打印菱形控制台打印圆 控制台打印菱形 # 控制台打印菱形# 层数 num 8 # 打印上半部分 for i in range(num):# 第一行if i 0:print( * (num - 1 - i) *)else:print( * (num - 1 - i) * (i * 2 - 1) * *)# 打印下半部分 for i in range(num - 1):if i num …

Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022

Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类 Chapter1 Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类0.前言1.最简单的操作运行结果2.实现一个简易的日志管理类 Chapter2 Qt::Qt Log日志模块Qt Log日志模块官方解释官方Demo思路 Chapter3 QT日志模块的个性…

Vue3 创建项目

1 桌面打开 CMD窗口&#xff0c;使用vue create 项目名创建项目。 2 选择Manually select features 自定义配置 3 选择配置&#xff1a;使用空格确认/取消&#xff0c;回车确定&#xff1a; Babel 降级处理 CSS Pre-processors CSS预处理器 Linter/Formatter 代码检查 4 选择vu…