オンライン大会用の対戦マッチングツール
2021/01/24

昨今の事情でオンライン大会が開かれることがあるかと思いますが、 そこで使える対戦マッチングツールを作る場合のプログラミングを紹介していこうと思います。 サンプルとしてひとつ作ったので、今回はひとまずその使い方を紹介します。
このサンプルではスイスドローという方式を用いています。 トーナメント形式と同じ試合回数で、 優勝者および各順位を決めることができます。 実際に使っていただいて大丈夫です。
スイスドロー
使い方
まずはツールの使い方を紹介します。 上の「スイスドロー」の中が変化する仕組みになっています。
最初に参加メンバーを登録
まず最初に参加メンバーを登録します。
例えば以下のように、参加者の名前を1人あるいは1チームずつ入れて改行してください。

すべての入力が完了したら「ゲームスタート」を押下してください。 なお名前にはスペースなど一部文字が使えません。
対戦が組まれるので結果を入力して送信
ゲームスタート後は以下のように対戦が組まれます。
1回戦は完全ランダム抽選です。 ただし本記事公開後に改修し、 「初回は上半分と下半分が当たるように抽選する」にチェックが入っていた場合は上下半分に分けて上と下で当たるようにランダム抽選しています。 これにより例えば強い順に並べることで初戦では強い人同士、弱い人同士が当たりづらくなります。 また各チームから複数人が参加する個人戦では、チームごとに固めて登録すれば同チーム同士で当たりづらくなります。
2回戦はできるだけ勝者同士、敗者同士が当たるように、 3回戦以降はできるだけ勝数と負数が同じ者同士が当たるようにしています。 2回戦以降も、同条件の中ではランダムに決まります。

これで対戦して、結果が出たら勝った方にチェックを入れて、 全部の対戦結果をチェックしたら「結果送信」を押下してください。 すると次の対戦カードが組まれますので、これを繰り返します。
全勝者が出たら最終順位を確認
全勝者が出たら大会終了です。 大会終了時には以下のように最終順位が表示されます。 画像は6位までで切れていますが全員分出ます。

