⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.java

📁 2007年robecode大赛高级段冠军代码1!
💻 JAVA
字号:
package emp;import java.util.Vector;public class Scanner implements Consts{   private Yngwie yngwie;   private boolean ScanRound;   private boolean Assist;   private boolean EnemyFinding;   private Enemy LostEnemy;   public boolean TaskDone;   private int Scans;   private double lastHeading;   private boolean CheckingProblem;   private double ProblemHeading;   private boolean FirstTime;   private boolean RightSweeping;   private long StartSweepTime;   private long LastRoundCheck;   private Enemy LeftSweepEnemy;   private Enemy RightSweepEnemy;   public Scanner(Yngwie y){      yngwie = y;      lastHeading = 0;      LeftSweepEnemy = null;      RightSweepEnemy = null;      RightSweeping = true;      CheckingProblem = false;      ProblemHeading = 0.0;      StartSweepTime = 0;      LastRoundCheck = -1;      FirstTime = false;      ScanRound();   }   public void CheckHeading(double heading){      if ((Assist) && (LeftSweepEnemy != null))      {         double a = yngwie.NextTurnAngleTo(LeftSweepEnemy);         double b = yngwie.NextTurnAngleTo(RightSweepEnemy);         if (!My.IsAngleBetween(heading,a,b))         {            CheckingProblem = true;            ProblemHeading  = heading;         }      }   }   private boolean CheckSweepCompleted(){      if (StartSweepTime == yngwie.getTime())         return false;      Enemy en;      if (LeftSweepEnemy == null || LeftSweepEnemy.Death || RightSweepEnemy.Death)      {         for (int i=0; i < yngwie.EC.Enemies.size();i++)         {            en = (Enemy) yngwie.EC.Enemies.elementAt(i);            en.Scanned = true;         }         return true;      }      for (int i=0; i < yngwie.EC.Enemies.size();i++)      {         en = (Enemy) yngwie.EC.Enemies.elementAt(i);         if ((yngwie.getTime()-en.Time() > 15) && (yngwie.Distance(en)+(yngwie.getTime()-en.Time())*cRobotMaxVelocity >= cMaxScannerRange))            en.Scanned = true;         if (yngwie.motor.Aggressors.indexOf(en) == -1)            en.Scanned = true;         if (!en.Scanned)            return false;      }      return true;   }   private void StartNewSweep(){      Enemy en;      double LeftSweepHeading = -1;      double RightSweepHeading = -1;      LeftSweepEnemy = null;      RightSweepEnemy = null;      double[] Headings;      Enemy[] Enemies;      Headings = new double[yngwie.motor.Aggressors.size()];      Enemies  = new Enemy[yngwie.motor.Aggressors.size()];      for (int i=0; i < Enemies.length;i++)      {         en = (Enemy) yngwie.motor.Aggressors.elementAt(i);         en.Scanned = false;         Headings[i] = yngwie.NextTurnAngleTo(en);         Enemies[i]  = en;      }      double temp;      Enemy temp2;      for (int i=0; i < Enemies.length; i++)      {         for (int j=i+1; j < Enemies.length; j++)         {            if (Headings[j] < Headings[i])            {               temp = Headings[i];               Headings[i] = Headings[j];               Headings[j] = temp;               temp2 = Enemies[i];               Enemies[i] = Enemies[j];               Enemies[j] = temp2;            }         }      }      if (Enemies.length == 0)         return;      else if (Enemies.length == 1){         LeftSweepEnemy  = Enemies[0];         RightSweepEnemy = LeftSweepEnemy;      }      else{         double NotSweepArea = My.absADiffDeg2(Headings[Headings.length-1],Headings[0]);         RightSweepEnemy = Enemies[Enemies.length-1];         LeftSweepEnemy  = Enemies[0];         for (int i=0; i < (Enemies.length-1); i++)         {            temp = My.absADiffDeg2(Headings[i],Headings[i+1]);            if (temp > NotSweepArea)            {               NotSweepArea = temp;               RightSweepEnemy = Enemies[i];               LeftSweepEnemy  = Enemies[i+1];            }         }      }      StartSweepTime = yngwie.getTime();   }   public void ScanRound(){      Clear();      ScanRound = true;      StartSweepTime = yngwie.getTime();   }   public void AssistGunner(){      Clear();      Assist = true;      FirstTime = true;   }   public void FindEnemy(Enemy en, boolean toRight){      Clear();      EnemyFinding = true;      LostEnemy = en;      StartSweepTime = yngwie.getTime();      RightSweeping = toRight;   }   public boolean AllSpotted(){      int count = 0;      Enemy en;      for (int i=0; i < yngwie.EC.Enemies.size();i++)      {         en = (Enemy) yngwie.EC.Enemies.elementAt(i);         if (!en.Death && (en.Time() > StartSweepTime))            count++;      }      if (count >= yngwie.getOthers())         return true;      else         return false;   }   public void Update(){      double curHeading = yngwie.getRadarHeading();      if (ScanRound){         if ((Scans > 8) || AllSpotted()){            TaskDone = true;            ScanRound = false;            LastRoundCheck = yngwie.getTime();            AssistGunner();            Update();         }         else            yngwie.control.TurnRightMax(cRadar,3);      }      else if (EnemyFinding){         if (LostEnemy.Death || (LostEnemy.Time() == yngwie.getTime()))         {            AssistGunner();            Update();            return;         }         if (RightSweeping)            yngwie.control.TurnRightMax(cRadar,3);         else            yngwie.control.TurnLeftMax(cRadar,3);      }      else if (Assist){         double diff;         if (CheckingProblem){            if (My.isToRightDeg(curHeading,ProblemHeading))               if (My.isToRightDeg(ProblemHeading,lastHeading))               {                  CheckingProblem = false;               }               else               {                  yngwie.control.TurnRightMax(cRadar,0);                  return;               }            else            {               if (My.isToRightDeg(lastHeading,ProblemHeading))               {                  CheckingProblem = false;               }               else               {                  yngwie.control.TurnLeftMax(cRadar,0);                  return;               }            }         }         if ((yngwie.getTime()-yngwie.gunner.lastTimeFired < 4 ) && (yngwie.getTime()-LastRoundCheck > 40) &&             ((yngwie.gunner.Target == null) || ((yngwie.getTime()-yngwie.gunner.Target.LastTimeFired < 4) && (yngwie.Distance(yngwie.gunner.Target) > 200.0))))         {            if (!yngwie.OneOnOne){               ScanRound();               Update();            }         }         if (CheckSweepCompleted() || FirstTime){            FirstTime = false;            StartNewSweep();         }         if (LeftSweepEnemy == null)         {            StartNewSweep(); // toch even checken of er iets gezien is.            yngwie.control.TurnLeftMax(cRadar,2);         }         else if ((LeftSweepEnemy == RightSweepEnemy) &&(yngwie.getTime() - LeftSweepEnemy.Time() > 10))            yngwie.control.TurnLeftMax(cRadar,2);         else if (LeftSweepEnemy != null)         {            double LeftEnemyHeading =  yngwie.NextTurnAngleTo(LeftSweepEnemy);            if (!RightSweeping && (My.IsAngleBetween(LeftEnemyHeading,curHeading,lastHeading)) &&                (LeftSweepEnemy.Time() != yngwie.getTime()) && (StartSweepTime != yngwie.getTime()))            {               FindEnemy(LeftSweepEnemy,false);               Update();               return;            }            double RightEnemyHeading =  yngwie.NextTurnAngleTo( RightSweepEnemy);            if (RightSweeping && (My.IsAngleBetween(RightEnemyHeading,lastHeading,curHeading)) &&                (RightSweepEnemy.Time() != yngwie.getTime()) && (StartSweepTime != yngwie.getTime()))            {               FindEnemy(RightSweepEnemy,true);               Update();               return;            }            if (!My.IsAngleBetween(curHeading,LeftEnemyHeading,RightEnemyHeading))            {               if (My.absADiffDeg2(curHeading,LeftEnemyHeading) < My.absADiffDeg2(RightEnemyHeading,curHeading))               {                  RightSweeping = true;               }               else               {                  RightSweeping = false;               }            }            if (RightSweeping)            {               if (RightSweepEnemy == LeftSweepEnemy)                  yngwie.control.TurnRight(cRadar,3,My.absADiffDeg2(curHeading,yngwie.NextTurnAngleTo(RightSweepEnemy))+20.0);               else               {                  diff = My.absADiffDeg2(curHeading,yngwie.NextTurnAngleTo(RightSweepEnemy));                  yngwie.control.TurnRight(cRadar,3,diff+10.0);               }            }            else            {               if (RightSweepEnemy == LeftSweepEnemy)                  yngwie.control.TurnLeft(cRadar,3,My.absADiffDeg2(yngwie.NextTurnAngleTo(LeftSweepEnemy),curHeading)+20.0);               else               {                  diff = My.absADiffDeg2(yngwie.NextTurnAngleTo(LeftSweepEnemy),curHeading);                  yngwie.control.TurnLeft(cRadar,3,diff+10.0);               }            }         }      }      Scans++;      lastHeading = curHeading;   }   private void Clear(){      ScanRound = false;      EnemyFinding = false;      LostEnemy = null;      Assist = false;      TaskDone = false;      Scans = 0;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -