当前位置: 首页 > news >正文

C++项目:在线五子棋对战网页版--匹配对战模块开发

玩家匹配是根据自己的天梯分数进行匹配的,而服务器中将玩家天梯分数分为三个档次:

1. 普通:天梯分数小于2000分
2. 高手:天梯分数介于2000~3000分之间
3. 大神:天梯分数大于3000分

当玩家进行对战匹配时,服务器会根据档次,将玩家送到不同档次的匹配队列当中。共有3个匹配队列,分别是普通队列、高手队列和大神队列,每一条队列由单独的线程去控制。因此,匹配对战模块,需要由两个类,一个类是匹配队列的类,另外一个是管理匹配队列的类。

匹配队列类

当玩家进行匹配对战的请求后,服务器会将玩家添加至相应的匹配队列当中,匹配成功后,会从匹配队列中移除该玩家,而在匹配成功前,玩家可能会中止匹配。因此,匹配队列应该包含的功能有入队、出队、和移除指定玩家,玩家处在的位置可能是队列的中间,因此,匹配队列采用的是双向循环链表。在匹配过程中,如果暂时为达到匹配玩家个数,该线程会进入阻塞等待状态,因此需要实现的功能还有阻塞等待的方法,获取队列元素个数、判断队列是否为空的方法。

template<class T>
class match_queue
{
private:/*由于可能要删除中间数据,因此使用双向链表,而不使用队列*/std::list<T> _list;//保证线程安全std::mutex _mutex;//使用条件变量实现阻塞,在队列中元素个数小于2的时候进行阻塞std::condition_variable _cond;
public:/*入队*/void push(T& data){std::unique_lock<std::mutex> lock(_mutex);_list.push_back(data);/*每次有玩家进入匹配队列后,唤醒线程*/_cond.notify_all();}/*出队*/bool pop(T& data){std::unique_lock<std::mutex> lock(_mutex);if(_list.empty()==true){return false;}data = _list.front();_list.pop_front();return true;}/*移除指定元素*/void remove(T& data){std::unique_lock<std::mutex> lock(_mutex);_list.remove(data);}/*获取队列元素个数*/int size(){std::unique_lock<std::mutex> lock(_mutex);return _list.size();}/*判断队列是否为空*/bool empty(){std::unique_lock<std::mutex> lock(_mutex);return _list.empty();}/*阻塞等待*/void wait(){std::unique_lock<std::mutex> lock(_mutex);_cond.wait(lock);}};

匹配队列管理类

在匹配队列管理类中,创建三个线程,每一个线程分别管理着每一条匹配队列:

普通线程管理普通队列,高手线程管理高手队列,大神线程管理大神队列。

而管理的方法是:实现匹配对战:当玩家数量小于2时,线程继续阻塞。大于2时,将两个玩家出队,然后将玩家添加到房间,最后对玩家进行一个匹配成功的响应。

