
今日は、素晴らしいRobocodeゲームについて学びます。 明らかな外部のシンプルさにもかかわらず、高度なJavaトレーニングを目的としており、優れた機能を備えています。
Robocodeは、Mathew NelsonとFlemming Larsenによって開発されたオープンソースの教育用ゲームです。 その唯一の目的は、Javaプログラミング言語の研究を促進することでした。
ゲーム
トレーニングの主な推進要素は、競争になることでした。 各参加者はJavaでコードを記述します。Javaは小さな戦車を制御し、他の戦車と戦います。
あなたの目標は、フィールド上の他のすべての戦車を破壊することです。 妥協しません。 あなたの戦車は絶対的な優位性を達成し、あなたの友人がどんな哀れな敗者であるかを示さなければなりません。
開発者は、Robocodeには血がなく、人々も政治もないという事実に、あなたの注意を強く引き付けます。 ゲームには爆発がありますが、自分のメンタルヘルスを気にする場合は、簡単にオフにすることができます。
戦車には大きなチャンスがあります:戦場を動き回り、撃ち合い、互いの位置を突き止め、壁や他のロボットに衝突し、空飛ぶ弾丸の位置を突き止め、Java言語の力をフルに活用できます。

当然、勝つための簡単な戦略はありません。 膨大な数の異なる戦術があり、それぞれに長所と短所があります。 さまざまな戦車のコードサイズは、数十行から数千行の範囲です。 統計分析やニューラルプログラミングに頼ることもできます。
興味深いことに、SPbgU ITMOでのロボットの作成にアプローチしました。 このタンクは、SWITCHテクノロジー(自動プログラミングとオブジェクト指向プログラミングの混合)を使用して開発され、プロジェクトに本格的なプロジェクトドキュメントが添付されています。
プロジェクトページから完全に無料でダウンロードできます 。
ゲームのインストール
プロジェクトの公式ウェブサイトには、膨大な量のさまざまな資料があります。 トレーニングを開始する場合は、これが開始するのに最適な場所です。

ゲーム自体はjarアーカイブとして配布され、ゲームダウンロードページからダウンロードできます 。
ゲームはJavaで書かれているため、クロスプラットフォームです。 Windows、Linux、FreeBSD、およびJavaマシンが移植されている他のシステムで再生できます。

ゲームをインストールする前に、 Javaをインストールすることを忘れないでください。
最初のロボット
最初のロボットを作成する準備はできましたか? 私はそれが簡単で、面白くて、ただ面白いと確信しています!
ロボットの作成は非常に簡単です。 しかし、彼を勝者にすることはそうではありません。

ビルトインエディター
開発者は、独自のエディターをゲームに含めました。 そのため、構文の強調表示を備えた既製の開発環境が既にあります。
このプログラムはRobot Editorと呼ばれ、Robot-> Editorメニューで利用できます。

ロボットブランクを作成しましょう。 これを行うには、メニュー項目[ファイル]-> [新しいロボット]に移動します。 将来のロボットの名前を作成し、イニシャル(ニックネーム)を入力します。
出来上がり! これで、将来のロボットのドラフトコードが表示されます。
注: Eclipseまたは別のIDEを使用する場合、インターネット上のRobocodeと統合するための適切なガイドを簡単に見つけることができます。
新しいロボット
最も単純な形式では、コードは次のようになります。
// . .
package v673;
// Java, Robocode .
import robocode.*;
// Java: ", , Robot.
// MyFirstRobot".
public class MyFirstRobot extends Robot
{
// run(), .
public void run()
{
// .
}
// , .
}
すでに何かをする時です!
ロボットに何かをさせましょう。 run()メソッドに次の行を追加します。
// while (true) , , .
while ( true )
{
// 100 .
ahead(100);
// 360 .
turnGunRight(360);
// 100 .
back(100);
// 360 .
turnGunRight(360);
// .
}
ロボットは、死ぬまでこれらのアクションを繰り返し実行します。 悪くないでしょ?
ファイアー!
戦車のレーダーが敵ロボットを見つけると、射撃を開始します。
public void onScannedRobot(ScannedRobotEvent e)
{
fire(1);
}
ご覧のとおり、 ScannedRobotEventオブジェクトは関数に送信されます。 このオブジェクトには、敵の(または味方の)ロボットに関する情報(健康状態の程度、場所、移動速度など)が含まれています。
しかし、私たちには単純なロボットがあるので、これに多くの時間を費やすことはしません。
ロボット編集
まず、作業を保存します: File- > Save 。
ロボットをコンパイルします: Compiler- > Compile 。

