「Fight Code」でJavaScriptのお勉強!4つのサンプルプログラム公開。
- 2015/12/22
JavaScriptでロボットの動作を記述し対戦させることができる「Fight Code」。
フラグ用の変数とif文を使った簡単なサンプルプログラムを4つ公開しました。参考にどうぞ!
サンプルコード公開中
Fight Codeのユーザページ(denbi-web)でサンプルプログラムを公開中です。
デフォルトコード
これはロボットを新規作成した時に、エディタ画面に表示されるデフォルトコードです。
//FightCode can only understand your robot //if its class is called Robot var Robot = function(robot) { }; Robot.prototype.onIdle = function(ev) { var robot = ev.robot; robot.ahead(100); robot.rotateCannon(360); robot.back(100); robot.rotateCannon(360); }; Robot.prototype.onScannedRobot = function(ev) { var robot = ev.robot; robot.fire(); };
onIdle
「onIdle」は、ロボットの基本動作を記述する場所で、ロボットはここに記述されたコードを繰り返し実行します。
- 【1】robot.ahead(100);
- 前に100移動する
- 【2】robot.rotateCannon(360);
- キャノンを360度回転させる
- 【3】robot.back(100);
- 後ろに100移動する
- 【4】robot.rotateCannon(360);
- キャノンを360度回転させる
onScannedRobot
「onScannedRobot」は、キャノンの延長線上にロボットが見つかった時に実行されます。デフォルトコードでは、「robot.fire();」 が記述されているので、弾を発射します。
サンプル01
デフォルトコードは、「onIdle」と「onScannedRobot」しか記述されてないので、「onRobotCollision」「onWallCollision」「onHitByBulle」の3つを追加します。しかし、サンプル1では使用していません。
キャノンの延長線上にロボットを発見すると、「onScannedRobot」が実行され「robot.fire();」で攻撃することになります。なので、基本的には移動やキャノンを回転させてロボットを発見する必要があります。
サンプル01、移動はせずにシンプルにキャノンを回転させてロボットをスキャンし、見つかったら回転を止めて連射するというプログラムです。
var scan_flg=0; // スキャンフラグ var Robot = function(robot) {}; // ロボットの基本動作 Robot.prototype.onIdle = function(ev) { var robot = ev.robot; if(scan_flg==0){ // スキャンフラグが0(OFF)の場合は、キャノンを1度回す robot.rotateCannon(1); }else{ // スキャンフラグが1(ON)の場合は、弾を発射する robot.fire(); } }; // 他のロボットが見つかった時 Robot.prototype.onScannedRobot = function(ev) { var robot = ev.robot; robot.fire(); scan_flg=1; // フラグをON }; // 他のロボットと当たった時 Robot.prototype.onRobotCollision = function(ev) { }; // 壁に当たった時 Robot.prototype.onWallCollision = function(ev) { }; // 弾に当たった時 Robot.prototype.onHitByBullet = function(ev) { };
onScannedRobot
ロボットが見つかったら実行されます。今回はここでフラグ用の変数「scan_flg」に「1」を代入します。
onIdle
if文でフラグ用の変数「scan_flg」チェックして、「0」だったらキャノンを回転させ、「1」だったら発射します。
onRobotCollision
他のロボットに当たったら実行されます。
(今回は不使用)
onWallCollision
壁に当たったら実行されます。
(今回は不使用)
onHitByBulle
弾が当たったら実行されます。
(今回は不使用)
サンプル02
サンプル02では、サークル状に移動しながらロボットをスキャンし、ロボットが見つかったら止まって連射します。
var scan_flg=0; // スキャンフラグ var Robot = function(robot) {}; // ロボットの基本動作 Robot.prototype.onIdle = function(ev) { var robot = ev.robot; if(scan_flg==0){ // スキャンフラグが0(OFF)の場合は robot.ahead(1); // 前に1進 robot.turn(1); // 右に1度ターンする }else{ // スキャンフラグが1(ON)の場合は、弾を発射する robot.fire(); } }; // 他のロボットが見つかった時 Robot.prototype.onScannedRobot = function(ev) { var robot = ev.robot; robot.fire(); scan_flg=1; // フラグをON }; // 他のロボットと当たった時 Robot.prototype.onRobotCollision = function(ev) { }; // 壁に当たった時 Robot.prototype.onWallCollision = function(ev) { }; // 弾に当たった時 Robot.prototype.onHitByBullet = function(ev) { };
onScannedRobot
ロボットが見つかったら実行されます。今回はここでフラグ用の変数「scan_flg」に「1」を代入します。ここはサンプル01と同じです。
onIdle
if文でフラグ用の変数「scan_flg」チェックして、「0」だったら移動、「1」だったら発射します。サンプル01では移動せずにキャノンのみ回転させましたが、今回はサークル状に移動しつつロボットを探します。
onRobotCollision
他のロボットに当たったら実行されます。
(今回は不使用)
onWallCollision
壁に当たったら実行されます。
(今回は不使用)
onHitByBulle
弾が当たったら実行されます。
(今回は不使用)
サンプル03
サンプル03では、ロボットを探しながらサークル状に移動し、見つかったら連射を始め移動し続けます。
var scan_flg=0; // スキャンフラグ var Robot = function(robot) {}; // ロボットの基本動作 Robot.prototype.onIdle = function(ev) { var robot = ev.robot; robot.ahead(1); // 前に1進 robot.turn(1); // 右に1度ターンする if(scan_flg==1){ robot.fire(); // スキャンフラグが1(ON)の場合は、弾を発射する } }; // 他のロボットが見つかった時 Robot.prototype.onScannedRobot = function(ev) { var robot = ev.robot; robot.fire(); scan_flg=1; // フラグをON }; // 他のロボットと当たった時 Robot.prototype.onRobotCollision = function(ev) { }; // 壁に当たった時 Robot.prototype.onWallCollision = function(ev) { }; // 弾に当たった時 Robot.prototype.onHitByBullet = function(ev) { };
onScannedRobot
ロボットが見つかったら実行されます。今回はここでフラグ用の変数「scan_flg」に「1」を代入します。ここはサンプル01やサンプル02と同じです。
onIdle
if文でフラグ用の変数「scan_flg」チェックして、「1」だったら発射します。今回は、状況に関わらずサークル状に移動し続けますので、「robot.ahead(1);」「robot.turn(1);」をif文の外側に記述します。
onRobotCollision
他のロボットに当たったら実行されます。
(今回は不使用)
onWallCollision
壁に当たったら実行されます。
(今回は不使用)
onHitByBulle
弾が当たったら実行されます。
(今回は不使用)
サンプル04
サンプル04では、サークル状に移動しつつ敵を発見した時だけ連射します。連射に関してはカウンタを使用し、指定数に達したら連射を止めます。
var scan_flg=0; // スキャンフラグ var fire_cnt=0; // 発射数カウント var Robot = function(robot) {}; // ロボットの基本動作 Robot.prototype.onIdle = function(ev) { var robot = ev.robot; robot.ahead(1); // 前に1進 robot.turn(1); // 右に1度ターンする if(scan_flg==1){ robot.fire(); // スキャンフラグが1(ON)の場合は、弾を発射する fire_cnt++; // 発射数をカウント if(fire_cnt > 50){ // 発射数が指定数を超えた場合、フラグとカウンタをゼロにする scan_flg=0; fire_cnt=0; } } }; // 他のロボットが見つかった時 Robot.prototype.onScannedRobot = function(ev) { var robot = ev.robot; robot.fire(); scan_flg=1; // フラグをON }; // 他のロボットと当たった時 Robot.prototype.onRobotCollision = function(ev) { }; // 壁に当たった時 Robot.prototype.onWallCollision = function(ev) { }; // 弾に当たった時 Robot.prototype.onHitByBullet = function(ev) { };
onScannedRobot
ロボットが見つかったら実行されます。今回はここでフラグ用の変数「scan_flg」に「1」を代入します。ここはサンプル01やサンプル02、サンプル03と同じです。
onIdle
if文でフラグ用の変数「scan_flg」チェックして、「1」だったら発射します。但し、今回は発射の度に「fire_cnt」をカウントアップします。なお、「fire_cnt」が指定数を越えた場合は、ゼロに戻します。
キャノンにはクールダウンタイムが設けられており、クールダウン中に「robot.fire();」を実行しても発射されません。
今回は、if文の条件に「fire_cnt > 50」を指定していますが、5発程度しか発射されません。
onRobotCollision
他のロボットに当たったら実行されます。
(今回は不使用)
onWallCollision
壁に当たったら実行されます。
(今回は不使用)
onHitByBulle
弾が当たったら実行されます。
(今回は不使用)
まとめ
サンプルプログラムのままでは勝てませんので、今回不使用だった「onRobotCollision」「onWallCollision」「onHitByBulle」の使い方も色々と試してみてください。また、ランキング上位に入るにはクローンの使い方がカギかもしれません。
Fight Codeのユーザページから、今回のサンプルプログラムと対戦することができます。