package baseRobot; import robocode.*; /** * Base Robot - 基本ロボット * * @author Fumi Iseki * @version 1.0 */ public class BaseRobot extends AdvancedRobot { private boolean forwarding = true; private boolean searchMode; protected int count; protected double xMax, yMax; protected double enemyAngle, enemyDistance; protected double enemySpeed, enemyHead; protected double enemyEnergy/*, myEnergy*/; protected String enemyName; protected long nTime; protected boolean findEnemy; protected boolean vsOthers; protected RoboTool roboTool; /** * メイン関数 run() */ public void run() { count = 0; initRobot(); // ロボットの初期化 initAnythings(); // オーバーライド用.いろいろ初期化. while(true) { searchMode = true; searchScanEnemy(count); // 最初に敵を探す searchMode = false; do { // 敵を見失うまで処理を続ける findEnemy = false; setEngine(count); // 移動設定 (ノンブロッキング推奨) attackScanEnemy(count); // 索敵と攻撃 (ブロッキング推奨) correctParameter(); // 各種パラメータの修正 count++; } while (findEnemy); } } /****************************************************************************************************** 以下,オーバーライド用関数. ******************************************************************************************************/ /** * 最初に敵を調べるための索敵 */ public void searchScanEnemy(int count) { turnRadarRight(RoboConst.faraway); setTurnGunRight(RoboTool.getRelAngle(enemyAngle, getGunHeading())); } /** * searchScanEnemy()中に敵を発見した場合,この関数が呼び出される. */ public void searchScanEnemyFind(ScannedRobotEvent e) { turnRadarRight(0); } /** * エンジン設定 */ public void setEngine(int count) {} /** * 敵を攻撃するための索敵 */ public void attackScanEnemy(int count) { turnRadarLeft(20); turnRadarRight(360); } /** * attackScanEnemy()中に敵を発見した場合,この関数が呼び出される. */ public void attackScanEnemyFind(ScannedRobotEvent e) { turnRadarRight(0); turnGunRight(RoboTool.getRelAngle(enemyAngle, getGunHeading())); fire(1); } /** * 各種パラメータの補正 */ public void correctParameter() {} /** * 色の設定 */ public void setMyColor(){ setColors(null, null, null); } /** * 勝利時パフォーマンス */ public void onWin(WinEvent e) { ahead(0); setTurnGunLeft(RoboConst.faraway); waitFor(new GunTurnCompleteCondition(this)); } /** * オーバーライド用初期化関数. */ public void initAnythings() {} /** * 壁に衝突したとき */ public void onHitWall(HitWallEvent e) { System.out.println("onWallHit"); setReverse(300); } /** * 敵のロボットにぶつかったとき */ public void onHitRobot(HitRobotEvent e) { double ea = e.getBearing(); double kd = ea + getHeading(); if (kd<0) kd = kd + 360; kd = RoboTool.getRelAngle(kd, getGunHeading()); turnGunRight(kd); fire(3); if (ea>=0) kd = 180 - ea; else kd = 180 + ea; setTurnShortest(kd, 3); } /****************************************************************************************************** BaseRobot 固有機能関数.オーバーライド禁止.禁止キーワードってあったっけ? ******************************************************************************************************/ /** * 前進設定.前進状態を記憶する. */ 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 setGoAway(double n) { if (forwarding) setAhead(n); else setBack(n); } /** * 前進していたら止まる.バックしている場合は何もしない. */ public void stopForward() { if (forwarding) ahead(0); } /** * バックしていたら止まる.前進している場合は何もしない. */ public void stopGoBack() { if (!forwarding) back(0); } /** * 相対角度kdに向かって最小の回転を行い,nの距離だけ進むように設定する. * バックになる場合もある. */ public void setTurnShortest(double kd, double n) { kd = RoboTool.getRelAngle(kd, 0); if (kd>90) { stopForward(); // これをやっている時に setAhead(faraway)等のイベントが起こると悲惨!! setGoBack(n); kd = kd - 180; } else if (kd<-90) { stopForward(); setBack(n); kd = kd + 180; } else { stopGoBack(); setForward(n); } setTurnRight(kd); } /** * 前進中または,前進後停止しているなら真を返す. */ public boolean getForward() { return forwarding; } /** * 敵機発見!! */ public void onScannedRobot(ScannedRobotEvent e) { collectEnemyData(e); findEnemy = true; if (searchMode) searchScanEnemyFind(e); else attackScanEnemyFind(e); clearAllEvents(); } /** * 敵のデータ収集 */ public void collectEnemyData(ScannedRobotEvent e) { nTime = getTime(); enemyAngle = e.getBearing() + getHeading(); if (enemyAngle<0) enemyAngle += 360; else if (enemyAngle>360) enemyAngle -= 360; enemyDistance = e.getDistance(); enemySpeed = e.getVelocity(); enemyHead = e.getHeading(); enemyEnergy = e.getEnergy(); enemyName = e.getName(); //myEnergy = getEnergy(); } /** * ロボットの初期化 */ public void initRobot() { roboTool = new RoboTool(this); setMyColor(); setAdjustRadarForGunTurn(true); setAdjustGunForRobotTurn(true); xMax = getBattleFieldWidth(); yMax = getBattleFieldHeight(); } public double getXMax() { return xMax; } public double getYMax() { return yMax; } public double getEnemyAngle() { return enemyAngle; } public double getEnemyDistance() { return enemyDistance; } public double getEnemySpeed() { return enemySpeed; } public double getEnemyHead() { return enemyHead; } public double getEnemyEnergy() { return enemyEnergy; } public String getEnemyName() { return enemyName; } public long getNowTime() { return nTime; } public RoboTool getRoboTool() { return roboTool; } public boolean getVsOthers() { return vsOthers; } }