Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import model.*;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- public final class MyStrategy implements Strategy {
- final double MIN_ANGLE_FIRE = Math.PI/180;
- final double MIN_ANGLE_MOVE = Math.PI/3;
- static double worldHeight = 0,worldWidth = 0;
- static double moveTox = 0;
- static double moveToy = 0;
- static String s = "";
- Bonus currentBonus = null;
- ArrayList<Shell> fire = null;
- Tank enemy = null;
- String enemyName = null;
- double eX = 0;
- double eY = 0;
- double lTP = -1;
- double rTP = -0.5;
- @Override
- public void move(Tank self, World world, Move move) {
- if (worldHeight==0) {
- worldHeight = world.getHeight();
- worldWidth = world.getWidth();
- moveTox = 570;
- moveToy = 23;
- if (self.getX()>(worldWidth/2) && self.getY()<(worldHeight/2-1)) {
- lTP = -0.5;
- rTP = -1;
- }
- if (self.getX()<(worldWidth/2) && self.getY()>(worldHeight/2+1)) {
- lTP = -0.5;
- rTP = -1;
- }
- }
- //fire
- if (world.getTick()%100==0 || (enemy==null || (enemy.getDistanceTo(self)>800 && self.getPremiumShellCount()==0) )) {
- enemy = fireTo( self, world, move );
- }
- else {
- for (Tank t:world.getTanks()) {
- if (t.getPlayerName().equals(enemyName)) {
- enemy = t;
- }
- }
- if (enemy!=null)
- fire(self,move );
- }
- if (!moveToBonus( self, world, move )){
- if (world.getTick()<250) {
- move.setLeftTrackPower(lTP);
- move.setRightTrackPower(rTP);
- }
- else {
- if (enemy!=null) {
- if (world.getTick()%10==0){
- calcEnemyBack(self);
- }
- moveTox = eX;//enemy.getX();
- moveToy = eY;//enemy.getY();
- moveTo(self, world, move);
- }
- }
- }
- }
- private void calcEnemyBack(Tank self) {
- eX = Math.round(enemy.getX());
- eY = Math.round(enemy.getY());
- double d2me = 0;
- double skipX = 0;
- double skipY = 0;
- for (double i=eX-200;i<=eX+200;i=i+200) {
- for (double j=eY-200;j<=eY+200;j=j+200) {
- if (isNearBoder2(i,j)||(int)i==(int)eX || (int)j==(int)eY)
- continue;
- if (self.getDistanceTo(i,j)>d2me) {
- d2me = self.getDistanceTo(i,j);
- skipX = i;
- skipY = j;
- }
- }
- }
- double a = 0;
- for (double i=eX-200;i<=eX+200;i=i+200) {
- for (double j=eY-200;j<=eY+200;j=j+200) {
- if (isNearBoder2(i,j) || (int)i==(int)eX || (int)j==(int)eY || ( (int)i==(int)skipX && (int)j==(int)skipY) )
- continue;
- if (Math.toDegrees(Math.abs(enemy.getTurretAngleTo(i,j)))>a) {
- a = Math.toDegrees(Math.abs(enemy.getTurretAngleTo(i,j)));
- eX = i;
- eY = j;
- }
- }
- }
- }
- public boolean moveToBonus(Tank self, World world, Move move) {
- currentBonus = null;
- Bonus[] all_bonuses = world.getBonuses();
- ArrayList <myBonuses> all = new ArrayList<myBonuses>();
- for (Bonus b:all_bonuses) {
- if (isUgol(b.getX(),b.getY())) continue;
- myBonuses my = new myBonuses();
- my.setB(b);
- my.setAngle(self.getAngleTo(b));
- double mydist = self.getDistanceTo(b);
- my.setDistance(mydist);
- if (mydist>600)
- continue;
- if (self.getCrewHealth()>=60 && b.getType().equals(BonusType.MEDIKIT))
- continue;
- if ((self.getHullDurability()/self.getHullMaxDurability()>0.65 || self.getEnginePower()>3000) && b.getType().equals(BonusType.REPAIR_KIT))
- continue;
- if (self.getPremiumShellCount()>0 && b.getType().equals(BonusType.AMMO_CRATE)) {
- continue;
- }
- all.add(my);
- }
- Collections.sort(all,new CmpBonus());
- if (all.size()>1 ) {
- Bonus b = all.get(0).getB();
- if (self.getCrewHealth()<25 ){
- for (myBonuses my:all) {
- Bonus newB = my.getB();
- if (newB.getType() == BonusType.MEDIKIT) {
- b = newB;
- break;
- }
- }
- }
- moveTox = b.getX();
- moveToy = b.getY();
- moveTo(self, world, move);
- return true;
- }
- return false;
- }
- public void calcSafetyPlace(Tank self,World world) {
- //съебывемся в угол где дальше всех до врагов
- int minX = 80;
- int maxX = 1280;
- int minY = 80;
- if (self.getX()<=640) {
- minX = 160; maxX=500;
- }
- else {
- minX = 680; maxX=1140;
- }
- //double minX=worldWidth/2,minY=worldHeight/2;
- ArrayList <MyCorner> all = new ArrayList<MyCorner>();
- for(int x=minX;x<maxX;x=x+20) {
- for(int y=160;y<640;y=y+20) {
- double dist = 0;
- double angle = 0;
- for(Tank t:world.getTanks()) {
- if (!t.isTeammate() && t.getCrewHealth()>0 ) {
- dist+= t.getDistanceTo(x,y);
- //angle+= Math.abs(t.getTurretAngleTo(x,y))*100;
- }
- }
- MyCorner c = new MyCorner();
- c.setX(x);
- c.setY(y);
- c.setAngle(angle);
- c.setDist(dist);
- all.add(c);
- }
- }
- if (all.size()>0) {
- Collections.sort(all,new CmpCorner());
- minX = (int) all.get(0).getX();
- minY = (int) all.get(0).getY();
- System.out.println("safe"+all.get(0).getX()+"?"+all.get(0).getY()+":"+self.getX());
- }
- moveTox = minX;
- moveToy = minY;
- }
- public boolean isUgol(double x,double y) {
- if (x<100 && y<100) return true;
- if (y<100 && x>1180) return true;
- if (y>700 && x<100) return true;
- if (y>700 && x>1180) return true;
- return false;
- }
- public boolean isNearBoder2(double x,double y) {
- if (x<100 ) return true;
- if (x>1180) return true;
- if (y>700) return true;
- if (y<100 ) return true;
- return false;
- }
- public boolean isNearBoder(double x,double y) {
- return true;
- }
- public void moveTo(Tank self, World world, Move move) {
- double angle = self.getAngleTo(moveTox,moveToy);
- double angleD = Math.toDegrees(angle);
- double dist = self.getDistanceTo(moveTox,moveToy);
- double deltaY = Math.atan(Math.abs(angle))*dist+60;
- double hypotenuza = Math.sqrt(dist*dist+deltaY*deltaY);
- double kLAngle = 1;
- double kRAngle = 1;
- double kKorrect = 0.3;//0.5
- //angle
- if (angleD>=0 && angleD<=180) {
- //move fwd right
- if (dist>250 && !isNearBoder(self.getX(),self.getY())) {
- kLAngle = 1;
- kRAngle = dist/hypotenuza-kKorrect;
- }
- else {
- if (angleD<=90 ) {
- //будем разворачиваться
- if (angle>MIN_ANGLE_MOVE) {
- kLAngle = 0.75;
- kRAngle = -1;
- }
- else {
- kLAngle = 1;
- kRAngle = dist/hypotenuza-kKorrect;
- }
- }
- else {
- //move back left
- if (angleD>=(90+Math.toDegrees(MIN_ANGLE_MOVE))) {
- kLAngle = -1;
- kRAngle = 0.75;
- }
- else {
- kLAngle = -1;
- kRAngle = -1*(dist/hypotenuza-kKorrect);
- }
- }
- }
- }
- else if (angleD<0 && angleD<=180) {
- if (dist>250 && !isNearBoder(self.getX(),self.getY())) {
- kLAngle = dist/hypotenuza-kKorrect;
- kRAngle = 1;
- }
- else {
- //move fwd left
- if (angleD>-90) {
- if (angle < -MIN_ANGLE_MOVE) {
- kLAngle=-1.0;
- kRAngle=0.75;
- }
- else {
- kLAngle = dist/hypotenuza-kKorrect;
- kRAngle = 1;
- }
- }
- else {
- //back right
- if (angleD > -120 ) {
- kLAngle = 0.75;
- kRAngle = -1;
- }
- else {
- kLAngle=(dist/hypotenuza-kKorrect)*(-1);
- kRAngle = -1;
- }
- }
- }
- }
- //speed
- double kLSpeed = 1;
- double kRSpeed = 1;
- if (Math.round(self.getDistanceTo(moveTox,moveToy))<80){
- }
- if (Math.round(self.getDistanceTo(moveTox,moveToy))<40){
- if (Math.abs(kRAngle)==1)
- kRSpeed = kRSpeed*0.9; //left
- if (Math.abs(kLAngle)==1)
- kLSpeed = kLSpeed*0.9; //right
- }
- move.setLeftTrackPower(kLSpeed*kLAngle);
- move.setRightTrackPower(kRSpeed*kRAngle);
- }
- public Tank fireTo(Tank self, World world, Move move) {
- Tank[] all_tanks = world.getTanks();
- ArrayList <myEnemy> all = new ArrayList<myEnemy>();
- for (Tank t:all_tanks) {
- int k = 0;
- if (!t.isTeammate() && t.getCrewHealth()>0 ) {
- myEnemy my = new myEnemy();
- my.setT(t);
- //ближний - цель
- double d = self.getDistanceTo(t);
- if (d<100) k=20;
- else if(d<200) k=18;
- else if(d<300) k=16;
- else if(d<400) k=14;
- else if(d<500) k=5;
- else if(d<600) k=4;
- else if(d<700) k=3;
- else if(d<800) k=2;
- else k=1;
- //слабый - цель
- double h = t.getCrewHealth()/t.getCrewMaxHealth();
- if (h<0.2) k+=5;
- else if(h<0.3) k+=4;
- else if(h<0.4) k+=3;
- else if(h<0.5) k+=2;
- else k++;
- //целится в меня
- double inMe = Math.abs(Math.toDegrees(t.getTurretAngleTo(self)));
- if (self.getCrewHealth()>t.getCrewHealth()*1.2) { //я здоровее на 20% буду!
- if (inMe<5) k+=10;
- else if(inMe<10) k+=8;
- else if(inMe<20) k+=7;
- else if(inMe<30) k+=6;
- else if(inMe<40) k+=5;
- else if(inMe<50) k+=4;
- else if(inMe<60) k+=3;
- else if(inMe<70) k+=2;
- else k++;
- }
- else {
- //лучше съебаться
- if (inMe<5) k+=1;
- else if(inMe<10) k+=2;
- else if(inMe<20) k+=3;
- else if(inMe<30) k+=4;
- else if(inMe<40) k+=5;
- else if(inMe<50) k+=6;
- else if(inMe<60) k+=7;
- else if(inMe<70) k+=8;
- else k+=10;
- }
- //мой угол меньше - лучше
- double myA = Math.abs(Math.toDegrees(self.getTurretAngleTo(t)));
- if (myA<5) k+=10;
- else if(myA<10) k+=8;
- else if(myA<20) k+=7;
- else if(myA<30) k+=6;
- else if(myA<40) k+=5;
- else if(myA<50) k+=4;
- else if(myA<60) k+=3;
- else if(myA<70) k+=2;
- else k++;
- my.setK(k);
- //чем дальше от центра тем лучше
- double c = t.getDistanceTo(worldWidth/2,worldHeight/2);
- if (c<100) k+=5;
- else if(d<200) k+=4;
- else if(d<300) k+=3;
- else if(d<400) k+=2;
- else k++;
- my.setHealth(t.getCrewMaxHealth()-t.getCrewHealth());
- my.setDurab(t.getHullMaxDurability()-t.getHullDurability());
- my.setAngle(self.getAngleTo(t));
- my.setDistance(self.getDistanceTo(t));
- all.add(my);
- }
- }
- Collections.sort(all,new CmpEnemy());
- if (all.size()>0) {
- Tank t = all.get(0).getT();//ближний по дефолту
- enemyName = t.getPlayerName();
- System.out.println(enemyName+":"+all.get(0).getK());
- return t;
- }
- else {
- return null;
- }
- }
- public class CmpEnemy implements Comparator<myEnemy> {
- @Override
- public int compare(myEnemy o1, myEnemy o2) {
- int i1 = o1.getK();
- int i2 = o2.getK();
- return (int) (i2-i1);
- }
- }
- public void fire(Tank self, Move move) {
- double angle = self.getTurretAngleTo(enemy);
- double minAngle = MIN_ANGLE_FIRE;
- double d = self.getDistanceTo(enemy);
- if (d<100)
- minAngle = Math.toRadians(35);
- else if (d<150) {
- minAngle = Math.toRadians(15);
- }
- else if (d<200) {
- minAngle = Math.toRadians(5);
- }
- else if (d<250) {
- minAngle = Math.toRadians(3);
- }
- else if (d<300) {
- minAngle = Math.toRadians(2);
- }
- if (angle > minAngle) {
- move.setTurretTurn(1.0);
- } else if (angle < -minAngle) {
- move.setTurretTurn(-1.0);
- } else {
- System.out.println("D"+self.getDistanceTo(enemy)+" A"+Math.toDegrees(angle));
- move.setFireType(FireType.PREMIUM_PREFERRED);
- }
- }
- public class CmpBonus implements Comparator<myBonuses> {
- @Override
- public int compare(myBonuses o1, myBonuses o2) {
- double i1 = o1.getDistance();
- double i2 = o2.getDistance();
- return (int) (i1-i2);
- }
- }
- private class myBonuses{
- private Bonus b;
- private double angle;
- private double distance;
- public double getAngle() {
- return angle;
- }
- public void setAngle(double angle) {
- this.angle = angle;
- }
- public Bonus getB() {
- return b;
- }
- public void setB(Bonus b) {
- this.b = b;
- }
- public double getDistance() {
- return distance;
- }
- public void setDistance(double distance) {
- this.distance = distance;
- }
- }
- public class CmpCorner implements Comparator<MyCorner> {
- @Override
- public int compare(MyCorner o1, MyCorner o2) {
- double i1 = o1.getDist();//+o1.getAngle()*2;
- double i2 = o2.getDist();//+o2.getAngle()*2;
- return (int) (i2-i1);
- }
- }
- private class MyCorner{
- private double x;
- private double y;
- private double dist;
- private double angle;
- public double getX() {
- return x;
- }
- public void setX(double x) {
- this.x = x;
- }
- public double getY() {
- return y;
- }
- public void setY(double y) {
- this.y = y;
- }
- public double getDist() {
- return dist;
- }
- public void setDist(double dist) {
- this.dist = dist;
- }
- public double getAngle() {
- return angle;
- }
- public void setAngle(double angle) {
- this.angle = angle;
- }
- }
- private class myEnemy{
- private Tank t;
- private double angle;
- private double distance;
- private int health;
- private int durab;
- private int k;
- public double getAngle() {
- return angle;
- }
- public void setAngle(double angle) {
- this.angle = angle;
- }
- public Tank getT() {
- return t;
- }
- public void setT(Tank t) {
- this.t = t;
- }
- public double getDistance() {
- return distance;
- }
- public void setDistance(double distance) {
- this.distance = distance;
- }
- public int getHealth() {
- return health;
- }
- public void setHealth(int health) {
- this.health = health;
- }
- public int getDurab() {
- return durab;
- }
- public void setDurab(int durab) {
- this.durab = durab;
- }
- public int getK() {
- return k;
- }
- public void setK(int k) {
- this.k = k;
- }
- }
- @Override
- public TankType selectTank(int tankIndex, int teamSize) {
- return TankType.MEDIUM;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement