package exe; import robocode.*; import java.util.*; import java.awt.Color; /** * @author Fumi Iseki * * 演習用 Level-08 ロボット 円月殺法ロボット * */ public class Level_08 extends AdvancedRobot { private boolean searchFirst = true; private boolean findEnemy; private boolean forwarding; private double enemyAngle; private int dist = 100000; private double ramAngle = 80; 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); turnGunRight(0); double ed = e.getBearing(); enemyAngle = ed + getHeading(); double kd = getRelAngle(enemyAngle, getGunHeading()); turnGunRight(kd); if (searchFirst) { double ks = ed - 90; searchFirst = false; turnRight(ks); setForward(dist); } else { double ks = ed - ramAngle; if (!forwarding) ks = ed + ramAngle - 180; setTurnRight(ks); if (getGunHeat()==0) { fire(3); } } } /** * 敵のロボットにぶつかったとき */ 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(); } }