#ifndef __M__MATCHER_H__
#define __M__MATCHER_H__
#include<list>
#include <mutex>
#include <condition_variable>
#include "room.hpp"template<class T>
class match_queue
{
private:/*由于可能要删除中间数据,因此使用双向链表,而不使用队列*/std::list<T> _list;//保证线程安全std::mutex _mutex;//使用条件变量实现阻塞,在队列中元素个数小于2的时候进行阻塞std::condition_variable _cond;
public:/*入队*/void push(T& data){std::unique_lock<std::mutex> lock(_mutex);_list.push_back(data);/*每次有玩家进入匹配队列后,唤醒线程*/_cond.notify_all();}/*出队*/bool pop(T& data){std::unique_lock<std::mutex> lock(_mutex);if(_list.empty()==true){return false;}data = _list.front();_list.pop_front();return true;}/*移除指定元素*/void remove(T& data){std::unique_lock<std::mutex> lock(_mutex);_list.remove(data);}/*获取队列元素个数*/int size(){std::unique_lock<std::mutex> lock(_mutex);return _list.size();}/*判断队列是否为空*/bool empty(){std::unique_lock<std::mutex> lock(_mutex);return _list.empty();}/*阻塞等待*/void wait(){std::unique_lock<std::mutex> lock(_mutex);_cond.wait(lock);}
};class matcher
{
private:/*普通队列*/match_queue<uint64_t> _q_normal;/*高手队列*/match_queue<uint64_t> _q_hight;/*大神队列*/match_queue<uint64_t> _q_super;/*普通线程*/std::thread _th_normal;/*高手线程*/std::thread _th_hight;/*大神线程*/std::thread _th_super;room_manager *_rm;user_table *_ut;online_manager *_om;
private:void handle_match(match_queue<uint64_t>& mq){while(1){/*判断队列中玩家个数是否大于2*/while(mq.size()<2){mq.wait();}/*大于2,将两个玩家出队*/uint64_t uid1,uid2;bool ret = mq.pop(uid1);if(ret==false){continue;}ret = mq.pop(uid2);if(ret==false){continue;}/*两个玩家出队后,获取对应的通信连接,然后判断是否依然连接在线*/wsserver_t::connection_ptr conn1 = _om->get_conn_from_hall(uid1);if(conn1.get()==nullptr){this->add(uid1);continue;}wsserver_t::connection_ptr conn2 = _om->get_conn_from_hall(uid2);if(conn2.get()==nullptr){this->add(uid2);continue;}/*获取连接后,为他们创建房间并且添加进房间*/room_ptr rp = _rm->create_room(uid1,uid2);if(rp.get()==nullptr){this->add(uid1);this->add(uid2);continue;}/*将信息返回*/Json::Value resp;resp["optype"] = "match_success";resp["result"] = true;std::string body;json_util::serialize(resp,body);conn1->send(body);conn2->send(body);}}void _th_normal_entry(){return handle_match(_q_normal);}void _th_hight_entry(){return handle_match(_q_hight);}void _th_super_entry(){return handle_match(_q_super);}
public:matcher(room_manager *rm,user_table* ut,online_manager* om):_rm(rm),_ut(ut),_om(om),_th_normal(std::thread(&matcher::_th_normal_entry,this)),_th_hight(std::thread(&matcher::_th_hight_entry,this)),_th_super(std::thread(&matcher::_th_super_entry,this)){DLOG("游戏匹配模块初始化完毕...");}bool add(uint64_t uid){/*根据uid,获取到玩家的信息*/Json::Value user;bool ret = _ut->select_by_id(uid,user);if(ret==false){DLOG("获取玩家:%d 信息失败",uid);return false;}int score = user["score"].asInt();if(score < 2000){_q_normal.push(uid);}else if(score>=2000 && score < 3000){_q_normal.push(uid);}else{_q_normal.push(uid);}return true;}bool del(uint64_t uid){Json::Value user;bool ret = _ut->select_by_id(uid,user);if(ret==false){DLOG("获取玩家:%d 信息失败",uid);return false;}int score = user["score"].asInt();if(score<2000){_q_normal.remove(uid);}else if(score>=2000 && score<3000){_q_hight.remove(uid);}else{_q_super.remove(uid);}return true;}};#endif

相关文章:

C++项目:在线五子棋对战网页版--匹配对战模块开发

玩家匹配是根据自己的天梯分数进行匹配的&#xff0c;而服务器中将玩家天梯分数分为三个档次&#xff1a; 1. 普通&#xff1a;天梯分数小于2000分 2. 高手&#xff1a;天梯分数介于2000~3000分之间 3. 大神&#xff1a;天梯分数大于3000分 当玩家进行对战匹配时&#xff0c;服…...

ssh 连接断开,正在执行的shell脚本也被中断了

背景 最近在训练chatGLM&#xff0c;一次训练经常要花掉近2个小时&#xff0c;但是由于网络不稳定&#xff0c;经常ssh莫名的断开&#xff0c;导致训练不得不重新开启&#xff0c;这就很浪费时间了 解决方案 下面教大家一种在后台执行命令的方案&#xff0c;即使你ssh连接断…...

