FightCodeはプログラマー向けのオンラインゲームで、古典的な
Robocodeのイメージで構築されています。 JavaScriptは戦車のプログラミングに使用され、すべての戦闘はブラウザーで直接行われ、サイトのコードエディターには組み込みの「サンドボックス」があり、コード変更の効果をリアルタイムで確認できます。 他の多くの同様のゲームとは異なり、クリエイターはデザインに関して良い仕事をしました-競技場とサイト全体が全体として魅力的で明るく見えます。
これらすべてにより、FightCodeは、同様のゲームの初心者やプログラミングの学習に最適なオプションの1つとなっています。 このプロジェクトは非常に若く、約9,000人のプレーヤーがサイトに登録されているという事実にもかかわらず、多くの努力をせずに最初の100のレーティングに侵入することが可能です。 ランダムなライバルとの戦闘システムは非常に便利に編成されています-利用可能なすべてのロボットから、あなたの評価に近いものが自動的に選択されます。 ポイントは
Eloシステムに従ってカウントされ
ます -強い相手に対する勝利は弱い相手に対するよりもはるかに多くのポイントを与えます。
各参加者は、任意の数のロボットを持つことができます。 新しいロボットの作成は、ほとんど意味のあるアクションを実行しないプリミティブテンプレートから始まります。 敵のシェルの衝突やヒットなどの重要なイベントのハンドラーを追加すると、ロボットに一連の「無条件反射」を与えることができます。これにより、動作がより適切になり、さらなる開発の出発点となります。
最初に、ゲームの世界とゲームのルールについてのいくつかの言葉。 ロボットは平らな長方形のフィールドで戦っています。 ゲームの世界は2次元であるため、ここには飛行や短いミッションはありません。 戦車は1対1でプレイしますが、各プレイヤーは自分の戦車の「クローン」を作成できます。このクローンは健康が低下し、親が殺された場合に死亡します。
戦車は前後に移動したり、向きを変えたり、砲塔を回転させて撃つことができます。 Robocodeのような個別のレーダーはありません。 メインゲームループは、「
onIdle
」イベントハンドラーで設定されます。 タンクがタワーの視野に入ると、イベント「
onScannedRobot
」
onScannedRobot
し、壁との衝突で「
onScannedRobot
」など
onScannedRobot
(
APIの詳細な
説明はサイトにあります)。
デフォルトのロボットコードは次のようになります。
var Robot = function(robot) { }; Robot.prototype.onIdle = function(ev) { var robot = ev.robot;
まず、ロボットに最初のショットの後にターゲットを失わないように教えます。 ロボットの発射速度は制限されているため、ショット間でタワーを数度回転させ、ターゲットを見失います。 したがって、私たちは彼に塔を左右に少しねじらせます。 同時に、これは移動するターゲットを見逃しません:
Robot.prototype.onScannedRobot = function(ev) { var r = ev.robot;
これで、ロボットはターゲットを保持できます。 先に進む前に、いくつかの魔法を結びましょう。 ロボットには2つの魔法のトリックが残っています:独自のクローンを作成し、しばらく敵から見えなくなります。 クローンをすぐに作成します-過剰な火力と敵の気を散らすターゲットはゲームの最初から役に立ちます:
Robot.prototype.onIdle = function(ev) { var r = ev.robot; r.clone();
次のステップは、ロボットに自分で撃たないように教えることです。 デフォルトでは、彼は自分のクローンや親など、目を引くものすべてを撃ちます。 これから彼を引き離すには、撮影前に誰が私たちの前にいるかを確認する必要があります。 これは
id
および
parentId
を使用して行われ
parentId
:
Robot.prototype.onScannedRobot = function(ev) { var r = ev.robot;
それでは、ロボットをもう少し機動性のあるものにして、モーションで撮影するように教えましょう。 最も簡単な方法は、撮影中に円を描くように移動することです。 エントリーレベルのロボットは、予定より早く発射する方法を知らないので、サークルを回すとき、彼らがどちらの側で撃っているかに関係なく、私たちは自分で敵のシェルのほとんどを逃します。 これを行うために、各ショットの後に、ロボット本体をわずかに回転させて、少し前進させます。
Robot.prototype.onScannedRobot = function(ev) { var r = ev.robot; if (ev.scannedRobot.parentId == r.id || ev.scannedRobot.id == r.parentId) { return; }; r.fire(); r.turn(10);
そしてもう1つのニュアンス
onScannedRobot
イベントは、「レーダービーム」が敵の戦車のエッジと交差するとすぐに発生します。 ほとんどの場合、タワーを右に向けるので、シェルはターゲットの左端に飛んで、しばしば通り過ぎます。 より正確に打つために、ショットの前にタワーを数度右に回します:
Robot.prototype.onScannedRobot = function(ev) { var r = ev.robot; if (ev.scannedRobot.parentId == r.id || ev.scannedRobot.id == r.parentId) { return; } r.rotateCannon(2);
同じ場所で前後に運転する代わりに、戦車をフィールド内で積極的に移動させます。 これは、私たちが1つのコーナーにいて、敵が別のコーナーにいて、シェルがフィールド全体を飛んで、ほとんどヒットしない状況を回避するのに役立ちます。 100単位ではなく、150単位ずつ常に前進します。 さらに、コースを少し変更して、予測しにくくします。
Robot.prototype.onIdle = function(ev) { var r = ev.robot; r.clone(); r.rotateCannon(360); r.ahead(150); r.turn(30); r.ahead(150); };
最後の仕上げ-立ち往生しないように、壁や他の戦車につまずいて、衝突イベントハンドラを作成します。 視界を撃ち落とさないために、もし射撃中に遭遇し、ターンで時間を無駄にしないなら、少しだけ後退します。 原則として、これは十分です。なぜなら、ロボットはほとんどの時間スピンし、同じ場所で数回休まないからです。もしそうなら、これは敵のシェルを回避するための非常に良い操作です。
Robot.prototype.onWallCollision = function(ev) { var r = ev.robot; r.back(50); }; Robot.prototype.onRobotCollision = function(ev) { var r = ev.robot; r.back(30); };
エントリーレベルのロボットの準備ができました! 彼はまだ非常に愚かですが、そこには約40行のコードしかありません。 同時に、彼は戦場で非常に積極的かつ機敏に行動し、立ち往生せず、サイクルをたどらず、サンドボックスからすべてのテストロボットを確実に倒します。 実際の戦闘では、運が良ければ、1700のレーティングで相手を倒すことができます。コード内のすべての角度と距離の値は経験的に選択されます。