AIプログラミング対戦ゲームRobocodeに入門しよう!

2020/07/30

読了時間: 約6
Battle

こんにちは、鈴木俊吾(@suzushin7)です。

2020年。
小学校では、いよいよプログラミングが必修化されます。
それに関連して、プログラミングに興味を持つ人がだいぶ増えました。
もしかしたら、あなたも実際に学習を始めているかもしれませんね。

でも、ただ黙々とプログラミングの勉強をしていてもつまらないと感じたことはありませんか?
どうせなら、もっと楽しみながらスキルアップをしたいと思いませんか?

実は、ゲームをしながらプログラミングの学習ができるという画期的なものがあるのです。
それが「Robocode」。

このRobocodeは、プログラミングで戦車ロボットの動きをコントロールして対戦するゲームです。
プログラム同士のオートバトルになりますので、勝てるかどうかはプログラミングスキルと戦略次第。
巷で話題のAIを自分で組むのが目的のゲームとなっています。

この記事では、そんなRobocodeの始め方について簡単に解説します。
あなたもぜひRobocodeで楽しくJavaのプログラミングをしてみませんか?

スポンサーリンク

Robocodeとは?

「Robocode」というのは、オープンソースの教育ゲームです。
主にJavaや.Netのプログラミングスキル向上に役立ちます。

Robocodeでは、戦車ロボットの動きをプログラム(AI)で制御しますが…。
そのプログラムをあなたが書くのです。
移動方法、索敵方法、回避方法など、考えることは色々あります。
どんな戦術で戦うかは、あなたのアイデアと実装スキル次第です。

他のプログラムに勝つためには…。
相手の行動を読んで攻撃を当てたり、相手の攻撃をうまく回避したりする必要があります。
人によって戦術が全く異なりますので必勝法は(たぶん)ありませんが…。
その中でも、より強いプログラムを組むことへ挑戦するのが楽しいのです。

Robocodeの始め方

RobocodeはJavaと.Netでのプログラミングに対応していますが…。
ここでは、Javaでプログラムを開発するという前提で進めていきます。

Java(JDK)のインストール

Robocodeの動作およびJavaプログラムの開発をするためには、Javaの開発環境を導入しなければなりません。
その開発環境をJDK(Java Development Kit)と言います。

もし、現時点でJDKがインストールされていないのなら入れておきましょう。
ここでは、2020年7月時点で最新版のAdoptOpenJDK 14を入れることにします。

以下のリンク先をクリックして、AdoptOpenJDKのページに移動します。
JavaはOpenJDK 14、JVMはHotSpotを選択してから「Latest Release」をクリックしてダウンロードしてください。

AdoptOpenJDK – Open source, prebuilt OpenJDK binaries

AdoptOpenJDK 14

ダウンロードが完了したら、早速インストール作業に入ります。
ファイルをダブルクリックして実行してください。
すると、インストール画面が表示されますので指示に従います。

JDKがうまくインストールされているか動作確認を行います。
Windowsではコマンドプロンプト、Macではターミナルを開きます。
コマンドラインに以下のコマンドを入力して実行します。

java -version

実行結果が以下のような表示になっていれば大丈夫です。

openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)

Robocodeのインストール

それでは、メインのRobocodeのインストール作業に入ります。
まずは、Robocodeの最新版をダウンロードします。
現時点での最新版は1.9.3.9となっています。

以下のリンク先に移動します。
そして、「robocode-1.9.3.9-setup.jar」をダウンロードしましょう。

Robocode – Browse /robocode/1.9.3.9 at SourceForge.net

Robocode

ダウンロードが終わったら、ファイルを実行します。
指示に従ってインストール作業を進めていきましょう。

途中、ショートカットを作るか訊かれます。
これは作っておいたほうが良いと思います。
レジストリへの登録は任意です。

Robocodeで最初のプログラム作成

早速、初めてのRobocodeプログラムを作成してみましょう。

さきほどの過程で作成されたRobocodeのショートカットをダブルクリックして起動します。
すると、初回起動時にはロボット同士の対戦デモが表示されます。

Robocode デモ対戦

