package exe; import robocode.*; import baseRobot.*; import java.awt.Color; import java.util.*; /** * Extended Robot - 拡張ロボット * * @author Fumi Iseki * @version 1.0 */ public class ExtRobot extends BaseRobot { private final int crrctBltNum = 5; // 命中率を計算する弾数 private final int reResearchCycle = 10; // 集団戦時の再探索周期 private Cannon cannon; private Engine engine; private Enemy targetEnemy; protected final double turnRadarAngle = 20; // 敵を捕らえているときの探索レーダ角/2 protected int enemyNum; protected int enemyMaxNum; protected int findEnemyNum; protected int bltNum = 0; protected int hitBulletNum = 0; protected int bltBulletNum = 0; protected int misBulletNum = 0; protected int totalBulletNum = 0; protected int totalHitBulletNum = 0; protected GeneData geneData; protected Random rand = new Random(); /** * ロボットの初期化 */ public void initAnythings() { enemyMaxNum = getOthers(); geneData = new GeneData(this, enemyMaxNum); cannon = new Cannon(this, geneData); engine = new Engine(this, geneData); } /** * 最初に敵を調べるための索敵 */ public void searchScanEnemy(int count) { enemyNum = getOthers(); if (enemyNum==1) vsOthers = false; else vsOthers = true; geneData.setLost(); scanFullTurn(count); // 全周レーダースキャン geneData.putEnemyNow(); // 現時点のデータを収集 cannon.setMode(enemyNum); // 追跡と砲撃モードの設定 cannon.setTargetEnemy(enemyNum); // 攻撃目標を決める. engine.setMode(enemyNum); // エンジンモードの設定. engine.setTurnAngle(enemyNum); // ターン中心を決める. cannon.setTurnTarget(); // 砲の予備動作 targetEnemy = geneData.getTargetEnemy(); } /** * searchScanEnemy()中に敵を発見した場合,この関数が呼び出される. */ public void searchScanEnemyFind(ScannedRobotEvent e) { geneData.putData(enemyName); findEnemyNum = geneData.getEnemyNum(); if (findEnemyNum==enemyNum) turnRadarRight(0); } /** * 敵を攻撃するための索敵 */ public void attackScanEnemy(int count) { double rk; rk = cannon.getTargetAngle(); double la = roboTool.getRelAngle(rk+turnRadarAngle, getRadarHeading()); turnRadarRight(la); rk = cannon.getTargetAngle(); double ra = roboTool.getRelAngle(rk-turnRadarAngle, getRadarHeading()); turnRadarRight(ra); if (enemyNum!=getOthers()) findEnemy = false; if (vsOthers && (count+1)%reResearchCycle==0) findEnemy = false; // 集団戦の場合は再サーチ } /** * attackScanEnemy()中に敵を発見した場合,この関数が呼び出される. */ public void attackScanEnemyFind(ScannedRobotEvent e) { geneData.putData(enemyName); if (targetEnemy.equals(enemyName)) { engine.setMode(enemyNum); engine.setTurnAngle(enemyNum); if (getGunHeat()==0) cannon.fireCannon(); else cannon.setTurnTarget(); } } /** * */ public void scanFullTurn(int count) { findEnemyNum = 0; if (count==0) { turnRadarRight(405); // 360+45 if (findEnemyNum!=enemyNum) turnRadarLeft(405); } else { int n = 0; while (findEnemyNum!=enemyNum && n<9) { setEngine(count); turnRadarLeft(45); n++; } n = 0; while (findEnemyNum!=enemyNum && n<9) { setEngine(count); turnRadarRight(45); n++; } } } /** * メインエンジン */ public void setEngine(int count) { engine.setBraunEngine(count); } /** * パラメータの補正 */ public void correctParameter() { if (bltNum>crrctBltNum) { double tBltNum = hitBulletNum + misBulletNum + bltBulletNum; double hitRate = hitBulletNum/tBltNum; cannon.correctCannonParameter(hitRate); totalHitBulletNum += hitBulletNum; totalBulletNum += tBltNum; bltNum = 0; misBulletNum = 0; bltBulletNum = 0; hitBulletNum = 0; } } /** * 色の設定 */ public void setMyColor(){ setColors(Color.red, Color.red, Color.red); } /** * 勝利時パフォーマンス */ public void onWin(WinEvent e) { totalHitBulletNum += hitBulletNum; totalBulletNum += hitBulletNum + misBulletNum + bltBulletNum; double hitRate = (double)totalHitBulletNum/(double)totalBulletNum; System.out.println("Hit Rate = "+hitRate); GeneData.hitRate.putData(hitRate); GeneData.canMode.putData(cannon.cannonMode); GeneData.firCrct.putData(cannon.fireCrct); GeneData.hitRateX[cannon.cannonMode] = (GeneData.hitRateX[cannon.cannonMode]+hitRate*1.2)/2.; ahead(0); double rr = roboTool.getRelDistance(xMax/2, yMax/2); double kd = roboTool.getRelAngle(xMax/2, yMax/2, getHeading()); turnRight(kd); ahead(rr); setTurnRadarRight(RoboConst.faraway); setTurnGunLeft(RoboConst.faraway); setTurnRight(RoboConst.faraway); waitFor(new RadarTurnCompleteCondition(this)); } /** * 残念ながら死亡. */ public void onDeath(DeathEvent e) { totalHitBulletNum += hitBulletNum; totalBulletNum += hitBulletNum + misBulletNum + bltBulletNum; double hitRate = (double)totalHitBulletNum/(double)totalBulletNum; System.out.println("Hit Rate = "+hitRate); GeneData.hitRate.putData(hitRate); GeneData.canMode.putData(cannon.cannonMode); GeneData.firCrct.putData(cannon.fireCrct); GeneData.hitRateX[cannon.cannonMode] = (GeneData.hitRateX[cannon.cannonMode]+hitRate*0.8)/2.; } public void onHitWall(HitWallEvent e) { //System.out.println("onWallHit"); setReverse(1); } public void onBulletHit(BulletHitEvent e){ hitBulletNum++; } public void onBulletHitBullet(BulletHitBulletEvent e) { bltBulletNum++; } public void onBulletMissed(BulletMissedEvent e) { misBulletNum++; } }