package exe; import robocode.*; import java.util.*; import java.awt.Color; /** * @author Fumi Iseki * * 演習用 Level-05 ロボット ヨーヨーロボット * */ public class Level_05 extends AdvancedRobot { private boolean searchFirst = true; private boolean findEnemy; private boolean forwarding; private double enemyAngle; private int dist = 100000; public void run() { setColors(Color.yellow, Color.yellow, Color.red); setAdjustRadarForGunTurn(true); setAdjustGunForRobotTurn(true); while(true) { turnRadarRight(360); do { findEnemy = false; double la = getRelAngle(enemyAngle+20, getRadarHeading()); turnRadarRight(la); double ra = getRelAngle(enemyAngle-20, getRadarHeading()); turnRadarRight(ra); } while(findEnemy); } } public void onScannedRobot(ScannedRobotEvent e) { findEnemy = true; turnRadarRight(0); enemyAngle = e.getBearing() + getHeading(); double kd = getRelAngle(enemyAngle, getGunHeading()); turnGunRight(kd); if (getGunHeat()==0) { fire(3); } if (searchFirst) { double ks = e.getBearing() - 90; if (ks<-180) ks = ks + 360; else if (ks>180) ks = ks - 360; if (ks>90) ks = ks - 180; else if (ks<-90) ks = ks + 180; turnRight(ks); searchFirst = false; setForward(dist); } } /** * 敵のロボットにぶつかったとき */ public void onHitRobot(HitRobotEvent e) { setReverse(dist); } /** * 壁に衝突したとき */ public void onHitWall(HitWallEvent e) { setReverse(dist); } /** * 絶対角度 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; } /** * 前進設定.前進状態を記憶する. */ public void setForward(double n) { forwarding = true; setAhead(n); } /** * バック設定.バック状態を記憶する. */ public void setGoBack(double n) { forwarding = false; setBack(n); } /** * 逆進設定.逆に進むように設定する. */ public void setReverse(double n) { if (forwarding) setGoBack(n); else setForward(n); } public void onWin(WinEvent e) { stop(); } }