package exe; import robocode.*; import baseRobot.*; /** * エンジンクラス * * @author Fumi Iseki * @version 1.0 */ public class Engine { private final int stayEngine = 0; private final int dashEngine = 1; private final int escapeEngine = 2; private final double escapeEnergy = 10; // これ以下のエネルギーになったら後退モード. private final int walkInterval = 3; // エンジンの設定を変更する時間間隔.大きいと直進する. private final int randomTurnAngle = 30; // ランダムターンの最大値. private ExtRobot myRobo; private GeneData geneData; private Enemy targetEnemy; private int engineMode; // 運動モード private double turnAngle; // 運動中心 private boolean nearWall = false; private WallCondition wallCond; /** * コンストラクタ */ public Engine(ExtRobot robo, GeneData data) { myRobo = robo; geneData = data; wallCond = new WallCondition(robo); } /** * エンジン設定 (サイドステップ型ブラウン運動エンジン) * int walkInterval; * int engineMode; * double randomTurnAngle * double turnAngle */ public void setBraunEngine(int cnt) { wallCond.setField(); boolean prvNearWall = nearWall; nearWall = wallCond.checkCollision(); if ((!prvNearWall && cnt%walkInterval!=0) || nearWall) return; int rl = myRobo.rand.nextInt(2); double kd = myRobo.rand.nextInt(randomTurnAngle+1); if (rl==0) kd = -kd; if (engineMode!=stayEngine) kd = 2*kd; kd = RoboTool.getRelAngle(turnAngle-90+kd, myRobo.getHeading()); if (kd>90) kd = kd - 180; else if (kd<-90) kd = kd + 180; if (engineMode==dashEngine) { // 徐々に接近 double th = RoboTool.getRelAngle(kd+myRobo.getHeading(), turnAngle); if (Math.abs(th)<90) myRobo.setForward(RoboConst.faraway); else myRobo.setGoBack (RoboConst.faraway); } else if (engineMode==escapeEngine) { // 徐々に退避 double th = RoboTool.getRelAngle(kd+myRobo.getHeading(), turnAngle); if (Math.abs(th)>90) myRobo.setForward(RoboConst.faraway); else myRobo.setGoBack (RoboConst.faraway); } else { // かわせ!! int ab = myRobo.rand.nextInt(5); if (ab==0) myRobo.setReverse(RoboConst.faraway); else myRobo.setGoAway (RoboConst.faraway); } myRobo.setTurnRight(kd); // 回れ!! ランダムターン } /** * 反重力用運動中心方向の獲得 */ public double getAntiGravityAngle() { Vector vt; double xx = 0, yy = 0; double lu = geneData.enemyNowDist.getMinData(); for (int i=0; i200) em = dashEngine; else em = stayEngine; if (myRobo.getEnergy()<=escapeEnergy) em = escapeEngine; return em; } /** * エンジンモードの設定。 */ public void setMode(int en) { targetEnemy = geneData.getTargetEnemy(); if (en==1) engineMode = getAutoEngineMode(); // 1対1用 else engineMode = escapeEngine; // 集団戦用 } /** * エンジンの旋回中心を設定 */ public void setTurnAngle(int en) { if (en==1) turnAngle = targetEnemy.getAngle(); // 1対1用 else turnAngle = getAntiGravityAngle(); // 集団戦用 } }