Advertisement
Guest User

Untitled

a guest
Nov 15th, 2012
425
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.08 KB | None | 0 0
  1. import model.*;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6.  
  7. public final class MyStrategy implements Strategy {
  8.  
  9.     final double MIN_ANGLE_FIRE = Math.PI/180;
  10.     final double MIN_ANGLE_MOVE = Math.PI/3;
  11.  
  12.     static double worldHeight = 0,worldWidth = 0;
  13.     static double moveTox = 0;
  14.     static double moveToy = 0;
  15.  
  16.     static String s = "";
  17.     Bonus currentBonus = null;
  18.     ArrayList<Shell> fire = null;
  19.     Tank enemy = null;
  20.     String enemyName = null;
  21.     double eX = 0;
  22.     double eY = 0;
  23.     double lTP = -1;
  24.     double rTP = -0.5;
  25.  
  26.     @Override
  27.     public void move(Tank self, World world, Move move) {
  28.  
  29.         if (worldHeight==0) {
  30.             worldHeight = world.getHeight();
  31.             worldWidth = world.getWidth();
  32.  
  33.             moveTox = 570;
  34.             moveToy = 23;
  35.             if (self.getX()>(worldWidth/2) && self.getY()<(worldHeight/2-1)) {
  36.                 lTP = -0.5;
  37.                 rTP = -1;
  38.             }
  39.             if (self.getX()<(worldWidth/2) && self.getY()>(worldHeight/2+1)) {
  40.                 lTP = -0.5;
  41.                 rTP = -1;
  42.             }
  43.         }
  44.  
  45.         //fire
  46.         if (world.getTick()%100==0 || (enemy==null || (enemy.getDistanceTo(self)>800 && self.getPremiumShellCount()==0) )) {
  47.  
  48.             enemy = fireTo( self,  world,  move );
  49.  
  50.         }
  51.         else {
  52.             for (Tank t:world.getTanks()) {
  53.                 if (t.getPlayerName().equals(enemyName)) {
  54.                     enemy = t;
  55.                 }
  56.             }
  57.             if (enemy!=null)
  58.                 fire(self,move );
  59.         }
  60.  
  61.  
  62.  
  63.             if (!moveToBonus( self,  world,  move )){
  64.                 if (world.getTick()<250) {
  65.                     move.setLeftTrackPower(lTP);
  66.                     move.setRightTrackPower(rTP);
  67.                 }
  68.                 else {
  69.                     if (enemy!=null) {
  70.  
  71.  
  72.                         if (world.getTick()%10==0){
  73.                             calcEnemyBack(self);
  74.                         }
  75.  
  76.                         moveTox = eX;//enemy.getX();
  77.                         moveToy = eY;//enemy.getY();
  78.                         moveTo(self,  world,  move);
  79.                     }
  80.                 }
  81.             }
  82.  
  83.     }
  84.  
  85.     private void calcEnemyBack(Tank self) {
  86.         eX = Math.round(enemy.getX());
  87.         eY = Math.round(enemy.getY());
  88.  
  89.         double d2me = 0;
  90.         double skipX = 0;
  91.         double skipY = 0;
  92.         for (double i=eX-200;i<=eX+200;i=i+200) {
  93.             for (double j=eY-200;j<=eY+200;j=j+200) {
  94.                 if (isNearBoder2(i,j)||(int)i==(int)eX || (int)j==(int)eY)
  95.                     continue;
  96.                 if (self.getDistanceTo(i,j)>d2me) {
  97.                     d2me = self.getDistanceTo(i,j);
  98.                     skipX = i;
  99.                     skipY = j;
  100.                 }
  101.             }
  102.  
  103.         }
  104.  
  105.         double a = 0;
  106.         for (double i=eX-200;i<=eX+200;i=i+200) {
  107.             for (double j=eY-200;j<=eY+200;j=j+200) {
  108.                 if (isNearBoder2(i,j) || (int)i==(int)eX || (int)j==(int)eY || ( (int)i==(int)skipX && (int)j==(int)skipY) )
  109.                     continue;
  110.  
  111.                 if (Math.toDegrees(Math.abs(enemy.getTurretAngleTo(i,j)))>a) {
  112.                     a = Math.toDegrees(Math.abs(enemy.getTurretAngleTo(i,j)));
  113.                     eX = i;
  114.                     eY = j;
  115.                 }
  116.             }
  117.  
  118.         }
  119.  
  120.  
  121.     }
  122.  
  123.     public boolean moveToBonus(Tank self, World world, Move move) {
  124.         currentBonus = null;
  125.         Bonus[] all_bonuses = world.getBonuses();
  126.         ArrayList <myBonuses> all = new ArrayList<myBonuses>();
  127.  
  128.         for (Bonus b:all_bonuses) {
  129.  
  130.             if (isUgol(b.getX(),b.getY())) continue;
  131.  
  132.             myBonuses my = new myBonuses();
  133.             my.setB(b);
  134.             my.setAngle(self.getAngleTo(b));
  135.  
  136.  
  137.             double mydist = self.getDistanceTo(b);
  138.             my.setDistance(mydist);
  139.  
  140.             if (mydist>600)
  141.                 continue;
  142.             if (self.getCrewHealth()>=60 && b.getType().equals(BonusType.MEDIKIT))
  143.                 continue;
  144.             if ((self.getHullDurability()/self.getHullMaxDurability()>0.65 || self.getEnginePower()>3000) && b.getType().equals(BonusType.REPAIR_KIT))
  145.                 continue;
  146.             if (self.getPremiumShellCount()>0 && b.getType().equals(BonusType.AMMO_CRATE)) {
  147.                 continue;
  148.             }
  149.             all.add(my);
  150.         }
  151.         Collections.sort(all,new CmpBonus());
  152.  
  153.         if (all.size()>1 ) {
  154.             Bonus b = all.get(0).getB();
  155.             if (self.getCrewHealth()<25 ){
  156.                 for (myBonuses my:all) {
  157.                     Bonus newB = my.getB();
  158.                     if (newB.getType() == BonusType.MEDIKIT) {
  159.                         b = newB;
  160.                         break;
  161.                     }
  162.                 }
  163.             }
  164.  
  165.             moveTox = b.getX();
  166.             moveToy = b.getY();
  167.             moveTo(self,  world,  move);
  168.             return  true;
  169.         }
  170.         return false;
  171.     }
  172.  
  173.     public void calcSafetyPlace(Tank self,World world) {
  174.         //съебывемся в угол где дальше всех до врагов
  175.         int minX = 80;
  176.         int maxX = 1280;
  177.         int minY = 80;
  178.         if (self.getX()<=640) {
  179.             minX = 160; maxX=500;
  180.         }
  181.         else {
  182.             minX = 680; maxX=1140;
  183.         }
  184.         //double minX=worldWidth/2,minY=worldHeight/2;
  185.         ArrayList <MyCorner> all = new ArrayList<MyCorner>();
  186.         for(int x=minX;x<maxX;x=x+20) {
  187.             for(int y=160;y<640;y=y+20) {
  188.                 double dist = 0;
  189.                 double angle = 0;
  190.                 for(Tank t:world.getTanks()) {
  191.                     if (!t.isTeammate() && t.getCrewHealth()>0 ) {
  192.                         dist+= t.getDistanceTo(x,y);
  193.                         //angle+= Math.abs(t.getTurretAngleTo(x,y))*100;
  194.                     }
  195.                 }
  196.                 MyCorner c = new MyCorner();
  197.                 c.setX(x);
  198.                 c.setY(y);
  199.                 c.setAngle(angle);
  200.                 c.setDist(dist);
  201.                 all.add(c);
  202.             }
  203.         }
  204.         if (all.size()>0) {
  205.             Collections.sort(all,new CmpCorner());
  206.  
  207.             minX = (int) all.get(0).getX();
  208.             minY = (int) all.get(0).getY();
  209.             System.out.println("safe"+all.get(0).getX()+"?"+all.get(0).getY()+":"+self.getX());
  210.         }
  211.         moveTox = minX;
  212.         moveToy = minY;
  213.  
  214.     }
  215.  
  216.     public boolean isUgol(double x,double y) {
  217.         if (x<100 && y<100) return true;
  218.         if (y<100 && x>1180) return true;
  219.         if (y>700 && x<100) return true;
  220.         if (y>700 && x>1180) return true;
  221.         return false;
  222.     }
  223.     public boolean isNearBoder2(double x,double y) {
  224.  
  225.         if (x<100 ) return true;
  226.         if (x>1180) return true;
  227.         if (y>700) return true;
  228.         if (y<100 ) return true;
  229.         return false;
  230.     }
  231.     public boolean isNearBoder(double x,double y) {
  232.         return true;
  233.     }
  234.  
  235.     public void moveTo(Tank self, World world, Move move) {
  236.  
  237.         double angle = self.getAngleTo(moveTox,moveToy);
  238.         double angleD = Math.toDegrees(angle);
  239.         double dist = self.getDistanceTo(moveTox,moveToy);
  240.         double deltaY = Math.atan(Math.abs(angle))*dist+60;
  241.         double hypotenuza = Math.sqrt(dist*dist+deltaY*deltaY);
  242.  
  243.         double kLAngle = 1;
  244.         double kRAngle = 1;
  245.         double kKorrect = 0.3;//0.5
  246.  
  247.  
  248.         //angle
  249.         if (angleD>=0 && angleD<=180) {
  250.             //move fwd right
  251.             if (dist>250 && !isNearBoder(self.getX(),self.getY())) {
  252.                 kLAngle = 1;
  253.                 kRAngle = dist/hypotenuza-kKorrect;
  254.             }
  255.             else {
  256.                 if (angleD<=90 ) {
  257.                     //будем разворачиваться
  258.                     if (angle>MIN_ANGLE_MOVE) {
  259.                         kLAngle = 0.75;
  260.                         kRAngle = -1;
  261.                     }
  262.                     else {
  263.                         kLAngle = 1;
  264.                         kRAngle = dist/hypotenuza-kKorrect;
  265.                     }
  266.                 }
  267.                 else {
  268.                     //move back left
  269.                     if (angleD>=(90+Math.toDegrees(MIN_ANGLE_MOVE))) {
  270.                         kLAngle = -1;
  271.                         kRAngle = 0.75;
  272.                     }
  273.                     else {
  274.                         kLAngle = -1;
  275.                         kRAngle = -1*(dist/hypotenuza-kKorrect);
  276.                     }
  277.                 }
  278.             }
  279.         }
  280.         else if (angleD<0 && angleD<=180) {
  281.             if (dist>250 && !isNearBoder(self.getX(),self.getY())) {
  282.                 kLAngle = dist/hypotenuza-kKorrect;
  283.                 kRAngle = 1;
  284.             }
  285.             else {
  286.                 //move fwd left
  287.                 if (angleD>-90) {
  288.                     if (angle < -MIN_ANGLE_MOVE) {
  289.                         kLAngle=-1.0;
  290.                         kRAngle=0.75;
  291.                     }
  292.                     else {
  293.                         kLAngle = dist/hypotenuza-kKorrect;
  294.                         kRAngle = 1;
  295.                     }
  296.                 }
  297.                 else {
  298.                     //back right
  299.                     if (angleD > -120 ) {
  300.                         kLAngle = 0.75;
  301.                         kRAngle = -1;
  302.                     }
  303.                     else {
  304.                         kLAngle=(dist/hypotenuza-kKorrect)*(-1);
  305.                         kRAngle = -1;
  306.                     }
  307.                 }
  308.             }
  309.         }
  310.  
  311.  
  312.         //speed
  313.         double kLSpeed = 1;
  314.         double kRSpeed = 1;
  315.         if (Math.round(self.getDistanceTo(moveTox,moveToy))<80){
  316.  
  317.         }
  318.         if (Math.round(self.getDistanceTo(moveTox,moveToy))<40){
  319.             if (Math.abs(kRAngle)==1)
  320.                 kRSpeed = kRSpeed*0.9; //left
  321.             if (Math.abs(kLAngle)==1)
  322.                 kLSpeed = kLSpeed*0.9; //right
  323.         }
  324.  
  325.  
  326.         move.setLeftTrackPower(kLSpeed*kLAngle);
  327.         move.setRightTrackPower(kRSpeed*kRAngle);
  328.  
  329.  
  330.     }
  331.  
  332.     public Tank fireTo(Tank self, World world, Move move) {
  333.         Tank[] all_tanks = world.getTanks();
  334.         ArrayList <myEnemy> all = new ArrayList<myEnemy>();
  335.  
  336.         for (Tank t:all_tanks) {
  337.             int k = 0;
  338.             if (!t.isTeammate() && t.getCrewHealth()>0 ) {
  339.                 myEnemy my = new myEnemy();
  340.                 my.setT(t);
  341.                 //ближний - цель
  342.                 double d = self.getDistanceTo(t);
  343.                 if (d<100) k=20;
  344.                 else if(d<200) k=18;
  345.                 else if(d<300) k=16;
  346.                 else if(d<400) k=14;
  347.                 else if(d<500) k=5;
  348.                 else if(d<600) k=4;
  349.                 else if(d<700) k=3;
  350.                 else if(d<800) k=2;
  351.                 else k=1;
  352.                 //слабый - цель
  353.                 double h = t.getCrewHealth()/t.getCrewMaxHealth();
  354.                 if (h<0.2) k+=5;
  355.                 else if(h<0.3) k+=4;
  356.                 else if(h<0.4) k+=3;
  357.                 else if(h<0.5) k+=2;
  358.                 else k++;
  359.                 //целится в меня
  360.                 double inMe = Math.abs(Math.toDegrees(t.getTurretAngleTo(self)));
  361.                 if (self.getCrewHealth()>t.getCrewHealth()*1.2) {  //я здоровее на 20% буду!
  362.                     if (inMe<5) k+=10;
  363.                     else if(inMe<10) k+=8;
  364.                     else if(inMe<20) k+=7;
  365.                     else if(inMe<30) k+=6;
  366.                     else if(inMe<40) k+=5;
  367.                     else if(inMe<50) k+=4;
  368.                     else if(inMe<60) k+=3;
  369.                     else if(inMe<70) k+=2;
  370.                     else k++;
  371.                 }
  372.                 else {
  373.                     //лучше съебаться
  374.                     if (inMe<5) k+=1;
  375.                     else if(inMe<10) k+=2;
  376.                     else if(inMe<20) k+=3;
  377.                     else if(inMe<30) k+=4;
  378.                     else if(inMe<40) k+=5;
  379.                     else if(inMe<50) k+=6;
  380.                     else if(inMe<60) k+=7;
  381.                     else if(inMe<70) k+=8;
  382.                     else k+=10;
  383.                 }
  384.  
  385.                 //мой угол меньше - лучше
  386.                 double myA = Math.abs(Math.toDegrees(self.getTurretAngleTo(t)));
  387.                 if (myA<5) k+=10;
  388.                 else if(myA<10) k+=8;
  389.                 else if(myA<20) k+=7;
  390.                 else if(myA<30) k+=6;
  391.                 else if(myA<40) k+=5;
  392.                 else if(myA<50) k+=4;
  393.                 else if(myA<60) k+=3;
  394.                 else if(myA<70) k+=2;
  395.                 else k++;
  396.  
  397.                 my.setK(k);
  398.                 //чем дальше от центра тем лучше
  399.                 double c = t.getDistanceTo(worldWidth/2,worldHeight/2);
  400.                 if (c<100) k+=5;
  401.                 else if(d<200) k+=4;
  402.                 else if(d<300) k+=3;
  403.                 else if(d<400) k+=2;
  404.                 else k++;
  405.                 my.setHealth(t.getCrewMaxHealth()-t.getCrewHealth());
  406.                 my.setDurab(t.getHullMaxDurability()-t.getHullDurability());
  407.                 my.setAngle(self.getAngleTo(t));
  408.                 my.setDistance(self.getDistanceTo(t));
  409.                 all.add(my);
  410.             }
  411.         }
  412.         Collections.sort(all,new CmpEnemy());
  413.  
  414.         if (all.size()>0) {
  415.             Tank t = all.get(0).getT();//ближний по дефолту
  416.  
  417.             enemyName = t.getPlayerName();
  418.  
  419.             System.out.println(enemyName+":"+all.get(0).getK());
  420.             return t;
  421.         }
  422.         else {
  423.             return null;
  424.         }
  425.     }
  426.     public class CmpEnemy implements Comparator<myEnemy> {
  427.         @Override
  428.         public int compare(myEnemy o1, myEnemy o2) {
  429.             int i1 = o1.getK();
  430.             int i2 = o2.getK();
  431.  
  432.             return (int) (i2-i1);
  433.         }
  434.     }
  435.  
  436.     public void fire(Tank self, Move move) {
  437.  
  438.         double angle = self.getTurretAngleTo(enemy);
  439.         double minAngle = MIN_ANGLE_FIRE;
  440.         double d = self.getDistanceTo(enemy);
  441.         if (d<100)
  442.             minAngle = Math.toRadians(35);
  443.         else if (d<150) {
  444.             minAngle = Math.toRadians(15);
  445.         }
  446.         else if (d<200) {
  447.             minAngle = Math.toRadians(5);
  448.         }
  449.         else if (d<250) {
  450.             minAngle = Math.toRadians(3);
  451.         }
  452.         else if (d<300) {
  453.             minAngle = Math.toRadians(2);
  454.         }
  455.  
  456.         if (angle > minAngle) {
  457.             move.setTurretTurn(1.0);
  458.         } else if (angle < -minAngle) {
  459.             move.setTurretTurn(-1.0);
  460.         } else {
  461.             System.out.println("D"+self.getDistanceTo(enemy)+" A"+Math.toDegrees(angle));
  462.             move.setFireType(FireType.PREMIUM_PREFERRED);
  463.         }
  464.  
  465.     }
  466.  
  467.     public class CmpBonus implements Comparator<myBonuses> {
  468.         @Override
  469.         public int compare(myBonuses o1, myBonuses o2) {
  470.             double i1 = o1.getDistance();
  471.             double i2 = o2.getDistance();
  472.             return (int) (i1-i2);
  473.         }
  474.     }
  475.  
  476.     private class myBonuses{
  477.         private Bonus b;
  478.         private double angle;
  479.         private double distance;
  480.  
  481.  
  482.         public double getAngle() {
  483.             return angle;
  484.         }
  485.  
  486.         public void setAngle(double angle) {
  487.             this.angle = angle;
  488.         }
  489.  
  490.         public Bonus getB() {
  491.             return b;
  492.         }
  493.  
  494.         public void setB(Bonus b) {
  495.             this.b = b;
  496.         }
  497.  
  498.         public double getDistance() {
  499.             return distance;
  500.         }
  501.  
  502.         public void setDistance(double distance) {
  503.             this.distance = distance;
  504.         }
  505.     }
  506.  
  507.  
  508.  
  509.     public class CmpCorner implements Comparator<MyCorner> {
  510.         @Override
  511.         public int compare(MyCorner o1, MyCorner o2) {
  512.             double i1 = o1.getDist();//+o1.getAngle()*2;
  513.             double i2 = o2.getDist();//+o2.getAngle()*2;
  514.             return (int) (i2-i1);
  515.         }
  516.     }
  517.     private class MyCorner{
  518.         private double x;
  519.         private double y;
  520.         private double dist;
  521.         private double angle;
  522.  
  523.         public double getX() {
  524.             return x;
  525.         }
  526.  
  527.         public void setX(double x) {
  528.             this.x = x;
  529.         }
  530.  
  531.         public double getY() {
  532.             return y;
  533.         }
  534.  
  535.         public void setY(double y) {
  536.             this.y = y;
  537.         }
  538.  
  539.         public double getDist() {
  540.             return dist;
  541.         }
  542.  
  543.         public void setDist(double dist) {
  544.             this.dist = dist;
  545.         }
  546.  
  547.         public double getAngle() {
  548.             return angle;
  549.         }
  550.  
  551.         public void setAngle(double angle) {
  552.             this.angle = angle;
  553.         }
  554.     }
  555.  
  556.     private class myEnemy{
  557.         private Tank t;
  558.         private double angle;
  559.         private double distance;
  560.         private int health;
  561.         private int durab;
  562.         private int k;
  563.  
  564.         public double getAngle() {
  565.             return angle;
  566.         }
  567.  
  568.         public void setAngle(double angle) {
  569.             this.angle = angle;
  570.         }
  571.  
  572.         public Tank getT() {
  573.             return t;
  574.         }
  575.  
  576.         public void setT(Tank t) {
  577.             this.t = t;
  578.         }
  579.  
  580.         public double getDistance() {
  581.             return distance;
  582.         }
  583.  
  584.         public void setDistance(double distance) {
  585.             this.distance = distance;
  586.         }
  587.  
  588.         public int getHealth() {
  589.             return health;
  590.         }
  591.  
  592.         public void setHealth(int health) {
  593.             this.health = health;
  594.         }
  595.  
  596.         public int getDurab() {
  597.             return durab;
  598.         }
  599.  
  600.         public void setDurab(int durab) {
  601.             this.durab = durab;
  602.         }
  603.  
  604.         public int getK() {
  605.             return k;
  606.         }
  607.  
  608.         public void setK(int k) {
  609.             this.k = k;
  610.         }
  611.     }
  612.  
  613.     @Override
  614.     public TankType selectTank(int tankIndex, int teamSize) {
  615.  
  616.         return TankType.MEDIUM;
  617.     }
  618. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement