Robocode、たまに思い出してはいたのですが、もう日の目を見ることもないかなと思っていました。
しかし、ふとまた気になって、調べてみたところ、ページが更新されている!
Note: In February 2022 a new version of Robocode is introduced named Robocode Tank Royale, which is a new platform for Robocode. This new version supports the .Net 5.0 and Java/JVM platform, and the web platform in the future.
注:2022年2月にロボコードの新バージョンが登場し、ロボコード・タンク・ロワイヤルと名付けられました。この新バージョンは、.Net 5.0とJava/JVMプラットフォームをサポートし、将来的にはWebプラットフォームもサポートする予定です。
新しいサイトはこちら。その名も、「Robocode Tank Royal」。
素晴らしい!
やってみる!!
ファーストバトル
まずは、動かしてみます。
まずは、Javaを動くようにして、リリースページから、GUIアプリのjarファイルをダウンロード。
robocodeフォルダを作成し、robocode-tankroyale-gui-0.13.2.jar を配置します。
さらに、サンプルボットをダウンロードし、フォルダに配置。
いろいろ入ってますが、基本と思われる、MyFirstBot を基に自分のボットを作っていくことにしますので、コピーして、各ファイルの名前も変えます。
こんな感じにしました。
robocode
├── sample-bots-java
│ └── JQBot (コピーした自分のボット)
│ └── MyFirstBot
│ └── ・・・
├─robocode-tankroyale-gui-0.13.2.jar
その場で、
java -jar robocode-tankroyale-gui-0.13.2.jar
でOK。
画面が起動したら、Config メニューから上記の sample-bots-java フォルダを、追加。
Battle > Start Battle で、自分のボットも選択でき、バトル開始できました!
開発環境
ソースはコンパイルするわけではないので、極端な話メモ帳でもなんでも良いわけですが極端な話メモ帳でもなんでも良いわけですが、できればコード補完が効く環境でやりたい。
ところが、若干苦戦しました。
リリースページに置いてある Bot API のjar を参照できれば良いと思うのですが、VSCodeでは結局、参照追加できなかった・・・
ではと思い、C#も試そうと思いましたが、バトルが動かなかった・・・
あれこれ悩んで、おもむろに、IntelliJ IDEA をインストールしました。
こちらなどを参照。
これも、最初はうまく行ったり行かなかったりではありましたが、最終的にはこの形でコード補完が効くようになっています。
フォルダに対して、
Mark Directory as > Source Root
を忘れずに。
よし!(ここまで時間かかりすぎて、テンションが維持できなくなりつつ・・・)
初歩の初歩
MyFirstBot は何をやっているか
まず、基本を理解するためには、ボットの構造と座標系の考え方を知る必要があります。
下記を日本語訳して読めば、雰囲気はわかるかと思います。
雰囲気を掴んで、ソースを見ると、MyFirstBot をコピーした状態だと、下記のようなことをやっているのがわかります。
100単位(ボットの体はおおむね36単位なので、3マスくらいのイメージ)進み、ガンを1回転させ(ということはそれに載っているレーダーも1回転する)、100単位バックし、またガンを1回転させる。
敵をスキャンできたら、弾を打つ。
弾が当たったら、という処理は、多少調べる必要があります。
イベントの説明は、下記を参照。
onHitByBullet
重要なのは、BulletHitBotEvent。
要するに、当たった弾の情報を取得できる。
その情報の中には、Direction がある。Direction は、上記座標系の説明によれば、東を0度とする左回りの角度。
これが分かることで、おおむねそちらの方に敵がいることが分かる。
それが分かったら、90度-その角度分左に回転する。それが良いかは別として、要は今まで前後していた方向から向きを変える。
※90度の方向を取りたかったら+90ですよね。しかもそれだと、左回りで大回りしないといけない。
+90か、-90かで近い方。ちゃんとした計算は後ほど。冗長に書けばこんな感じ。
// Turn 90 degrees to the bullet direction based on the bearing
var deg = 90 + bearing;
if (deg > 180) {
deg = deg - 180;
}
if (deg > 90) {
deg = deg - 180;
}
turnLeft(deg);
あとは、動きの繰り返し。
そんな感じですね。
色を変える
せっかくの自分のボットなので、色を変えたい。
runの最初で好きに変えれば良い。
setBodyColor(Color.fromHex("60F")); //
setGunColor(Color.fromHex("999")); //
setTurretColor(Color.fromHex("96F")); //
setRadarColor(Color.fromHex("F09")); //
setScanColor(Color.fromHex("090")); //
setBulletColor(Color.fromHex("966")); //
こんな感じでも良いし、こんな感じでも。
setBodyColor(Color.NAVY);
動きを変える
では、本題。
このくらいの動きでも意外とうまいこと弾を避けてはくれるけど、たまたまでしかない。
結局近場をうろちょろしている感じになるので、混戦から脱却できない。
なので、次のようにしたい。
・盤面を動き回る
・敵に衝突したらそこから離れる
また、止まっている敵にも、意外と弾が命中しない。
・せめて止まっている敵には確実に命中させる
そんなところをやってみます。
が、今日はここまで!