package exe; import robocode.*; import baseRobot.*; import java.awt.Color; import java.util.*; /** * Extended Robot - 拡張ロボット * * @author Fumi Iseki * @version 1.0 */ public class Level_07 extends BaseRobot { private final int walkInterval = 3; // エンジンの設定を変更する時間間隔.大きいと直進する. private final int randomTurnAngle = 30; // ランダムターンの最大値. private boolean nearWall = false; private WallCondition wallCond; protected Random rand = new Random(); /** * ロボットの初期化 */ public void initAnythings() { wallCond = new WallCondition(this); } public void setMyColor(){ setColors(Color.yellow, Color.yellow, Color.red); } public void onWin(WinEvent e) { stop(); } /** * searchScanEnemy()中に敵を発見した場合,この関数が呼び出される. */ public void searchScanEnemyFind(ScannedRobotEvent e) { turnRadarRight(0); double kd = getRelAngle(e.getBearing()-90, 0); if (kd>90) kd = kd - 180; else if (kd<-90) kd = kd + 180; turnRight(kd); } /** * メインエンジン * エンジン設定 (サイドステップ型ブラウン運動エンジン) * int walkInterval; * double randomTurnAngle * double turnAngle */ public void setEngine(int cnt) { boolean prvNearWall = nearWall; nearWall = wallCond.checkCollision(); if ((!prvNearWall && cnt%walkInterval!=0) || nearWall) return; int rl = rand.nextInt(2); double kd = rand.nextInt(randomTurnAngle+1); if (rl==0) kd = -kd; kd = getRelAngle(enemyAngle-90+kd, getHeading()); if (kd>90) kd = kd - 180; else if (kd<-90) kd = kd + 180; int ab = rand.nextInt(3); if (ab==0) setReverse(RoboConst.faraway); else setGoAway (RoboConst.faraway); setTurnRight(kd); // 回れ!! ランダムターン } /** * 敵を攻撃するための索敵 */ public void attackScanEnemy(int count) { double rk; rk = getRelAngle(enemyAngle+20, getRadarHeading()); turnRadarRight(rk); rk = getRelAngle(enemyAngle-20, getRadarHeading()); turnRadarRight(rk); } /** * attackScanEnemy()中に敵を発見した場合,この関数が呼び出される. */ public void attackScanEnemyFind(ScannedRobotEvent e) { double kd = getRelAngle(enemyAngle, getGunHeading()); turnGunRight(kd); if (getGunHeat()==0) { //double blt = Math.min(3, this.getEnergy()/10); fire(3); } } /** * 壁に衝突したとき */ public void onHitWall(HitWallEvent e) { count = 0; setReverse(100); } /** * 絶対角度 hdから gdへの(右回りの)相対角度を返す.返す角度は -180〜180 */ public double getRelAngle(double gd, double hd) { double kd = gd - hd; if (kd<-180) return kd + 360; else if (kd>180) return kd - 360; return kd; } }