UML 用例图,类图,时序图,活动图

UML之用例图&#xff0c;类图&#xff0c;时序图&#xff0c;活动图_用例图 时序图_siyan985的博客-CSDN博客 https://www.cnblogs.com/GumpYan/p/14734357.html 用例图与类图 - 简书...

Java 面试题2023

Java core JVM 1、JVM内存模型 2、JVM运行时内存分配 3、如何确定当前对象是个垃圾 4、GCrooot 包括哪些? 5、JVM对象头包含哪些部分 6、GC算法有哪些 7、JVM中类的加载机制 8、分代收集算法 9、JDK1.8 和 1.7做了哪些优化 10、内存泄漏和内存溢出有什么区别 11、J…...

【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )

文章目录 一、需求说明二、动画代码分析1、地图背景设置2、热点动画位置测量3、热点动画布局分析4、动画定义5、小圆点实现6、波纹效果盒子实现7、延迟动画设置 三、代码示例 一、需求说明 实现如下效果 , 在一张地图上 , 以某个位置为中心点 , 向四周发散 ; 核心 是实现 向四周…...

命令模式(Command)

命令模式是一种行为设计模式&#xff0c;可将一个请求封装为一个对象&#xff0c;用不同的请求将方法参数化&#xff0c;从而实现延迟请求执行或将其放入队列中或记录请求日志&#xff0c;以及支持可撤销操作。其别名为动作(Action)模式或事务(Transaction)模式。 Command is …...

Dapper 微型orm的光

介绍 Dapper是一个轻量级的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它可以方便地将数据库查询结果映射到.NET对象上&#xff0c;同时也支持执行原生SQL查询。下面我将详细介绍Dapper的使用方法。 安装Dapper 首先&#xff0c;你需要通过NuGet包管理器将Dap…...

Mysql随心记--第一篇

MylSAM&#xff1a;查询速度快&#xff0c;有较好的索引优化和数据压缩技术&#xff0c;但是它不支持事务 InnoDB&#xff1a;它支持事务&#xff0c;并且提供行级的锁定&#xff0c;应用也相当广泛 docker ps -a --filter "ancestormysql" 查看linux中创建了多少个d…...

使用dockerfile安装各种服务组件

使用dockerfile安装各种服务组件 elasticsearch、minio、mongodb、nacos、redis 一、使用dockerfile安装elasticsearch:7.8.0 1、Dockerfile文件 FROM elasticsearch:7.8.0 #添加分词器 ADD elasticsearch-analysis-ik /usr/share/elasticsearch/plugins/elasticsearch-anal…...

如何简单的无人直播

环境搭建 ffmpeg安装&#xff0c;我这里用的是centos搭建的&#xff0c;其他平台可以自己百度 yum -y install wgetwget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xztar -xJf ffmpeg-4.0.3-64bit-static.ta…...

【基于HBase和ElasticSearch构建大数据实时检索项目】

基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据&#xff0c;解决海量数据存储和实时更新查询的问题&#xff1b;利用ElasticSearch作为HBase索引&#xff0c;加快大数据集中实时查询数…...

ProComponent 用法学习

相信很多同学都用过 Ant Design 这一 react 著名组件库&#xff0c;而 ProComponents 则是在 antd 之上进行封装的页面级组件库&#xff08;指一个组件就可以搞定一个页面&#xff09;。它同时也是 Ant Design Pro 中后台框架所用的主要组件库。如果你手上有要用 react 开发的中…...

巨人互动|Google海外户Google Analytics的优缺点是什么?

Google Analytics是一个由谷歌开发的网站分析工具&#xff0c;旨在帮助网站和移动应用程序运营者收集和分析数据&#xff0c;以更好地了解用户行为和改进业务。虽然Google Analytics具有许多优势&#xff0c;但也存在一些缺点。在本文中&#xff0c;我们将探讨Google Analytics…...

MySQL数据库的操作

