📄 predictor.java
字号:
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 + -