ロボットがエラーなしでコンパイルされた場合、戦闘を開始できます。 ゲームメニューで[ バトル] -> [ 新規 ]を選択して、新しいバトルを開始します。 自分のロボットが表示されない場合は、F5を押してリストを更新します。 別のロボットと一緒にロボットを戦闘に追加します。 たとえば、 サンプルタンクと一緒に。

戦闘開始をクリックして戦闘を開始します。
お楽しみください!
ロボットの解剖学
独自のロボットを作成しました。 次に、戦車の設計上の特徴を詳しく見てみましょう。
戦車は、戦車の本体、銃、レーダーの3つの部分で構成されています。

これらの各部分は、互いに独立して移動できます。 戦車は最もゆっくりと動き、銃はより速く動き、レーダーはロボットの最速の要素です。
戦場
戦場は長方形です。 さらに、戦闘の作成時にそのサイズが設定されます。
座標系:

先に実行した場合(50,000)でも、ロボットが壁に衝突した瞬間にチームは実行を停止します。
RoboWikiでは、 ゲームの物理学について詳しく知ることができます。
たわみ角
相対角度を使用すると便利な場合があります。 たとえば、別のロボットを使用するには、次のコマンドを使用できます。
turnRight( event .getBearing());
つまり、getBearing()は、たとえば敵の戦車を見るために、現在の位置から何度逸脱する必要があるかを示します。

注: turnRight()関数に負の値を渡すと、ロボットは左に曲がります。
ロボットの気持ち
いいえ、私たちは戦車の脆弱な魂については話しません。 ロボットが外部要因の影響を認識できる機能を検討します。
ロボットは次の場合に知っています:
- 彼は壁にぶつかる: onHitWall()
- 敵の弾丸がヒット: onHitByBullet()
- 別のロボットにクラッシュします: onHitRobot()
- また、たとえば、敵のロボットの弾丸に弾丸が当たったときなど、多くのエキゾチックな機能もあります。
Robocodeのすべてのロボットは、これらの機能に基づいて構築されています。 APIドキュメントで、すべての関数について詳しく知ることができます 。
次は?
トレーニング資料のほとんどは、 ゲームの公式ウェブサイトで収集されます。
残念ながら、Robocodeに関するロシア語の資料はそれほど多くありません。 しかし、英語があなたにとって大きな問題ではないことを願っています。
Mark Whitley: CS 3230-Robocode ProjectのRobocodeコースをご覧になることをお勧めします。 ところで、 translated.byプロジェクトのおかげで、 ロシア語の一括 翻訳があります。 しかし、残念ながら、まだ別のPDFファイルで発行されていないため、写真はありません。 したがって、現時点では、オリジナルを勉強することをお勧めします。
Sing LiによるRobocodeに関する2つの素晴らしい記事もあります: Rock 'em、sock' em Robocode! ラウンド1 、 Rock 'em、sock' em Robocode! ラウンド2
RoboWikiは、 RoboCodeに関する高品質の資料を大量に収集しています。 簡単なガイドから始まり、さまざまな微妙なポイントの説明で終わります。
さらに、公式Webサイトには、Robocodeに関する他の優れた記事への多くのリンクがあります。
RoboCodeでの遺伝的アルゴリズムの使用に関する記事も読むことができます。
RoboCodeリポジトリには、膨大な数の異なるロボットが含まれています 。 それらのいくつかはソースコードを持っています。
開発者向け公式ブログ: robo-code.blogspot.comがあります。
これで、レビューを終了したいと思います。
あなたが私の記事に興味があるなら、habrahabrのリリース前にそれらを読むことを可能にするハックがあります: 私のブログ 、まあ、またはtwitterを購読してください 。
Robocodeの複雑さを理解できたことを願っています!