CodinGameローカル実行
CodinGameのいくつかのゲームは自分のPC上でプレイができる
※ただしボスAIは無いので自分のAI同士を戦わせるプレイしかできない
※他人のAIコードを入手できる方法でもあれば対戦もできるかもしれない(仲間内でこっそり?)
※CodinGameSDKを使えばゲームを自作できてそれも実行できるし、公式公開にしない自作なら仲間内でプレイも可能
実行に必要なPC環境
必須
- Java8 (ゲームのコンパイルや実行に必要)
- JDK8 (ゲームのコンパイルに必要)
- Maven (ゲームのコンパイルに必要)
- ES6JavaScriptを実行できるブラウザ(最近のブラウザはほとんど対応済みらしい) (ゲームのビジュアライザを見るのに必要)
推奨
- Eclipse か IntelliJ のIDE(開発統合環境) (ビルドや実行や楽です)
- git (ゲームのソースコードの入手を説明ページの通りのgit cloneコマンドでやるなら必要(※ゲームのソースコードはzip形式でもダウンロードできる))
リンク
※WindowsならJava/JDKはインストーラに従って全部ぶっこむ。MavenはBinaryをzipでダウンロードして展開して展開したディレクトリのbinディレクトリを環境変数PATHというやつに追加すればよい。
※
Linuxならディストリのパッケージマネージャ(apt/yumなど)使ってOpenJdk8やMavenを簡単にインストールできるかもしれない(未確認)
※Mavenはプロジェクトのコンパイルのときなどでプラグインや依存関係などをダウンロードで取得するためインターネット接続が必須
遊べるゲーム一覧
※それぞれのゲームのルールはCodinGameのそれぞれのゲームのページを開かないと分からないかも
※依存してるCodinGameEngine(SDK)のバージョンがゲームごとに違う
対戦プレイタイプのゲーム
1人プレイタイプのゲーム
IDEを使用した実行までの簡易説明(SDKの説明まんま)
※eclipseで試したところ簡単にできました
1. ゲームのGitHubのページにからソースコードを入手する(git cloneコマンドで取得して展開するか、zip形式で取得して展開(伸張/解凍)する)
2. IDE(Eclipse/IntelliJ)で展開したソースコードのディレクトリをMavenプロジェクトとしてインポートする
3. "src/test/java/Main.java"のファイルを自分のAIを呼び出せるように変更を加える
4. IDEの実行機能で"src/test/java/Main.java"を実行するとゲームが実行される (コンソール出力でゲームの様子がズラっと表示される)。ゲーム実行後はWebサーバーが実行されるのでブラウザで
http://localhost:8888/ のページを開いてゲームの結果を眺めることができる
※Unleash The Geekなど一部のゲームではファイル名がMain.javaになってない
※Botters of the Galaxyなど一部のゲームではプロジェクトディレクトリの位置が違う(親ディレクトリがある)ので注意する
src/test/java/Main.javaの編集(必須)
自分のAIを呼び出せるように編集する必要がある。
ゲームのシード値なども設定できる。
※Unleash The Geekなど一部のゲームではファイル名がMain.javaになってない
※Botters of the Galaxyなど一部のゲームではプロジェクトディレクトリの位置が違う(親ディレクトリがある)ので注意する
※依存してるCodinGameEngine(SDK)のバージョンがゲームごとに違うため編集できることが多少異なる
API名 |
説明 |
addAgent |
自分のAIを実行するためのコマンドを文字列で与える 対戦人数分このAPIを呼び出す必要がある。 ※JavaでAIを書くならsrc/test/java/に自分のAIのソースファイル置いてAIのエントリポイントのクラスのClassクラスを引数で与えるでも実行できる |
setSeed |
ゲームのシード値を設定する ※このAPIを呼ばない場合はランダムなシード値になるらしい(未確認) |
setLeagueLevel |
ゲームのリーグのレベルを設定する。&()woodリーグが存在する場合woodリーグごとにゲームのルールや制約が異なるので注意 woodリーグをプレイしたいわけでないなら最高値を設定しなければならないがそのレベルの値はゲームのソースコードのどこかに書いてあり探す必要がある。 src/main/java/ディレクトリ以下のどこかにあるReferee.javaに書いてあることが多い |
setGameParameters |
ゲームによってはPropertiesクラスによってより細かいゲームの設定を行うことができる。詳細は各ゲームに説明が書いてある場合もある |
start |
ゲームを実行してその後にサーバーを起動する。引数にサーバーのポート番号を指定できて省略すると8888がポート番号になる |
simulate |
ゲームを実行するがサーバーは起動しない。戻り値がゲーム結果 |
API名 |
説明 |
addAgent |
自分のAIを実行するためのコマンドを文字列で与える ※JavaでAIを書くならsrc/test/java/に自分のAIのソースファイル置いてAIのエントリポイントのクラスのClassクラスを引数で与えるでも実行できる |
setTestCase |
テストケース(ゲームステージのようなもの)のファイル名を文字列で指定する。テストケースを1つだけ実行したい場合に使う |
setTestCaseInput |
複数のテストケースを実行したいときに使う。テストケースのファイル名を改行区切りの文字列で指定する |
start |
ゲームを実行してその後にサーバーを起動する。引数にサーバーのポート番号を指定できて省略すると8888がポート番号になる |
simulate |
ゲームを実行するがサーバーは起動しない。戻り値がゲーム結果 |
IDE(Eclipse/IntelliJ)なしでやる方法
ゲーム本体をコンパイル・ビルドするだけならMavenをそのまま使えるが(Mavenが依存関係を自動解決してくれる)
ゲームを実行するときはMavenをそのまま利用できないために実行時の依存ライブラリの解決をなんらかの方法で処理しなければならない、これらはその方法の提案
もっと賢い方法があるかもしれない (※ mvn exec:java -Dexec.mainClass=Main -Dexec.classpathScope=test -Dexec.cleanupDaemonThreads=true -Dexec.daemonThreadJoinTimeout=400000 -Dexec.stopUnresponsiveDaemonThreads=true はsrc/main/resources/view/assetsを見つけられずエラー?)
※Javaにおけるクラスパスの指定でのパス区切り文字はWindowsがセミコロン(;)、Linuxがコロン(:)
※pom.xmlはMavenプロジェクトファイル
※コンパイル物をjarにパッケージしないことが前提の作りになってる
実行時の依存関係解決をライブラリをプロジェクトにコピーして処理 (ファイル数や合計ファイルサイズが増加)
Java8,JDK8,Mavenをインストールしたのなら
1. ゲームのGitHubのページにからソースコードを入手する(git cloneコマンドで取得して展開するか、zip形式で取得して展開(伸張/解凍)する)
2. "src/test/java/Main.java"のファイルを自分のAIを呼び出せるように変更を加える
3. コマンドプロンプトやシェルでゲームのソースコードのあるディレクトリにカレントを移動し mvn test-compile を実行する。(実行するとtargetディレクトリが作成される) (ゲーム本体を改造したり、pom.xmlの依存バージョンを変更するたびにmvn compileを実行する必要がある)
4. mvn dependency:copy-dependenciesを実行する。実行すると依存ライブラリがtarget/dependencyディレクトリにコピーされる (pom.xmlの依存バージョンを変更するたびにmvn dependency:copy-dependenciesを実行する必要がある) (pom.xmlを編集してpackageに連動して実行されるようにしてもよい)
5. Windowsコマンドプロンプトなら
java -cp target/test-classes;target/classes;target/dependency/* Main Linuxシェルなら
java -cp target/test-classes:target/classes:target/dependency/* Main (
Mainは編集したsrc/test/java/Main.javaのクラス名) を実行するとゲームが実行されて、その後サーバーが起動するのでブラウザで
http://localhost:8888/ のページを開いてゲームの結果を眺めることができる
※AIをJavaで書いていてsrd/test/java/Main.javaからClassファイルとして呼び出す場合、AIのコードを編集したら mvn test-compile を実行してAIをコンパイルし直す必要がある
※一部のゲームではファイル名がMain.javaになってない
※Unleash The Geekではsrc/test/java/UTG2019Main.javaが対象ファイルであり実行コマンドで指定するクラス名はUTG2019Mainとする
※Code A La Modeではsrc/test/java/com/codingame/game/sample/Main.javaが対象ファイルであり実行コマンドで指定するクラス名はMainではなくcom.codingame.game.sample.Mainとする
※A Code of Ice & Fireではsrc/test/java/SkeletonMain.javaで(略
※Botters of the Galaxyなど一部のゲームではプロジェクトディレクトリの位置が違う(親ディレクトリがある)ので注意する
実行時の依存関係解決を長大なクラスパス指定で処理 (実行コマンドが長大化)
Java8,JDK8,Mavenをインストールしたのなら
1. ゲームのGitHubのページにからソースコードを入手する(git cloneコマンドで取得して展開するか、zip形式で取得して展開(伸張/解凍)する)
2. "src/test/java/Main.java"のファイルを自分のAIを呼び出せるように変更を加える
3. コマンドプロンプトやシェルでゲームのソースコードのあるディレクトリにカレントを移動し mvn test-compile を実行する。(実行するとtargetディレクトリが作成される) (ゲーム本体を改造したり、pom.xmlの依存バージョンを変更するたびにmvn compileを実行する必要がある)
4. mvn dependency:build-classpath -Dmdep.outputFile=cp.txtを実行する。実行すると依存ライブラリへのクラスパスが書かれたcp.txtが生成される。この中身を実行時のクラスパス指定に追加する。(pom.xmlの依存バージョンを変更するたびにmvn dependency:build-classpath -Dmdep.outputFile=cp.txtを実行する必要がある) (pom.xmlを編集してpackageに連動して実行されるようにするのは少しやりすぎか)
5. Windowsコマンドプロンプトなら
java -cp target/test-classes;target/classes;"ここにcp.txtの中身を続ける" Main Linuxシェルなら
java -cp target/test-classes:target/classes:"ここにcp.txtの中身を続ける" Main (
Mainは編集したsrc/test/java/Main.javaのクラス名) を実行するとゲームが実行されて、その後サーバーが起動するのでブラウザで
http://localhost:8888/ のページを開いてゲームの結果を眺めることができる
バッチスクリプトやシェルスクリプトを利用して長大なコマンドを一発実行できるようにするといいのかも
コピペを使わないトリックチックな方法としては
Windowsのコマンドプロンプトからなら
for /f %x in (cp.txt) do java -cp target/test-classes;target/classes;%x Main
※バッチスクリプト内に書く場合は%xを%%xに修正する必要あり
Linuxのシェルからなら
java -cp target/test-classes:target/classes:`cat cp.txt` Main
などがあるかも
※AIをJavaで書いていてsrd/test/java/Main.javaからClassファイルとして呼び出す場合、AIのコードを編集したら mvn test-compile を実行してAIをコンパイルし直す必要がある
※一部のゲームではファイル名がMain.javaになってない
※Unleash The Geekではsrc/test/java/UTG2019Main.javaが対象ファイルであり実行コマンドで指定するクラス名はUTG2019Mainとする
※Code A La Modeではsrc/test/java/com/codingame/game/sample/Main.javaが対象ファイルであり実行コマンドで指定するクラス名はMainではなくcom.codingame.game.sample.Mainとする
※A Code of Ice & Fireではsrc/test/java/SkeletonMain.javaで(略
※Botters of the Galaxyなど一部のゲームではプロジェクトディレクトリの位置が違う(親ディレクトリがある)ので注意する
最終更新:2020年04月11日 01:12