新規プログラムの作成は、「Robot」→「Source Editor」をクリック。
すると、Robot Editorが表示されます。
新規Robotは、「File」→「New」→「Robot」を選びます。

Robot Editor

最初のダイアログは、ロボット名を決めるものです。
あなたが付けたいロボット名を入力します。
ここでは、例として「MyFirstRobot」としておきます。

Robot Name

次のダイアログでは、パッケージ名を決めます。
ここでのパッケージ名というのは、いわゆるIDのようなものです。
あなたのロボットを区別するのに使います。
ここでは、例として「suzushin7」とします。

Package Name

ここまで入力が終わると…。
Robot Editor上に雛形のコードが自動作成されます。
あとはこれを好きなように編集すれば良いのですが…。
ここでは、説明だけですのでそのままにしておきます。

MyFirstRobot

雛形のコメントを省いたソースコードがこちら。
簡単な英語が分かる方なら、処理内容が大体予想できるかと思います。

package suzushin7;
import robocode.*;

public class MyFirstRobot extends Robot
{
	public void run() {
		while(true) {
			ahead(100);
			turnGunRight(360);
			back(100);
			turnGunRight(360);
		}
	}

	public void onScannedRobot(ScannedRobotEvent e) {
		fire(1);
	}

	public void onHitByBullet(HitByBulletEvent e) {
		back(10);
	}
	
	public void onHitWall(HitWallEvent e) {
		back(20);
	}	
}

簡単にこのプログラムの動作を解説します。

まず、メイン処理はrunメソッドのwhileループの中になります。
100前進、砲塔360度右回転、100後退、砲塔右360度回転、を繰り返します。

敵を発見した時の処理は、onScannedRobotメソッド中に書きます。
ここでは、パワー1で弾丸を発射する(fire)という処理になっていますね。

onHitByBulletメソッドは、敵の弾丸に被弾した時に呼ばれます。
ここでは、10後退するという処理になっています。

onHitWallメソッドは、戦場の壁にぶつかった時に呼ばれます。
ここでは、20後退するという処理になっています。

最初のうちは、このコードをベースにして、それぞれの値をいじるなどしてみるのが良いでしょうね。

プログラムを編集したらコンパイルをします。
コンパイルの仕方は、「Compiler」→「Compile」をクリック。
コンパイルが正常に終了すると、バトルに使用できるようになります。

Compile

Robocodeの対戦方法

いよいよ、作成したプログラムを戦わせてみます。

新規バトルは、メイン画面から「Battle」→「New」をクリック。
すると、ロボットプログラムの選択画面が出てきます。

対戦させたいロボットをダブルクリックして選択します。
もしくは、ロボットをクリックしてから「Add」を押します。
すべてのロボットの選択が終わったら「Start Battle」をクリックしましょう。

Start Battle

対戦が終わるまで、様子を眺めてみましょう。
プログラムが意図したとおりに動いているかを確認します。

Battle

対戦が終わると、対戦結果が表示されます。
スコアが出ますので、どれくらい差がついたかが分かりますね。
この例では、SittingDuck相手に完勝(100%)しています。

Battle Result

ちなみに、サンプルロボットの中で最も強いのはWallsです。
最初は、如何にしてWallsに勝つプログラムを組むかが鍵となりますよ。
色々と試行錯誤をしてみてくださいね。

ひとこと

今回の記事では、AIプログラミング対戦ゲーム「Robocode」の始め方について解説してみました。
ここで扱っているのは、入門の入門といった感じ。
本当に最初の段階までです。

まずは、Wallsに勝てるようなプログラムを実装できるようになるのが目標となります。
Wallsの動きは単純なのですが、攻撃を狙って当てるというのがなかなか難しいですよ。
射撃アルゴリズムをしっかりと考える必要がありそうです。

紹介だけして自分がやらないのはアレですので…。
私もRobocodeに入門したいと思います。
少しでも強いプログラムが組めるように頑張ってみたいですね!

さて、Robocodeの準備はできましたか?
ぜひ楽しくプログラミングの学習を一緒にしていきましょう!

(Today: 1 PV, Total: 13 PV)

スポンサーリンク