【目次】
似通ったレベルのユーザーとマッチングする
新規マッチングルール用のファイルを準備する
加えたマッチングルールを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
