接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

Codingameのローカル対戦環境をdockerでポンする

はじめに

Codingameのローカル対戦環境を用意するときに、Java周りの環境構築が難しかったのでdockerでポンするようにした
cg-brutaltesterを使用して、CLIでローカル対戦を行うことを目的としています
GUIで対戦を見たい場合の環境構築は以下を参照してください

coonevo.hatenablog.com

前提

dockerの詳しい説明は省きます
docker-desktopなどをインストールしてdockerコマンドが使えるようになっていればできるはずです

環境構築

必要なリポジトリをcloneする

git clone https://github.com/EmulsionBondo/CodingameLocalBattle.git
cd CodingameLocalBattle

CodingameのRefreeをcloneする

利用可能なものの一覧はこちらにあります
今回は通称おばあちゃんことFall Challenge2020のものをcloneします
cg-brutaltesterには記載されていませんが、対応してくれたリポジトリがあったのでそちらを使用します*1

git clone https://github.com/FrogChopi/FallChallenge2020_brutaltester

cg-brutaltesterの実行ファイルをダウンロード

curl -OL https://github.com/dreignier/cg-brutaltester/releases/download/1.0.0/cg-brutaltester-1.0.0.jar

Refreeのビルド

docker run -it --rm --name my-maven-project --platform linux/amd64 -v $PWD/FallChallenge2020_brutaltester/:/usr/src/mymaven -w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install package
mv FallChallenge2020_brutaltester/target/fall-2020-1.0-SNAPSHOT.jar ./

ローカル対戦環境のdockerを立てる

docker build -t local_battle --platform linux/amd64 ./
docker run -it -d --name local_battle --platform linux/amd64 -v $PWD:/work local_battle

docker上でcg-burutaltesterを動かす

以下のコマンドでローカル対戦が実行されます

docker exec local_battle java -jar cg-brutaltester-1.0.0.jar -r "java -jar fall-2020-1.0-SNAPSHOT.jar" -p1 "python3 test.py" -p2 "./a.out" -n 1

-p1でplayer1のAI、-p2でplayer2のAI、-nで対戦数を指定します
a.outのような実行ファイルを指定する場合、docker上の環境と違うとエラーが出るかもしれないです
C++の場合、以下でdocker上でビルドできるようにしています
プログラムはpathを指定するなり、CodingameLocalBattleディレクトリに持ってくるなりよしなにしてください

docker exec local_battle g++ -std=gnu++17 -O2 a.cpp -o a.out

実行が終わると以下のような出力が出ます

01:40:47,055 INFO  [com.magusgeek.brutaltester.Main] Referee command line: java -jar fall-2020-1.0-SNAPSHOT.jar
01:40:47,059 INFO  [com.magusgeek.brutaltester.Main] Player 1 command line: python3 test.py
01:40:47,059 INFO  [com.magusgeek.brutaltester.Main] Player 2 command line: ./a.out
01:40:47,059 INFO  [com.magusgeek.brutaltester.Main] Number of games to play: 1
01:40:47,060 INFO  [com.magusgeek.brutaltester.Main] Number of threads to spawn: 1
01:40:53,751 INFO  [com.magusgeek.brutaltester.GameThread] End of game 1     0.00% 0.00%
01:40:53,754 INFO  [com.magusgeek.brutaltester.Main] *** End of games ***
+----------+----------+----------+
| Results  | Player 1 | Player 2 |
+----------+----------+----------+
| Player 1 |          | 0.00%    |
+----------+----------+----------+
| Player 2 | 0.00%    |          |
+----------+----------+----------+

こどげの初期プログラムを使っているのでどちらも0.00%になっていますが、ちゃんと動くプログラムに差し替えれば勝率が変動します

終わりに

Javaの環境にブチギレた結果できあがった
cg-brutaltesterに対応したRefreeが公開されていれば、基本的には同様に動くはず
動かないとかあればお気軽にどうぞ
GUIの方もそのうち試して見るかも

*1:対応リポジトリがない場合でもpom.xmlの修正とCommandLineInterface classを追加することで同様に環境構築が出来ます。じろうさんのブログでその手順が紹介されているのでコンテスト開催してすぐなどまだ対応リポジトリがない場合はそちらを参照ください codingame 2023春 ローカル環境構築(自分用メモ) - じろうのブログ