国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++項(xiàng)目:在線五子棋對(duì)戰(zhàn)網(wǎng)頁(yè)版--匹配對(duì)戰(zhàn)模塊開(kāi)發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了C++項(xiàng)目:在線五子棋對(duì)戰(zhàn)網(wǎng)頁(yè)版--匹配對(duì)戰(zhàn)模塊開(kāi)發(fā)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

玩家匹配是根據(jù)自己的天梯分?jǐn)?shù)進(jìn)行匹配的,而服務(wù)器中將玩家天梯分?jǐn)?shù)分為三個(gè)檔次:

1. 普通:天梯分?jǐn)?shù)小于2000分
2. 高手:天梯分?jǐn)?shù)介于2000~3000分之間
3. 大神:天梯分?jǐn)?shù)大于3000分

當(dāng)玩家進(jìn)行對(duì)戰(zhàn)匹配時(shí),服務(wù)器會(huì)根據(jù)檔次,將玩家送到不同檔次的匹配隊(duì)列當(dāng)中。共有3個(gè)匹配隊(duì)列,分別是普通隊(duì)列、高手隊(duì)列和大神隊(duì)列,每一條隊(duì)列由單獨(dú)的線程去控制。因此,匹配對(duì)戰(zhàn)模塊,需要由兩個(gè)類,一個(gè)類是匹配隊(duì)列的類,另外一個(gè)是管理匹配隊(duì)列的類。

匹配隊(duì)列類

當(dāng)玩家進(jìn)行匹配對(duì)戰(zhàn)的請(qǐng)求后,服務(wù)器會(huì)將玩家添加至相應(yīng)的匹配隊(duì)列當(dāng)中,匹配成功后,會(huì)從匹配隊(duì)列中移除該玩家,而在匹配成功前,玩家可能會(huì)中止匹配。因此,匹配隊(duì)列應(yīng)該包含的功能有入隊(duì)、出隊(duì)、和移除指定玩家,玩家處在的位置可能是隊(duì)列的中間,因此,匹配隊(duì)列采用的是雙向循環(huán)鏈表。在匹配過(guò)程中,如果暫時(shí)為達(dá)到匹配玩家個(gè)數(shù),該線程會(huì)進(jìn)入阻塞等待狀態(tài),因此需要實(shí)現(xiàn)的功能還有阻塞等待的方法,獲取隊(duì)列元素個(gè)數(shù)、判斷隊(duì)列是否為空的方法。

template<class T>
class match_queue
{
private:
    /*由于可能要?jiǎng)h除中間數(shù)據(jù),因此使用雙向鏈表,而不使用隊(duì)列*/
    std::list<T> _list;
    //保證線程安全
    std::mutex _mutex;
    //使用條件變量實(shí)現(xiàn)阻塞,在隊(duì)列中元素個(gè)數(shù)小于2的時(shí)候進(jìn)行阻塞
    std::condition_variable _cond;
public:
    /*入隊(duì)*/
    void push(T& data)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _list.push_back(data);
        /*每次有玩家進(jìn)入匹配隊(duì)列后,喚醒線程*/
        _cond.notify_all();
    }

    /*出隊(duì)*/
    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);
    }
    /*獲取隊(duì)列元素個(gè)數(shù)*/
    int size()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        return _list.size();
    }

    /*判斷隊(duì)列是否為空*/
    bool empty()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        return _list.empty();
    }

    /*阻塞等待*/
    void wait()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _cond.wait(lock);
    }

};

匹配隊(duì)列管理類

在匹配隊(duì)列管理類中,創(chuàng)建三個(gè)線程,每一個(gè)線程分別管理著每一條匹配隊(duì)列:

普通線程管理普通隊(duì)列,高手線程管理高手隊(duì)列,大神線程管理大神隊(duì)列。

而管理的方法是:實(shí)現(xiàn)匹配對(duì)戰(zhàn):當(dāng)玩家數(shù)量小于2時(shí),線程繼續(xù)阻塞。大于2時(shí),將兩個(gè)玩家出隊(duì),然后將玩家添加到房間,最后對(duì)玩家進(jìn)行一個(gè)匹配成功的響應(yīng)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-636197.html

#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:
    /*由于可能要?jiǎng)h除中間數(shù)據(jù),因此使用雙向鏈表,而不使用隊(duì)列*/
    std::list<T> _list;
    //保證線程安全
    std::mutex _mutex;
    //使用條件變量實(shí)現(xiàn)阻塞,在隊(duì)列中元素個(gè)數(shù)小于2的時(shí)候進(jìn)行阻塞
    std::condition_variable _cond;