どうでしょう?使い方は簡単そうですよね?
順位の決め方
サンプルツールの順位は、以下の順番に判定して決定してます。
(1)勝数の多い方
(2)対戦相手の\((勝数-負数)\)の合計の高い方(「対戦P」として表示)
(3)上記(1)(2)が同じ場合は先に勝った方
(4)上記すべて同じ場合は同順位
要は、より多く勝てば、より強い相手と当たっていれば、より早く勝っていれば、順位が上になります。 ですので2位以下の順位は運要素が大きくなります。
なお、不戦勝の際の対戦相手は、\((試合数+1)\)回負けているものとして計算しています。
スイスドローと言っても色々ある模様
一言でスイスドローと言っても、色々な方式があるようです。
対戦相手や順位の決め方にも色々あるようなので、 今回のサンプルでは今後のプログラム紹介も考慮しつつ独自にルールを決めました。
スイスドローとリーグとトーナメントを比較
スイスドローをざっくり説明すると、 各対戦者がトーナメントと同じ試合数を行い、 リーグと同様に順位が出るものだと思います。 リーグとトーナメントのいいとこ取りかなと。
比較して表にしてみました。
スイスドロー | リーグ | トーナメント | |
---|---|---|---|
最終順位 | 1位から最下位まで | 1位から最下位まで | 1位からベスト〇〇まで |
試合回数 | 少ない | 多い | 少ない |
組み合わせ運 | 小さくない | 無い | 大きい |
事前決定 | 不可(*) | 可 | 可 |
最終順位
最終順位は、トーナメントは勝ち上がらないとそこで終了ですので下位は順位が出ません。 スイスドローとリーグは1位から最下位まで出ます。
試合回数
試合回数は、各試合を同時並行でできるならば、 リーグは全員と対戦するので\( (参加者数-1) \)回になります。
スイスドローとトーナメントは、参加者数をどんどん半分にしていって1以下になるまでの回数の数ですね。 例えば8チームなら8→4→2→1で3回。 数学な得意な方には \( (log_2 参加者数) \) 回という数式の方がわかりやすいかも。
ただし、トータルの試合数はトーナメントが圧倒的に少ないので、 例えば将棋の大会で将棋盤と駒が1セットしか無く同時並行でできない場合はトーナメントが最小になります。 オンライン対戦なら基本的には気にしなくて良いでしょうけれど。
組み合わせ運
組み合わせ運は、リーグは全員と当たるので有りません。 厳密に言うと対戦順番によって精神的/肉体的に疲れているなどで影響があることもあるでしょうけれど、 ここでは無しとしておきます。 トーナメントは、強いチームでも1回戦で優勝者に当たると初戦敗退のため運の影響が最もが大きい。 スイスドローなら同ケースでも2回戦以降で勝ちを重ねられます。 それでも運の影響が小さいとは言えないですけれど。
事前決定
本サンプルでは対戦結果に基づいて次の対戦相手を決めているので、組み合わせの事前決定が不可能です。 気軽に対戦相手を変更できない大会では使用が難しいでしょう。
ただし、参加者がランク付けされていて、それを元に対戦相手を決める形式のスイスドローもあるようなので、 スイスドローが必ず事前決定不可というわけではないようです。
リーグとトーナメントは事前に対戦順番を決められますね。
本サンプルも1度試してみました
本記事の公開前に1回だけ、私自身がこのサンプルを用いて将棋部でオンライン部内大会を開いてみました。 スムーズに最終順位を決めるところまでできたと思います。 まあ1回実施しただけなのでデバッグ回数は正直足りないかなあ。
今回採用したスイスドロー形式は、 私が知っている範囲ではトレーディングカードゲームの店舗大会でよく使われています。 1人vs1人や、チームvsチームの形式で対戦するものならば、その大会に使えるハズです。 ただし多人数同時参加で生き残りをかけて戦うものには使えません。
遅刻者も参加できる優しい世界に
実際に大会をするとなると遅刻してくるメンバーがいるのが普通ですよね。 え?そうでもない?
遅刻禁止がシンプルですが、 せっかく来ていただいたのだから途中参加できた方が良いと思うので、 名前を入れて一人ずつ増やせる仕組みも作りました。 優しい世界。
ただし不在時の対戦をすべて不戦敗の扱いにしていますので、 遅刻した場合は優勝できません。
全勝が出る前に時間切れになったらその時点の順位で
スイスドローは対戦回数が少なく済みますが、それでも人数が多ければ最終順位が決まるまでの対戦数は増えていきます。 確定前に時間切れになることもあるでしょう。
そういった場合を考慮して、その時点での順位も表示するようにしました。 それを用いて大会結果を決めることもできるようになっています。
まとめ
スイスドロー形式の対戦マッチングツール自作サンプルの使い方を紹介しました。
新型コロナウイルス感染症対策でオンライン〇〇が増えましたよね。 そのためこうしたオンライン対戦用のツールの需要が増しているかなと思います。 当ブログではここから、同様のツールを作る場合のプログラミングについて順次紹介していこうと思います。
ちなみにこのサンプルの途中参加や途中終了のための機能は、後から追加したものです。 最初の実装時には気づかなかったのですが、 実際に大会を主催者として開催することにしたときに、欲しくなりました。 このように、実際にやってみないと思いつかないことってありますよね。 こうしたユーザー視点は常に持っていたいものです。公私ともに。
補足
・本ツールはWebブラウザー内で完結するプログラム実装になっていますので、入力された情報をネットワーク経由で見られることはありませんが、 それでも一般的にこうしたところに本名は入れない方が良いでしょう。 オンライン対戦ならそこで使用するニックネームを入れるのがわかりやすいと思います。・数式表現にMathJaxを使用しております。助かります!
・画像内のラスタライズ文字フォントにOpen Font LicenseのNoto Sans Japaneseを使用しております。
・画像内のラスタライズ文字フォントにOpen Font LicenseのNoto Sans Monoを使用しております。
カテゴリー:スイスドロー,アプリケーション
Copyright (C) Logic Lovers Inc.