競技プログラミング > CodinGame > ローカル実行

CodinGameローカル実行


CodinGameのいくつかのゲームは自分のPC上でプレイができる
※ただしボスAIは無いので自分のAI同士を戦わせるプレイしかできない
※他人のAIコードを入手できる方法でもあれば対戦もできるかもしれない(仲間内でこっそり?)
※CodinGameSDKを使えばゲームを自作できてそれも実行できるし、公式公開にしない自作なら仲間内でプレイも可能

やりかたはこのGitHubのページに書いてある
https://github.com/CodinGame/codingame-game-engine/tree/master/playground/getting-started

tutorial-2-multiplayer.mdが対戦プレイタイプのゲームの説明

tutorial-3-soloが1人プレイタイプのゲームの説明






実行に必要な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)のバージョンがゲームごとに違う

対戦プレイタイプのゲーム

タイトル 概要 ソースコード 備考
Legends Of Code And Magic カードゲームっぽいやつ https://github.com/CodinGame/LegendsOfCodeAndMagic
Ultimate Tic-Tac-Toe ○×ゲームっぽいやつ https://github.com/CodinGame/game-ultimate-tictactoe
Xmas Rush https://github.com/CodinGameCommunity/XmasRush
Unleash The Geek(Crystal Rush) https://github.com/CodinGameCommunity/UnleashTheGeek
Ocean of Code 戦艦ゲームっぽいやつ https://github.com/CodinGameCommunity/ocean-of-code
Code A La Mode https://github.com/csj/code-a-la-mode
Code Royal ストラテジーぽいやつ https://github.com/csj/code-royale
Botters of the Galaxy https://github.com/Illedan/BOTG-Refree/tree/master/team-1%20project
Bit Runner 2048 https://github.com/Illedan/Bit-Runner-2048
Code of Kutulu https://github.com/JohnnyGuye/code-of-kutulu/tree/master/codeOfKutulu
A Code of Ice & Fire https://github.com/Azkellas/a-code-of-ice-and-fire
Cultist Wars https://bitbucket.org/Nixerrr/cultist-wars/src/master/
Vindinium https://github.com/eulerschezahl/vindinium
Yavalath https://github.com/MultiStruct/Yavalath/

1人プレイタイプのゲーム

タイトル 概要 ソースコード 備考
A-Star-Craft https://github.com/CodinGameCommunity/A-Star-Craft
NumberShifting https://github.com/eulerscheZahl/NumberShifting


IDEを使用した実行までの簡易説明(SDKの説明まんま)


※eclipseで試したところ簡単にできました

Java8,JDK8,MavenとIDE(Eclipse/IntelliJ)をインストールしたのなら
基本的にこれらの説明のようにやればよい
tutorial-2-multiplayer.mdが対戦プレイタイプのゲームの説明
tutorial-3-soloが1人プレイタイプのゲームの説明

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ドキュメント https://codingame.github.io/codingame-game-engine/com/codingame/gameengine/runner/MultiplayerGameRunner.html
MultiplayerGameRunnerのインスタンスのAPI
API一覧
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 ゲームを実行するがサーバーは起動しない。戻り値がゲーム結果

  • 1人プレイタイプのゲーム
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