public:
    /*入隊(duì)*/
    void push(T& data)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _list.push_back(data);
        /*每次有玩家進(jìn)入匹配隊(duì)列后,喚醒線程*/
        _cond.notify_all();
    }

    /*出隊(duì)*/
    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);
    }
    /*獲取隊(duì)列元素個(gè)數(shù)*/
    int size()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        return _list.size();
    }

    /*判斷隊(duì)列是否為空*/
    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:
    /*普通隊(duì)列*/
    match_queue<uint64_t> _q_normal;
    /*高手隊(duì)列*/
    match_queue<uint64_t> _q_hight;
    /*大神隊(duì)列*/
    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)
        {
            /*判斷隊(duì)列中玩家個(gè)數(shù)是否大于2*/
            while(mq.size()<2)
            {
                mq.wait();
            }
            /*大于2,將兩個(gè)玩家出隊(duì)*/
            uint64_t uid1,uid2;
            bool ret = mq.pop(uid1);
            if(ret==false)
            {
                continue;
            }
            ret = mq.pop(uid2);
            if(ret==false)
            {
                continue;
            }
            /*兩個(gè)玩家出隊(duì)后,獲取對(duì)應(yīng)的通信連接,然后判斷是否依然連接在線*/
            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;
            }
            /*獲取連接后,為他們創(chuàng)建房間并且添加進(jìn)房間*/
            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)
    {
        /*根據(jù)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

到了這里,關(guān)于C++項(xiàng)目:在線五子棋對(duì)戰(zhàn)網(wǎng)頁(yè)版--匹配對(duì)戰(zhàn)模塊開(kāi)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 網(wǎng)頁(yè)版Java(Spring/Spring Boot/Spring MVC)五子棋項(xiàng)目(四)對(duì)戰(zhàn)模塊

    網(wǎng)頁(yè)版Java(Spring/Spring Boot/Spring MVC)五子棋項(xiàng)目(四)對(duì)戰(zhàn)模塊

    匹配成功返回?cái)?shù)據(jù) 1. message消息類別 2. ok 3. reson 4. 房間id 5. 雙方id 6.白色玩家 一個(gè)類記錄房間中的信息(房間id,兩個(gè)用戶id,是否為白棋) 信息提示框 處理匹配API 初始化游戲(棋盤(pán),下一個(gè)棋子,接受棋子處理響應(yīng),判斷是否結(jié)束) 1. 客戶端連接到游戲房間后, 服務(wù)器返回

    2024年02月13日
    瀏覽(20)
  • 在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

    在線五子棋對(duì)戰(zhàn) --- 人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)

    要增添一個(gè)人機(jī)對(duì)戰(zhàn)的模塊, 最大的難點(diǎn)就是如何讓人機(jī)知道下在什么位置是最好的, 不僅要具備進(jìn)攻的能力, 還需要具備防守的能力. 這里當(dāng)人機(jī)第一次走的時(shí)候, 采用標(biāo)準(zhǔn)開(kāi)局, 下子在最中間. 當(dāng)玩家走了之后, 人機(jī)就需要去判定下在什么位置合理. 這里采用的是評(píng)分表的方法

    2024年02月05日
    瀏覽(19)
  • C++ 實(shí)現(xiàn)對(duì)戰(zhàn)AI五子棋

    C++ 實(shí)現(xiàn)對(duì)戰(zhàn)AI五子棋

    ?個(gè)人主頁(yè): 日刷百題 系列專欄 : 〖C/C++小游戲〗 〖Linux〗 〖數(shù)據(jù)結(jié)構(gòu)〗 ? 〖 C語(yǔ)言 〗 ?? 歡迎各位 → 點(diǎn)贊 ??+ 收藏 ??+ 留言 ??? ? ? ? ? ?為了能夠快速上手一門(mén)語(yǔ)言,我們往往在學(xué)習(xí)了基本語(yǔ)法后,采用寫(xiě)一個(gè)小項(xiàng)目的方式來(lái)加深理解語(yǔ)言的語(yǔ)法及運(yùn)用,本文采

    2024年02月03日
    瀏覽(25)
  • 【項(xiàng)目設(shè)計(jì)】網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋(上)

    【項(xiàng)目設(shè)計(jì)】網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋(上)

    想回家過(guò)年… 1.1 http1.0/1.1和websocket協(xié)議 1. a. http協(xié)議在Linux的學(xué)習(xí)部分我們就已經(jīng)學(xué)習(xí)過(guò)了,當(dāng)時(shí)http和https是一塊學(xué)的,我們當(dāng)時(shí)其實(shí)已經(jīng)了解了http的大部分知識(shí)內(nèi)容,比如http請(qǐng)求和響應(yīng)的格式,各自的報(bào)頭字段都有哪些,cookie和session機(jī)制,http1.1的長(zhǎng)連接策略keep-alive,還有

    2024年02月07日
    瀏覽(21)
  • Linux項(xiàng)目實(shí)戰(zhàn)——五子棋(單機(jī)人人對(duì)戰(zhàn)版)

    Linux項(xiàng)目實(shí)戰(zhàn)——五子棋(單機(jī)人人對(duì)戰(zhàn)版)

    Linux操作系統(tǒng)項(xiàng)目實(shí)戰(zhàn)——五子棋 GIF: 目錄 ? ? ? ? ???Linux操作系統(tǒng)項(xiàng)目——五子棋 一、問(wèn)題導(dǎo)引: 二、實(shí)現(xiàn)要求: 三、五子棋原理: 1.落子數(shù)據(jù)信息保存載體: 2.落子思路: 3.判斷“五子連珠” 四、項(xiàng)目實(shí)現(xiàn)步驟: Ⅰ.創(chuàng)建目錄及文件: 1.在Linux環(huán)境下創(chuàng)建名為Gobang的文

    2024年02月03日
    瀏覽(26)
  • 基于FPGA(basys3)的雙人對(duì)戰(zhàn)人機(jī)對(duì)戰(zhàn)五子棋(vivado)課程設(shè)計(jì)項(xiàng)目

    基于FPGA(basys3)的雙人對(duì)戰(zhàn)人機(jī)對(duì)戰(zhàn)五子棋(vivado)課程設(shè)計(jì)項(xiàng)目

    目錄 主界面顯示與選擇模式 雙人對(duì)戰(zhàn) 人機(jī)對(duì)戰(zhàn) 勝利界面顯示 部分源碼 VGA顯示器顯示圖片,顯示圖片利用Block Memory Generator將圖片像素點(diǎn)儲(chǔ)存在RAM里面。 效果圖:(防止侵權(quán)打了馬賽克) ?通過(guò)開(kāi)發(fā)板上的按鍵進(jìn)行模式選擇,模式確定 雙人對(duì)戰(zhàn)就是采用簡(jiǎn)單的存數(shù)組的辦法

    2024年01月18日
    瀏覽(53)
  • 2.6.C++項(xiàng)目:網(wǎng)絡(luò)版五子棋對(duì)戰(zhàn)之?dāng)?shù)據(jù)管理模塊-游戲房間管理模塊的設(shè)計(jì)

    2.6.C++項(xiàng)目:網(wǎng)絡(luò)版五子棋對(duì)戰(zhàn)之?dāng)?shù)據(jù)管理模塊-游戲房間管理模塊的設(shè)計(jì)

    對(duì)匹配成功的玩家創(chuàng)建房間,建立起一個(gè)小范圍的玩家之間的關(guān)聯(lián)關(guān)系! 房間里一個(gè)玩家產(chǎn)生的動(dòng)作將會(huì)廣播給房間里的其他用戶。 將這些房間管理起來(lái),以便于進(jìn)行房間生命周期的控制! 游戲房間類: // 實(shí)現(xiàn)兩個(gè)部分: // 1. 房間的設(shè)計(jì) // 2. 房間管理的設(shè)置 // 游戲房間的

    2024年02月08日
    瀏覽(22)
  • 基于Python的五子棋人機(jī)對(duì)戰(zhàn)

    基于Python的五子棋人機(jī)對(duì)戰(zhàn)

    在之前的博文基于tkinter的五子棋游戲中使用tkinter做了一個(gè)簡(jiǎn)單的五子棋游戲,只能實(shí)現(xiàn)人人對(duì)戰(zhàn),后來(lái)想著加上人機(jī)對(duì)戰(zhàn)的功能。 不過(guò),最初想想還是挺麻煩的,計(jì)算機(jī)怎么評(píng)估當(dāng)前的棋局,找到最佳或者較佳的落子點(diǎn)呢,腦子真是越來(lái)越不靈光了。站在巨人的肩膀上,科

    2024年02月04日
    瀏覽(25)
  • python實(shí)現(xiàn)五子棋-人機(jī)對(duì)戰(zhàn)/人人對(duì)戰(zhàn)(動(dòng)圖演示+源碼分享)

    python實(shí)現(xiàn)五子棋-人機(jī)對(duì)戰(zhàn)/人人對(duì)戰(zhàn)(動(dòng)圖演示+源碼分享)

    大家好,我是夢(mèng)執(zhí),對(duì)夢(mèng)執(zhí)著。希望能和大家共同進(jìn)步! ? 五子棋對(duì)戰(zhàn)-所有文件文末自取 前言 人人對(duì)戰(zhàn) 動(dòng)態(tài)演示 源碼分享 cheackboard.py 人人對(duì)戰(zhàn).py 導(dǎo)入模塊 設(shè)置棋盤(pán)和棋子參數(shù) 局內(nèi)字體設(shè)置 落子循壞體 畫(huà)棋盤(pán) 畫(huà)棋子 運(yùn)行框返回落子坐標(biāo) 執(zhí)行文件 人機(jī)對(duì)戰(zhàn) 動(dòng)態(tài)演示

    2023年04月08日
    瀏覽(22)
  • JAVA五子棋手機(jī)網(wǎng)絡(luò)對(duì)戰(zhàn)游戲的設(shè)計(jì)與實(shí)現(xiàn)(源代碼+論文)

    在現(xiàn)代社會(huì)中,手機(jī)及其它無(wú)線設(shè)備越來(lái)越多的走進(jìn)普通老百姓的工作和生活。 隨著3G技術(shù)的普及與應(yīng)用,基于Java開(kāi)發(fā)的軟件在手機(jī)上的使用非常的廣泛,手機(jī)增值服務(wù)的內(nèi)容也是越來(lái)越多,對(duì)豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。 本文基于J2ME技術(shù),以

    2024年02月09日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包