MySQL 连接服务器 库的操作创建数据库数据库删除查看数据库进入数据库查看所在的数据库修改数据库显示创建语句查看连接情况 表的操作创建表查看数据库所有的表查看表的详细信息查看创建表时的详细信息删除表修改表名向表中插入数据在表结构中新增一列对表结构数据的修改删除表…...

人工智能行业岗位一览

人工智能行业的岗位薪资高、待遇好、涨薪快已经是公开的事实&#xff0c;那么在人工智能行业中具体有哪些职业岗位呢&#xff1f;对于普通人来说&#xff0c;想要入行人工智能又有哪些机会呢&#xff1f; 下面是人工智能领域中的一部分职业岗位&#xff0c;随着技术的不断发展&…...

《Linux运维实战:Docker基础总结》

一、简介 1、docker的基本结构是什么&#xff0c;包含哪些组件&#xff1f; docker的基本机构是c/s模式&#xff0c;即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信&#xff0c;发送容器管理…...

Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网

解决方案&#xff1a; 以管理员模式打开命令行&#xff0c;输入&#xff1a;netsh winsock reset &#xff0c;然后重启电脑 如果还不行的话&#xff0c; 在 chromevs中选中 设置>隐私和安全>安全>使用安全 dns> 使用您当前的服务提供商 即可...

89 | Python人工智能篇 —— 深度学习算法 Keras 实现 MNIST分类

本教程将带您深入探索Keras,一个开源的深度学习框架,用于构建人工神经网络模型。我们将一步步引导您掌握Keras的核心概念和基本用法,学习如何构建和训练深度学习模型,以及如何将其应用于实际问题中。 文章目录 Keras 构建实际mnist图像分类案例.1. 介绍2. 环境搭建3. 数据准…...

每天一道leetcode:剑指 Offer 32 - III. 从上到下打印二叉树 III(中等广度优先遍历)

今日份题目&#xff1a; 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推。 示例 给定二叉树: [3,9,20,null,null,15,7…...

day10 快速排序 方法重载 和 方法递推

方法重载 斐波拉契数列问题 使用重载思想解决 public static int method(int n){if (n 2 ){return 1 ;}return (n-1)*2method(n-1);}public static int f(int n){if (n 1){return 1;}if (n 2){return 2;}return f(n-1)f(n-2);} 快速排序 思维很简单&#xff0c;类似二…...

Qt 6. 其他类调用Ui中的控件

1. 把主类指针this传给其他类&#xff0c;tcpClientSocket new TcpClient(this); //ex2.cpp #include "ex2.h" #include "ui_ex2.h"Ex2::Ex2(QWidget *parent): QDialog(parent), ui(new Ui::Ex2) {ui->setupUi(this);tcpClientSocket new TcpClient…...

PHP 的不同版本(src 版、nts 版和 win 版)之间的区别和共同点。

在下载php时会有很多版本供我们选择&#xff0c;PHP 的不同版本&#xff08;src 版、nts 版和 win 版&#xff09;之间的区别又是什么呢。 src 版本&#xff1a;src 版本指的是 PHP 的源代码版本&#xff0c;您需要自行编译并安装它。这个版本通常用于自定义编译、开发环境和高…...

3 vue的if语法

vue的if语法是相当于一个标签的属性来写进去的&#xff0c;比如说<h1 v-if“”>。要注意的是if语句里可以自动从数据层取值的&#xff0c;比如<h1 v-if"message">&#xff0c;这里就会自动把key为message的值取过来&#xff0c;而如果要传一个字符串&…...

python基础3——流程控制

文章目录 一、操作符1.1 比较操作符1.2 逻辑操作符1.3 成员操作符1.4 身份操作符 二、流程控制2.1 条件判断2.2 循环语句2.2.1 for循环2.2.2 while循环 2.3 continue与break语句2.4 文件操作函数 三、函数3.1 定义函数3.2 作用域3.3 闭包3.4 函数装饰器3.5 内建函数 一、操作符…...

kubernetes中最小组件——Pod

