package exe; import robocode.*; import java.util.*; import java.awt.Color; /** * @author Fumi Iseki * * 演習用 Level-09 ロボット 壁際の魔術師ロボット * */ public class Level_09 extends AdvancedRobot { private boolean findEnemy; private boolean forwarding; private int dist = 100000; private double enemyAngle; private double xMax, yMax; private double rbsz, hei, wid, wkd; public void run() { setColors(Color.yellow, Color.yellow, Color.red); setAdjustRadarForGunTurn(true); setAdjustGunForRobotTurn(true); hei = getHeight(); wid = getWidth(); rbsz = Math.sqrt(hei*hei+wid*wid)*2.7; xMax = getBattleFieldWidth(); yMax = getBattleFieldHeight(); wkd = getNearWallAngle(); double kd = getRelAngle(wkd, getHeading()); turnRight(kd); setForward(dist); while(true) { turnRadarRight(360); do { findEnemy = false; double la = getRelAngle(enemyAngle+20, getRadarHeading()); turnRadarRight(la); turnCorner(); double ra = getRelAngle(enemyAngle-20, getRadarHeading()); turnRadarRight(ra); turnCorner(); } while(findEnemy); } } public double getNearWallAngle() { double wa; double xx = getX(); double yy = getY(); if (xxyMax-rbsz) ret = true; else if (wkd==90 && getX()>xMax-rbsz) ret = true; else if (wkd==180 && getY()=360) wkd = wkd - 360; setTurnRight(getRelAngle(wkd, getHeading())); } } public void onScannedRobot(ScannedRobotEvent e) { findEnemy = true; turnRadarRight(0); turnCorner(); enemyAngle = e.getBearing() + getHeading(); double kd = getRelAngle(enemyAngle, getGunHeading()); turnGunRight(kd); if (getGunHeat()==0) { double blt = Math.min(3, this.getEnergy()/10); fire(blt); } turnCorner(); } /** * 敵のロボットにぶつかったとき */ public void onHitRobot(HitRobotEvent e) { setForward(dist); } /** * 壁に衝突したとき */ public void onHitWall(HitWallEvent e) { turnRight(getRelAngle(wkd, getHeading())); setForward(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(); } }