競技プログラミング好きの allegrogiken です。
2022/09/23(金・祝) にKLab様により「天下一 Game Battle Contest 2022」が開催されていました。今回はこちらの概説、および参加した記録と感想を述べていきたいと思います。

天下一 Game Battle Contest とは

KLab様により 2020年から年1, 2回ほど開催されているコンテストです。

「Game Battle Contest」の意味するところですが、ボードゲームのAIを作って競うコンテスト・・という表現が簡単でしょうか。参加者はコンテストごとの題材(ゲーム)に従って動くAIを作成し、ゲームに参加させることになります。

より具体的には、期間中に所定のAPIを叩くことでゲームに参加したり、行動を実行できます。APIが叩ければ良いので、プログラミング言語はなんでもよいです。究極、ノーコードツールを使うとか、APIを自分で叩き続けるだけでも問題はありません。ただし、リアルタイム性が求められるので、現実的ではないと思います。

ゲームはコンテストの開催開始と同時に始まリ、4時間ほどで終了します。参加者は4時間の間に実装を行い、プログラムをAIに参加させる必要があります。スコアの算出ルールによっては、早くプログラムを完成させることも一つの競争要素になります。

今回のお題

開催と同時に専用のリポジトリが閲覧可能になります。今回はこちらです。
https://github.com/KLab/tenka1-2022

ゲーム自体の雰囲気は公式の実況動画(アーカイブ)を見るのが手っ取り早いと思います。
https://www.youtube.com/watch?v=JNwDmtjbu0A

ルールを簡略化して説明するとこんな感じです。

  • 6人で立方体上のマス目を塗り合う陣取りゲームが開催される
  • 他人の塗りを壊すこともできるけど、時間(ターン数)がかかる
  • 2人以上で同じマスを塗ろうとした場合、基本的には相殺(何もしなかったこと)となる
  • スコアは「塗られたマス目の数」を試合後半のターン毎に累計したもので、大きいほど良い順位になる
  • コンテスト期間中、ゲームは複数回並列で開催される
  • 成績によって Class 分けが実施され、 Class内 でマッチングされる

ゲームの様子

参加者がやるべきことは?

「私がやったこと」基準での列挙になりますが・・
概ね参加者全員がやっているであろうことを時系列で紹介します。

  • 公式のリポジトリにあるドキュメントをよく読む
  • マッチング参加用プログラム(天下一Runner)の動かし方を学ぶ
  • 天下一Runnerとサンプルプログラムを組み合わせて、練習試合を試す
  • サンプルプログラムを自分好みに改変して、練習試合で試す
  • 納得できる出来になったら本試合に参加する
  • 試合の経過を見ながらプログラムの改修を繰り返す

以下、詳細です。

公式のリポジトリにあるドキュメントをよく読む

最初にやるべきことです。叩くべきAPIの仕様、スコアの計算方法、ビジュアライザの使い方などがわかります。

スコアの計算方法はかなり重要です。これによって組むべきプログラムの方針が変わります。

マッチング参加用プログラム(天下一Runner)の動かし方を学ぶ

今回は「マッチングAPI」があり、開催中にゲームが複数並列で発生するコンテストでした。
そのため参加者はマッチングからAPIを叩く必要がありますが、それを簡単にするためのユーティリティが配布されました。
このユーティリティの使い方もしっかりとマニュアルがあり、熟読することで実装を簡略化してスムーズな参加ができるようになっています。

天下一Runner

サンプルプログラムを動かして練習試合を試す

ランダムに動く(あるいは、全く動かない)CPU5人を相手に練習試合をすることができます。
これは上述したユーティリティによって開始できます。
また、練習試合の様子はビジュアライザで詳細に見ることができるのでとても便利です。

サンプルプログラムを自分好みに改変して、練習試合で試す

コンテストが4時間しかないので、提供されたサンプルプログラムを改変していくのが時間的にはお得です。私は普段D言語を使って競技プログラミングしていますが、今回は go のサンプルをもとに進めていきました。

サンプルのままでもゲームに参加できますが、何かしらのアレンジをしないとおそらく勝つことはできません。何かしらの意志をプログラムに込めて練習試合で試すことができます。

納得できる出来になったら本試合に参加する

意図通りの動きが練習試合で確認できたら、本試合に参加してみましょう。
本試合は最大で4つまで同時並行で行われます。

試合の経過を見ながらプログラムの改修を繰り返す

試合の結果、ターンごとの動きなどはビジュアライザで全てトレースできます。
負け試合などを分析してプログラムを改修することを繰り返しましょう。

天下一Runner の設定によっては試合ごとに動かすプログラムを変えることもできます。
対戦相手が似通っていて、戦略が読まれているようなケースでは有効かもしれません。

ラウンドロビンで2種類のプログラムを稼働させる

参加記録

結果

結果としては真ん中の下、くらいの順位になったと思います。最終Classは4だったはず。
対人戦らしいプログラムはほとんど考慮できず、「できるだけ網羅的にマスを訪れて塗れるだけ塗れ!」みたいなプログラムを書いていました。下図は動きのイメージです。

天下一ホワイトボード

ただ、開催期間の間最も調子が良かった時は Class2 まで行けていました。
時々APIが叩けていなくて動かない相手が発生するのですが、そういう試合で強かったようです(笑)

感想

2021 Automn のコンテストに続いて参加しましたが、毎回作り込みが素晴らしいと思います・・!
特にビジュアライザの作りはかなり細かくて、試合の動きを完全に見直せる親切設計でした。これ作るのはめちゃくちゃ大変そうだな・・・! と感謝しながらの参加でした。

途中ゲームサーバがおかしくなるトラブルなどもありましたが、30分程度で復旧してよかったです。開催、運営、誠にお疲れ様でした!

このコンテスト、毎回作り込みが素晴らしいので参加者数が増えてほしいと思います!!
この記事を見て面白そうだと思った人は、ぜひ公式のTwitterをフォローして来年に備えてください。