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

📄 predictor.java

📁 2007年robecode大赛高级段冠军代码1!
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package emp;import java.util.Random;import java.awt.Point;import java.awt.Polygon;public class Predictor implements Consts{   private class HistoryMatchInfo implements Consts{      public int Idx;      public int Length;      public double Corr;      public boolean Found;      public int Type;      public HistoryMatchInfo(){         Idx = 0;         Length = 0;         Corr = 0;         Found = false;      }   }   Yngwie yngwie;   private static Random rand = new Random();   private Enemy pe;   private double BulletPowerAtEnemy;   private double MaxFirePower;   private double AdvicePower;   private boolean canKillEnemy;   public Predictor(Yngwie y){      yngwie = y;      BulletPowerAtEnemy = 0.0;      MaxFirePower = 0.0;      AdvicePower  = 0.0;      canKillEnemy = false;      pe = null;   }   private void SortStrategies(){   // een langzame sort.      if (pe.Strategies.size() < 2)         return;      Strategy S1;      Strategy S2;      int j = 0;      while (j+1 < pe.Strategies.size()) {         S1 = (Strategy)pe.Strategies.elementAt(j);         S2 = (Strategy)pe.Strategies.elementAt(j+1);         if (S2.Faith() > S1.Faith()){            pe.Strategies.removeElementAt(j);            pe.Strategies.insertElementAt(S1,j+1);            j = 0;         }         else            j++;      }   }   private void BlessBullet(){      if (pe.HitX < 35.0)         pe.HitX = 35.0;      else if (pe.HitX > yngwie.BattleFieldWidth - 35.0)         pe.HitX = yngwie.BattleFieldWidth - 35.0;      if (pe.HitY < 35.0)         pe.HitY = 35.0;      else if (pe.HitY > yngwie.BattleFieldHeight - 35.0)         pe.HitY = yngwie.BattleFieldHeight - 35.0;   }   public void Predict(Enemy en){      if ((en == null) || (en.Death) || (yngwie.getEnergy() <= 0.1))         return;      pe = en;      if (en.Energy() <= 0.0){ // kill him quick//         yngwie.out.println("finish him" + en.Energy());         en.HitStrategy = cFinisherPredictor;         en.HitX = en.X();         en.HitY = en.Y();         en.HitPower = 0.1;         return;      }      // bepalen maximum firepower      MaxFirePower = cMaxBulletPower;      if (yngwie.getEnergy() <= cSaveAmmoMode2) // we zijn bijna kapot         MaxFirePower = 0.1;      else if (yngwie.getEnergy() <= cSaveAmmoMode1) // we zijn iets minder bijna kapot         MaxFirePower = 1.0;      if (pe.Energy() < 16.0)      {         canKillEnemy = true;         double PowerToKill = My.getBulletPowerToKill(pe.Energy());//         yngwie.out.println("kill "+pe.Name+" power "+PowerToKill);         if (yngwie.getBulletDamageAimedAt(en) > PowerToKill)            MaxFirePower = Math.min(MaxFirePower,1.0);         else            MaxFirePower = Math.min(MaxFirePower,PowerToKill);      }      else         canKillEnemy = false;      double dist = yngwie.Distance(pe);      if ((Yngwie.OneOnOne) && (Yngwie.BattleFieldHeight == 600.0))      {         if (dist < 200.0)            AdvicePower = cMaxBulletPower;         else if (dist < 400.0)            AdvicePower = 2.0;         else AdvicePower = 1.5;      }      else if ((Yngwie.OneOnOne) && (Yngwie.BattleFieldHeight != 600.0))      {         if (dist < 200.0)            AdvicePower = cMaxBulletPower;         else if (dist < 400.0)            AdvicePower = 2.0;         else if (dist < 800.0)            AdvicePower = 1.0;         else AdvicePower = 0.5;      }      else      {         if (dist < 150.0)            AdvicePower = cMaxBulletPower;         else if (dist < 400.0)            AdvicePower = 1.0;         else AdvicePower = 0.5;         Enemy e; // als er nog een enemy achter zit, schiet wat harder         for (int i=0; i < yngwie.EC.Enemies.size();i++)         {            e = (Enemy) yngwie.EC.Enemies.elementAt(i);            if ((e.Death) ||                (e.Time() == -1) ||                (e == en) ||                (e.Time() != yngwie.getTime()))                continue;            if ((My.absADiffDeg(yngwie.AngleTo(e),yngwie.AngleTo(en)) < 4.0))            {               if (yngwie.Distance(e) < 400.0)                  AdvicePower = Math.min(cMaxBulletPower,AdvicePower + 0.5);               break;            }         }      }      en.HitPower = 0.0;      en.HitX = en.X();      en.HitY = en.Y();      SortStrategies();      Strategy s;      HistoryMatchInfo h;      for (int i = 0;i < en.Strategies.size(); i++) {         s = (Strategy)en.Strategies.elementAt(i);         if (s.ID == cFinisherPredictor)            continue;         if (s.ID == cCurPosPredictor) {            en.HitStrategy = cCurPosPredictor;            en.HitX = en.X();            en.HitY = en.Y();            en.HitPower = Math.min(MaxFirePower,Math.max(0.1,2.0* s.Faith()/ 100.0));//Math.min(3,Math.max(0.1,s.AvgScore/10));            return;         }         else if (s.ID == cXYPredictor) {            if (HistoryPredictor(s.ID))               break;         }         else if (s.ID == cCloseRangePredictor) {            if (CloseRangePredict())               break;         }         else if (s.ID == cSquarePredictor) {            if (SquarePredict())               break;         }         else if (s.ID == cTurnDispPredictor) {            if (HistoryPredictor(s.ID))               break;         }         else if (s.ID == cSprayPredictor){            if (SprayPredict(en))               break;         }         else if (s.ID == cVelocityPredictor) {            if (HistoryPredictor(s.ID))               break;         }         else if (s.ID == cLinearPredictor) {            if (LinearPredict())               break;         }         else if ((s.ID == cDodgePredictor) || (s.ID == cDodge2Predictor)){            if (DodgePredict(s.ID))               break;         }      }      BlessBullet();      return;   }   private boolean HistoryPredictor(int sID){      HistoryMatchInfo h = HistoryMatch(sID);      if (h.Found)         return GuessHitPoint(h);      else         return false;   }   private boolean DodgePredict(int sID){      if (pe.BulletList.size() < 10)         return false;      double bestScore = 0.0;      int bestItem = -1;      double score1;      double score2;      double score3;      double score;      BulletItem bi;      double bearingNow = My.absADiffDeg2(yngwie.AngleTo(pe),pe.Heading());      double dist = yngwie.Distance(pe);      int lastIndex = 0;      if (pe.BulletList.size() > 1000)         lastIndex = (int) 0.5 * pe.BulletList.size();      else if (pe.BulletList.size() > 100)         lastIndex = (int) 0.2 * pe.BulletList.size();      if (sID == cDodgePredictor)      {         for (int i = pe.BulletList.size()-1; i >= lastIndex;i--)         {            bi = (BulletItem) pe.BulletList.elementAt(i);            if (bi.OneOnOne != Yngwie.OneOnOne)               continue;            score1 = 17.0 - Math.abs(pe.Velocity() - bi.EnemyVelocity);            score2 = 10.0 - (My.absADiffDeg(bearingNow,bi.EnemyBearing) / 20.0);            score3 = Math.max(1.0,10.0-Math.abs(dist - bi.Distance)/30.0);            score = score1 * score2 * score3;            if (score > bestScore){               bestScore = score;               bestItem = i;            }         }      }      else      {         for (int i = pe.BulletList.size()-1; i >= lastIndex;i--)         {            bi = (BulletItem) pe.BulletList.elementAt(i);            if (bi.OneOnOne != Yngwie.OneOnOne)               continue;            score = 10.0 - 0.25 * Math.abs(pe.Velocity() - bi.EnemyVelocity);            score *= Math.max(0.1,2.0 - Math.abs(AdvicePower - bi.firePower));            score *= Math.max(1.0,10.0-Math.abs(dist - bi.Distance)/20.0);            if (score > bestScore){               bestScore = score;               bestItem = i;            }         }      }      if (bestItem == -1)         return false;      bi = (BulletItem) pe.BulletList.elementAt(bestItem);      double TargetX;      double TargetY;      double Power;      if (sID == cDodgePredictor)      {         double hoek = My.AddDegrees(pe.Heading(),bi.DeviationAngle);         double snelheid  = bi.Deviation / bi.Duration;         double Speed;         double damage;         long Turns;         double MaxTurns = bi.Duration+4;         int i;         for (int k = 6; k >= 0; k--){            if ((k == 6) && (canKillEnemy))               Power = MaxFirePower;            else            {               Power = Math.max(k * 0.5,0.1);               if ((Power > MaxFirePower) || (Power > AdvicePower))                  continue;            }            Speed = My.getBulletVelocity(Power);            damage = My.getBulletDamage(Power);            TargetX = pe.X();            TargetY = pe.Y();            Turns = 1;            while ((Turns < MaxTurns) && PointInBattleField(TargetX,TargetY)){               if (My.Distance(TargetX,TargetY,yngwie.X,yngwie.Y)-18.0 < Speed * Turns){                  pe.HitX = TargetX;                  pe.HitY = TargetY;                  pe.HitPower = Power;                  pe.HitStrategy = cDodgePredictor;                  return true;               }               TargetX = TargetX + snelheid * My.sinDeg(hoek);               TargetY = TargetY + snelheid * My.cosDeg(hoek);               Turns++;            }         }         return false;      }      else if (sID == cDodge2Predictor)      {         if (Math.abs(dist - bi.Distance) > 30.0)            return false;         TargetX = pe.X() + bi.Deviation * My.sinDeg(My.AddDegrees(pe.Heading(),bi.DeviationAngle));         TargetY = pe.Y() + bi.Deviation * My.cosDeg(My.AddDegrees(pe.Heading(),bi.DeviationAngle));         if ((PointInBattleField(TargetX,TargetY)) && (bi.firePower <= MaxFirePower))         {            pe.HitX = TargetX;            pe.HitY = TargetY;            pe.HitPower = bi.firePower;            pe.HitStrategy = cDodge2Predictor;            return true;         }      }      return false;   }   private boolean SquarePredict(){      if (pe.RC < 60)         return false;      double CenterX = 0.0;      double CenterY = 0.0;      double MaxLeft   = Yngwie.BattleFieldWidth;      double MaxRight  = 0.0;      double MaxTop    = 0.0;      double MaxBottom = Yngwie.BattleFieldHeight;      double Precision;      double Power;      long curTime = yngwie.getTime();      int count = 0;      int k = pe.RC-1; // k is de index die langs de observaties loopt waartegen getest wordt, en begint met de laatst waargenomen observatie van deze enemy      while ((curTime - pe.Records[k][cTime] < 50) && (pe.Records[k][cTime] > 20) && (k > 5)){         CenterX += pe.Records[k][cX];         CenterY += pe.Records[k][cY];         if (pe.Records[k][cX] > MaxRight)            MaxRight = pe.Records[k][cX];         if (pe.Records[k][cX] < MaxLeft)            MaxLeft = pe.Records[k][cX];         if (pe.Records[k][cY] < MaxBottom)            MaxBottom = pe.Records[k][cY];         if (pe.Records[k][cY] > MaxTop)            MaxTop = pe.Records[k][cY];         count++;         k--;         if (count == 40){            Precision = Math.max(1.0,(MaxRight - MaxLeft) / 36.0);            Precision = Precision * Math.max(1.0,(MaxTop - MaxBottom) / 36.0);            Power = Math.min(MaxFirePower,Math.max(0.0,4.0 - (0.8 * Math.sqrt(Precision))));            if (Power > 0.0)            {               pe.HitX = CenterX / (double) count;               pe.HitY = CenterY / (double) count;               pe.HitPower = Power;               pe.HitStrategy = cSquarePredictor;               return true;            }         }      }      return false;   }   private boolean LinearPredict(){      if (pe.RC < 7)         return false;      double snelheid = 0.0;      double draaihoek = 0.0;

⌨️ 快捷键说明

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