【CodinGame】初心者用-ゲームAIプログラミングコンテスト解説（TronBattle)

# はじめに
この記事は CodinGame の Bot Programming (ゲームAI) の始め方を、日本語で解説することを目的に作りました。
興味はあったけどやり方がわからない…　といった方の参考になれば幸いです。

本記事では、ログインから実際にランキングに自分のプログラムを提出するところまでを、解説します。
今回は、TronBattle という初心者向けのゲームを扱います。

# ログイン　https://www.codingame.com/start
![Image 005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657480/6aaf57ce-718e-81a2-c25b-99b06bc5cb0a.png)

SIGN UP からアカウントを作成します。好きな方法で作成してください。

* Google
* Facebook
* GitHub
* LinkedIn
* email と パスワード

# ゲーム選択
![Image 007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657480/9e58b3ab-5377-f313-a74a-858047d3baf4.png)

こちらがホーム画面です。https://www.codingame.com/home
ここから　COMPETE → BOT PROGRAMMING → TRON BATTLE と進んでください。

***
![Image 001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657480/ec68b5d9-9916-3619-229d-3849fe3b991f.png)

こちらが TRON BATTLE のページです。
https://www.codingame.com/multiplayer/bot-programming/tron-battle

WHAT WILL I LEARN? にはこのゲームの解説が書いてありますが、読まなくても大丈夫です。
プレイするには「JOIN」をクリックします。

# ゲーム画面解説
![Image 003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657480/3a4de138-1bf0-a512-e1f3-db98e1d3b905.png)


こちらがプログラム開発画面です。

1. 現在のリーグと順位（最初はWood 2から始まります）
2. 実際のゲーム画面
3. ルール説明
4. エディタ（左上から言語を選択できます）
5. ローカル対戦の対戦相手
6. 新しいローカル対戦の実行（②の画面で対戦が始まります）
7. 前回の条件でローカル対戦の実行
8. プログラムを提出
9. ローカル対戦の順位(⑥を押すと表示)
10. コンソールアウトプット(ゲームに関する情報が表示されます) (⑥を押すと表示)

#ルール説明
まずはルールを読みましょう。
ここにはゲームの進み方、勝利条件、敗北条件、入力の内容、出力の仕方、制約などが書かれています。
英語ですが、Google翻訳などを用いて、大まかにわかれば十分です。

ざっくり説明すると、フィールド内を順番に進んでいき、先に以下の**いずれかの行動をとると負け**です。

* すでに自分が通った道にぶつかる
* すでに相手が通った道にぶつかる
* フィールドの外に出る
* その他プログラムのエラーなど

最後の一人となった人の勝ちとなります。

<details><summary>**ルール説明全文の日本語訳**（クリックして展開）</summary><div>
###目標
このゲームでは、あなたは伝説のトロンサイクルを運転し、ゲームグリッド内でほかのプログラムと戦うことができるプログラムです。
**ライトサイクルは通った後に光の線を残しながら、まっすぐ進むか、90度曲がります。**それぞれのライトサイクルと線は異なる色であらわされます。**ライトサイクルが進めないとき、光の線に衝突したとき、またはゲームグリッド外に出ると、ライトサイクルは即座に消滅します。**
最後まで残ったライトサイクルが勝者となります。あなたの目標はゲーム内で1位になることです。プログラムがアリーナに送られると、２～４個（※リーグが上がるにつれて増えていきます）のライトサイクルが集まって、お互いに競い合います。バトルに勝てば勝つほど、ランクが上がります。

###ルール
各バトルは二人で行われます。各プレイヤーはバトル中、ターンに沿ってプレイします。あなたのターンが来ると次のことが起こります：

+ あなたのプログラムの標準入力に、プレイヤー達の現在地のグリッドの情報が送られます。
+ 入力が現在のターンで読み込まれたら、あなたのAIは、次の行動の情報を標準出力に送らなければなりません。**各ターンの出力はライトサイクルの次の方向を表す一行の文字列です。UP、DOWN、LEFT、RIGHTのうちいずれか**
+ あなたのライトサイクルは、あなたのAIに与えられた方向に進みます。
+ そうしたら、あなたのAIは、次の自分のターンの情報などを待たなければいけません。その間、ほかのプレイヤーのAIがあなたがやったのと同じように、情報を受け取ります。

**もしあなたのターンが来て、あなたのAIが素早く出力を出せなかった場合、ルールで認められない出力をした場合、またはあなたの出力がライトサイクルを障害物に突っ込ませるものだった場合、あなたのプログラムは負けとなります。**

もしほかのAIがあなたより先に敗北した場合、そのプレイヤーの線は消滅し、ゲームは最後の一人になるまで続きます。

ゲームグリッドは横３０＊縦２０です。各プレイヤーはランダムな場所からスタートします。

###勝利条件
最後まで生き残ること

###ゲームの入力

####各ターンごとの入力
1行目：　2つの整数NとPが与えられます。Nは総プレイヤー数、Pはこのゲーム内でのあなたのプレイヤーナンバーです。

以下N行：　各プレイヤーごとに一行です。最初の行がプレイヤー０（プレイヤーナンバー）、次がプレイヤー１、と続きます。それぞれの行はX0, Y0, X1, Y1の4つの値からなります。（X0, Y0)は光の線の初期位置（尻尾）の座標です。（X1, Y1)は光の線の現在地（頭）の座標です。もしプレイヤーが敗北した場合、そのプレイヤーのX0, Y0, X1, Y1はすべて-1になります。（このプレイヤーの光の線は消滅します）

####各ターンの出力
一行でUP、DOWN、LEFT、RIGHTのうちいずれかです。

####制約
N == 2
0 ≦ P ≦ N
0 ≤ X0, X1 < 30
0 ≤ Y0, Y1 < 20
あなたのAIは各ターンごとに100ms未満で出力しなければなりません

###例
２プレイヤーでのバトルです。あなたは(9, 5)からスタートします。もう一人は(10, 7)からスタートします。あなたが先行です。

```
ターン１　入力(あなたのターン)
2 0         (N P) 
9 5 9 5	    (X0 Y0 X1 Y1)
10 7 10 7   (X0 Y0 X1 Y1)
ターン１　出力
"RIGHT"
(9,5) から (10,5) へ移動します

ターン２　入力 (他のプレイヤーが受け取ります)
2 1         (N P)
9 5 10 5    (X0 Y0 X1 Y1)
10 7 10 7   (X0 Y0 X1 Y1)
ターン２　出力
"UP"
(10,7) から (10,6) へ移動します

ターン３　入力(あなたのターン)
2 0         (N P)
9 5 10 5    (X0 Y0 X1 Y1)
10 7 10 6   (X0 Y0 X1 Y1)
ターン３　出力
"UP"
(10,5) から (10,4) へ移動します

ターン４　入力 (他のプレイヤーが受け取ります)
2 1         (N P)
9 5 10 4    (X0 Y0 X1 Y1)
10 7 10 6   (X0 Y0 X1 Y1)
ターン４　出力
"UP"
(10,6) から (10,5) へ移動します
```
相手のライトサイクルがあなたのライトサイクルの線にぶつかったので、相手の負けとなります。つまりあなたの勝ちです！（すでにターン1であなたが移動済みの(10, 5)に、ターン4で相手が移動しようとしたため）

</div></details>

#ローカル対戦
ルール説明が分かりづらかった場合でも、実際にプレイしてみるとわかりやすくなると思います。
画面右下の PLAY MY CODE を押してみましょう。
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657480/6619cc95-ccaf-a328-0e52-8d8c8646ef95.gif)
画像のように左に進み続ける様子が確認できるかと思います。
これは初期状態のプログラムが、左に進み続けるよう指示を出しているからです。
この線が**自分、相手、壁にぶつかると負け**になります。

実際はこの PLAY MY CODE で自分のAIの挙動を確認し、改善を図ることになります。

# プログラム提出
ランキングに挑戦するには、プログラムを提出する必要があります。
プログラムを提出すると、**同じリーグ内の他のAIとのバトル**が自動で始まります。
プログラムは画面右下の SUBMIT ボタンで提出します。

![Image 004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657480/ce27c606-f32f-2c95-3566-632ef79ab7c8.png)

SUBMITを押すと、画面左の LAST BATTLES タブが自動で開きます。
このタブでは自分のAIの対戦状況が分かります。
BATTLES IN PROGRESS(進行度)が100%になるまで試合は続きます。
**なお、試合は裏で勝手に進むので、タブは閉じても構いません。**

画面中央の青いボタンは、その試合のデータをプログラム編集画面にそのまま送るボタンです。
主に、負けた試合を送って、内容を分析するために使います。

また、画面右側には現在の順位が表示されます。
より上位のリーグに進むには、**そのリーグのボスに勝つ**必要があります。
対戦が100%終了時、ボスより高い成績であれば上位のリーグに自動で進みます。
リーグは Wood 2 → Wood 1 → Bronze → Silver → Gold → Legend と続きます。

# 全体の流れ
プログラム提出 → 負けたバトルの分析 → プログラムの改善 → プログラム提出

基本的にはこの繰り返しです。
これを通して、**現在のリーグのボスに勝つこと**が目標となります。

# さいごに
ご指摘や質問等ございましたら、気軽にコメント欄にお願いします。