▲前のページへ
次のページへ▼

マッチングアルゴリズム(3) マッチングルールの追加


【目次】
似通ったレベルのユーザーとマッチングする
新規マッチングルール用のファイルを準備する
加えたマッチングルールをMatchingManager に登録する
マッチングアルゴリズムに組み込む
追加した LevelMatching.cpp をmake対象に加える


似通ったレベルのユーザーとマッチングする

 ここではマッチングアルゴリズムに手を加えて、今の一次元式なマッチング方法だけでなく、
 様々なマッチングパターンを組み込んでみましょう。

 今回サンプルとして提供している手法以外で、一番手っ取り早く、かつユーザーから理想的に思われるのは
 「似通ったレベルのユーザーとマッチングする」手法かと思われますので、それを実例として
 マッチングルールの追加方法を順に示していきましょう。


新規マッチングルール用のファイルを準備する

 マッチングルールを新規に作成する際に、今現在 /server/matching/src/sample/matching フォルダに用意されている
 ValueMatching.cpp および ValueMatching.hpp とは別に、ソースファイルとヘッダファイルを用意します。

 以下のように、空のテキストファイル LevelMatching.cpp および LevelMatching.hpp 作成しましょう。
  

 また上記2つのファイルを開き、それぞれ ValueMatching.cpp および ValueMathing.hpp の内容を参考に、コードを記述します。
 コード内容は非常に長くなりますので、以下のリンクを開き、丸ごとコピー&ペーストで貼り付けてください。
 (ValueMatching.cpp および ValueMatching.hpp から変更している箇所を赤文字で示します。
  自分で独自のマッチングルールを作成する場合などの参考にしてください)

    LevelMatching.cpp 全文
    LevelMatching.hpp 全文

 ■ ValueMatchingクラス と LevelMatchingクラス の違いについて
  ValueMatching と LevelMatching との大きな違いは、ほとんどありません。
  (クラス名の違い、value_table → level_table への書き換えなど、細かい違いはありますが・・・)

  唯一大きな違いがあるとするならば、どのマッチングルームに入室するかを決定するための
  SearchRoom 関数に違いがあります。ここでルームに入室する際の条件として、「valueの一致」となっていたところを
  「プレイヤーレベルの範囲( 引数 level_min ~ level_max の間)」に変えています。
   


加えたマッチングルールをMatchingManager に登録する

 次に、上記で加えた LevelMatching クラスによるマッチングルールについて、
 同フォルダ内に用意された MachingManager.cpp および MachingManager.hpp に登録します。

 登録手順はいたって簡単で、MachingManager.cpp / .hpp のファイル文書内に TODO と記載されている
 箇所がありますので、そこに ValueMaching に倣って LevelMatching の各項目を埋めていくようにします。

 ■ MachingManager.hpp
  MachingManager.hpp を開き、以下の赤枠部分を埋めていきます。
   

 ■ MachingManager.cpp
  MachingManager.cpp を開き、コンストラクタ関数内の以下の赤枠部分を埋めていきます。
   


マッチングアルゴリズムに組み込む

 後は実質上のマッチングアルゴリズム本体となる /server/matching/src/sample/RPC_BTL_Matching.cpp にある
 RPC_BTL_Matching::Recv_EnterMatchingRoom 関数の改変です。

 この中で、ValueMatching による「マッチングルームの検索」と「マッチングルームへの入室」を行なっている箇所が
 ありますので、これも ValueMatching に倣って LevelMatching の組み込みを行なっていきます。

 ■ マッチングルームの検索
  LevelMaching によるマッチングルームの検索処理は以下のような構成になります。
  Level(matching_value)の値をもとに、-10~+10 の範囲のレベル帯に存在するプレイヤーを
  同一ルームに招待できる仕組みになります。

  仕組みは単純ですが、レベル帯の設定には注意が必要です。例えば2人対戦の格闘ゲームを作るとなった場合、
  プレイヤーレベルの範囲が 0 ~ 100 だとすると、最低 11人以上ログインしてこないと自分の所属ルームに
  ユーザーが入ってこない、なんてこともありえます。
                if( MatchingManager::MATCHING_RULE_LEVEL == rule ){
                // レベルマッチング
                        LevelMatching* pMatching = (LevelMatching*)pMatchingBase;
                        LevelMatching::SearchRoomInfoList list;
                        
                        uint32 level_min = (matching_value < 10)? 0: matching_value - 10;
                        uint32 level_max = matching_value + 10;
                        if( ! pMatching->SearchRoom( level_min, level_max, list ) ) break;

                        if ( 0 < list.size() ){
                                // とりあえず、最初のルームに入室としておく
                                searchRoomId = list[ 0 ].roomInfo.room_id;
                        }
                }
   

 ■ マッチングルームへの入室
  LevelMaching によるマッチングルームの入室処理は以下のような構成になります。
  実行している内容はほとんど ValueMatching と同じです。
  ( 内部処理として ValueMatching と LevelMatching とで入室するルームデータベースが異なるくらいの違いです。)
                        if ( MatchingManager::MATCHING_RULE_LEVEL == rule ){
                        // レベルマッチング
                                LevelMatching* pMatching = (LevelMatching*)pMatchingBase;
                                
                                MatchingBase::CreateRoomInfo createRoomInfo = {
                                        createRoomId,
                                        m_RoomCharaMax
                                };
                                LevelMatching::CreateTableInfo createTableInfo;
                                createTableInfo.level = matching_value;
                                if ( ! pMatching->CreateRoom( createRoomInfo, &createTableInfo ) ) break;
                        }
   


追加した LevelMatching.cpp をmake対象に加える

 make して実行する前にもう1つ、追加した LevelMatching.cpp を作成しただけでは
 サーバビルド(make)の対象になっていません。コンパイルするためには make 対象に加える必要があります。

 マッチングサーバのコンパイル対象ファイルリストについては、/server/matching/source.mk に記載されています。
 このファイルを開き、以下の1文を追加しましょう。
APPSRCS +=  $(SRCD)/sample/matching/LevelMatching.cpp
  


▲前のページへ
次のページへ▼