目录 一、Pod简介 二、Pod的使用方式 三、Pause——Pod中底层基础容器 四、为什么kubernetes这样设计Pod 五、Pod的分类 1.自主式Pod 2.控制器管理的Pod 3.静态Pod 六、Pod容器的分类 1. 基础容器&#xff08;infrastructure container&#xff09; 2. 初始化容器&am…...

C++ 友元

文章目录 前言一、什么是友元二、友元的特性三、示例代码总结 前言 在C编程中&#xff0c;友元&#xff08;friend&#xff09;是一种特殊的关系&#xff0c;允许一个类或函数访问另一个类中的私有成员。 一、什么是友元 1.友元 的定义&#xff1a; 友元在C中可以被用于类和…...

Vulkan 绘制显示设计

背景 众所周知&#xff0c;Vulkan是个跨平台的图形渲染API&#xff0c;为了友好地支持跨平台&#xff0c;Vulkan自然也抽象出了很多接口层去对接各个操作系统&#xff0c;抹平系统间的差异&#xff0c;Swap Chains即为WSI。 其本质上是一种图像队列&#xff0c;此队列会按顺序…...

Linux性能分析工具介绍(一)--cpu及功耗相关工具介绍

目录 一、引言 二、CPU及功耗分析工具介绍 ------>2.1、cpuinfo ------------>2.1.1、cpuid指令 ------>2.2、lscpu ------>2.3、turbostat ------>2.4、rdmsr ------>2.5、mpstat ------>2.6、/proc/stat ------>2.7、powertop ----------…...

智能财务分析的无冕之王-奥威BI数据可视化工具

利用智能数据可视化分析工具&#xff0c;可极大提升财务分析效率和报表可读性&#xff0c;缩短从分析到决策的耗时。但财务分析的难度往往比其他分析更高&#xff0c;因为它的分析指标计算组合变化太多也太快。哪些数据可视化工具能胜任智能财务数据分析&#xff1f; 奥威BI数…...

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用&#xff0c;与任何其他平台的部署相同&#xff0c;可以2种方式&#xff1a; 依赖于框…...

做ppt图表的网站/种子资源地址

参考资料&#xff1a; https://www.cnblogs.com/kumufengchun/p/10384325.html https://www.kancloud.cn/hello123/beego/126138...

建立个人博客wordpress/seo计费系统登录

实现思路 输入设备(用来获取外界信息) 摄像头, 麦克风, 键盘输出设备 (将收集到的信息, 做解析, 来获取收到的内容)会话session (用来连接输入和输出设备)特殊的layer (展示输入设备所采集的信息) 1. 导包 #import <AVFoundation/AVFoundation.h>2. 代码 #import "…...

怎么做家政的网站/企业网站的类型

python安装dlib库报错问题及解决方法发布时间&#xff1a;2020-09-01 06:02:57...

做燕鲍翅的网站/上海做seo的公司

1.如果一个脚本要获取某个物体的引用&#xff0c;在脚本中定义Public GameObject go,在Hierarchy中将对应物体拖过去&#xff0c;这是最常用的方式&#xff0c;很简单 2.如果一个脚本要获取很多物体的引用&#xff0c;当然可以在脚本中定义很多个Public GameObject go变量&…...

wordpress 谷歌广告插件/在线优化网站

学习Android过程中&#xff0c;集成了Retorfit2&#xff0c;遇到了请求服务器返回报文赋值为空得问题要做的事情很简单&#xff0c;使用Retrofit发送请求到服务器&#xff0c;服务器返回json&#xff0c;客户端解析字段。但是使用过程中出现了一个问题&#xff0c;使用Android安…...

建设网站免费/营销必备十大软件

Linux 4.9-rc1版本已于近日发布下载&#xff0c;这标志着4.9内核合并窗口宣告结束。正因为如此&#xff0c;本文盘点了Linux 4.9的种种变化&#xff0c;它们让我们为这个开源内核的下一个版本而感到激动。一些亮点包括&#xff1a;AMDGPU GCN 1.0试验性支持、内存保护密钥支持、…...