Advertisement
Guest User

NS_Serg CodeHockey ver.5 28.09.2014 3:03:44

a guest
Oct 20th, 2014
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.79 KB | None | 0 0
  1. import model.*;
  2.  
  3. import static java.lang.StrictMath.*;
  4. import static java.lang.StrictMath.abs;
  5. import static java.lang.StrictMath.hypot;
  6.  
  7. public final class MyStrategy implements Strategy {
  8.  
  9.     @Override
  10.     public void move(Hockeyist self, World world, Game game, Move move) {
  11.  
  12.         // Если вдруг в замахе, то ударим
  13.         if (self.getState() == HockeyistState.SWINGING) {
  14.             move.setAction(ActionType.STRIKE);
  15.             return;
  16.         }
  17.         double angleToNet;
  18.  
  19.         // Если шайба у соперника, то бежим за шайбой, и бьем по шайбе и владельцу (но не по своим игрокам)
  20.         if (world.getPuck().getOwnerPlayerId() != -1)
  21.             if (world.getPuck().getOwnerPlayerId() != self.getPlayerId()) {
  22.                 double dx = 0;
  23.                 double dy = 0;
  24.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  25.                     if (hockeyist.isTeammate()) continue;
  26.                     if (hockeyist.getType() == HockeyistType.GOALIE
  27.                             || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  28.                             || hockeyist.getState() == HockeyistState.RESTING) continue;
  29.                     if (hockeyist.getId() == world.getPuck().getOwnerHockeyistId()) {
  30.                         dx = hockeyist.getSpeedX();
  31.                         dy = hockeyist.getSpeedY();
  32.                     }
  33.                     if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
  34.                 }
  35.                 GotoTo(world.getPuck().getX(), world.getPuck().getY(), dx, dy, self, move);
  36.                 if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
  37.                     move.setAction(ActionType.STRIKE);
  38.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  39.                     if (hockeyist.isTeammate()) {
  40.                         if (hockeyist.getType() == HockeyistType.GOALIE
  41.                                 || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  42.                                 || hockeyist.getState() == HockeyistState.RESTING) continue;
  43.                         if (hockeyist.getId() == self.getId()) continue;
  44.                         if (isStick(hockeyist.getX(), hockeyist.getY(), self, game))
  45.                             move.setAction(ActionType.TAKE_PUCK);
  46.                     }
  47.                 }
  48.                 return;
  49.             }
  50.  
  51.         // Если шайба ничья, то подбираем шайбу
  52.  
  53.         if (world.getPuck().getOwnerPlayerId() == -1) {
  54.             Player opponentPlayer = world.getOpponentPlayer();
  55.             //if (Intersection(world.getPuck().getX(), world.getPuck().getY(),world.getPuck().getX()+world.getPuck().getSpeedX()*200, world.getPuck().getY()+world.getPuck().getSpeedY()*200,
  56.             //        opponentPlayer.getNetFront(),opponentPlayer.getNetBottom(), opponentPlayer.getNetFront(), opponentPlayer.getNetTop()))
  57.             //    if (hypot(world.getPuck().getSpeedX(),world.getPuck().getSpeedY())>10)
  58.             //System.out.println("Шайба ничья "+hypot(world.getPuck().getSpeedX(),world.getPuck().getSpeedY()));
  59.             GotoTo(world.getPuck().getX(), world.getPuck().getY(), world.getPuck().getSpeedX(), world.getPuck().getSpeedY(), self, move);
  60.             move.setAction(ActionType.TAKE_PUCK);
  61.             double XV=100000;
  62.             double YV=100000;
  63.             for (Hockeyist hockeyist : world.getHockeyists()) {
  64.                 if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
  65.                     continue;
  66.                 }
  67.                XV=hockeyist.getX();
  68.                YV=hockeyist.getY();
  69.             }
  70.             if (Intersection(world.getPuck().getX(), world.getPuck().getY(),world.getPuck().getSpeedX(), world.getPuck().getSpeedY(),
  71.                     opponentPlayer.getNetFront(),opponentPlayer.getNetBottom(), opponentPlayer.getNetFront(), opponentPlayer.getNetTop(),XV,YV))
  72.                  {
  73.                     // System.out.println("Гол!! "+hypot(world.getPuck().getSpeedX(),world.getPuck().getSpeedY()));
  74.                     Hockeyist nearestOpponent = getNearestOpponent(self.getX(), self.getY(), world);
  75.                     if (nearestOpponent != null)
  76.                         GotoTo(nearestOpponent.getX(), nearestOpponent.getY(), nearestOpponent.getSpeedX(), nearestOpponent.getSpeedY(), self, move);
  77.                     else
  78.                         GotoTo(world.getPuck().getX(), world.getPuck().getY(), 0, 0, self, move);
  79.                     for (Hockeyist hockeyist : world.getHockeyists()) {
  80.                         if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
  81.                                 || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  82.                                 || hockeyist.getState() == HockeyistState.RESTING)
  83.                             continue;
  84.                         if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
  85.                     }
  86.                     for (Hockeyist hockeyist : world.getHockeyists()) {
  87.                         if (hockeyist.isTeammate()) {
  88.                             if (hockeyist.getType() == HockeyistType.GOALIE
  89.                                     || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  90.                                     || hockeyist.getState() == HockeyistState.RESTING) continue;
  91.                             if (hockeyist.getId() == self.getId()) continue;
  92.                             if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.NONE);
  93.                         }
  94.                     }
  95.                     if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
  96.                         move.setAction(ActionType.NONE);
  97.                 }
  98.             return;
  99.         }
  100.  
  101.         // Если шайба наша, но не у этого игрока, то бежим за ближайшим живым соперникам, и бьем по всем живым
  102.         if (world.getPuck().getOwnerPlayerId() == self.getPlayerId())
  103.             if (world.getPuck().getOwnerHockeyistId() != self.getId()) {
  104.                 Hockeyist nearestOpponent = getNearestOpponent(self.getX(), self.getY(), world);
  105.                 if (nearestOpponent != null)
  106.                     GotoTo(nearestOpponent.getX(), nearestOpponent.getY(), nearestOpponent.getSpeedX(), nearestOpponent.getSpeedY(), self, move);
  107.                 else
  108.                     GotoTo(world.getPuck().getX(), world.getPuck().getY(), 0, 0, self, move);
  109.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  110.                     if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
  111.                             || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  112.                             || hockeyist.getState() == HockeyistState.RESTING)
  113.                         continue;
  114.                     if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
  115.                 }
  116.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  117.                     if (hockeyist.isTeammate()) {
  118.                         if (hockeyist.getType() == HockeyistType.GOALIE
  119.                                 || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  120.                                 || hockeyist.getState() == HockeyistState.RESTING) continue;
  121.                         if (hockeyist.getId() == self.getId()) continue;
  122.                         if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.NONE);
  123.                     }
  124.                 }
  125.                 if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
  126.                     move.setAction(ActionType.NONE);
  127.                 return;
  128.             }
  129.         // игрок с шайбой
  130.         if (world.getPuck().getOwnerPlayerId() == self.getPlayerId()) {
  131.             if (world.getPuck().getOwnerHockeyistId() == self.getId()) {
  132.                 Player opponentPlayer = world.getOpponentPlayer();
  133.                 double netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
  134.                 double netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
  135.                 // netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();
  136.                 // найдем вратаря
  137.                 boolean isv = false;
  138.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  139.                     if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
  140.                         continue;
  141.                     }
  142.                     isv = true;
  143.                     netY += (self.getY() < netY ? -0.6D : 0.6D) * game.getGoalNetHeight();
  144.                     netX += (self.getX() < netX ? -1.5D : 1.5D) * game.getGoalNetHeight();
  145.                     GotoTo(netX, netY, 0, 0, self, move);
  146.                 }
  147.                 if ((hypot(self.getY() - netY, self.getX() - netX) < 60) && (isv)) {
  148.                     netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
  149.                     netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
  150.                     netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();
  151.  
  152.                     //double angleToNet1=self.getAngleTo(netX, netY);
  153.  
  154.                     netX += (self.getX() - world.getPuck().getX());
  155.                     netY += (self.getY() - world.getPuck().getY());
  156.                     angleToNet = self.getAngleTo(netX, netY);
  157.                     move.setTurn(angleToNet<0 ? -1.0D:1.0D);
  158.                     double XV=100000;
  159.                     double YV=100000;
  160.                     for (Hockeyist hockeyist : world.getHockeyists()) {
  161.                         if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
  162.                             continue;
  163.                         }
  164.                         XV=hockeyist.getX();
  165.                         YV=hockeyist.getY();
  166.                     }
  167.                    double hspeed=(15+hypot(self.getSpeedX(),self.getSpeedY())*cos(self.getAngleTo(self.getX()+self.getSpeedX(),self.getY()+self.getSpeedY())-angleToNet))/hypot((netX-self.getX()), (netY-self.getY()));
  168.                     if (abs(angleToNet) < 0.5D * game.getPassSector())
  169.                         if (Intersection(world.getPuck().getX(), world.getPuck().getY(),(netX-self.getX())*hspeed, (netY-self.getY())*hspeed,
  170.                                 opponentPlayer.getNetFront(),opponentPlayer.getNetBottom(), opponentPlayer.getNetFront(), opponentPlayer.getNetTop(),XV,YV))
  171.                         //if (hypot(self.getSpeedX(),self.getSpeedY())*cos(self.getAngleTo(self.getX()+self.getSpeedX(),self.getY()+self.getSpeedY())-angleToNet)>=-1.0D)
  172.                     {
  173.                         move.setPassPower(1.0D);
  174.                         move.setPassAngle(angleToNet);
  175.                         move.setAction(ActionType.PASS);
  176.                        // System.out.println();
  177.                        // System.out.println(15.0D+hypot(self.getSpeedX(),self.getSpeedY())*cos(self.getAngleTo(self.getX()+self.getSpeedX(),self.getY()+self.getSpeedY())-angleToNet));
  178.                     }
  179.                 }
  180.  
  181.                 if (isv == false) {
  182.                     netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
  183.                     netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
  184.                     GotoTo(netX, netY, 0, 0, self, move);
  185.                     netX += (self.getX() - world.getPuck().getX());
  186.                     netY += (self.getY() - world.getPuck().getY());
  187.                     angleToNet = self.getAngleTo(netX, netY);
  188.                     if (abs(angleToNet) < game.getPassSector()) {
  189.                         move.setPassPower(1.0D);
  190.                         move.setPassAngle(angleToNet);
  191.                         move.setAction(ActionType.PASS);
  192.                     }
  193.                 }
  194.             }
  195.         }
  196.  
  197.     }
  198.  
  199.     private static void GotoTo(double x1, double y1, double dx, double dy, Hockeyist self, Move move) {
  200.         double x;
  201.         double y;
  202.         x = x1 + dx * min(self.getDistanceTo(x1, y1) / 15, 30);
  203.         y = y1 + dy * min(self.getDistanceTo(x1, y1) / 15, 30);
  204.         x = x1 + dx * min(self.getDistanceTo(x, y) / 15, 30);
  205.         y = y1 + dy * min(self.getDistanceTo(x, y) / 15, 30);
  206.         double angleToNet = self.getAngleTo(x, y);
  207.         if (angleToNet > PI) angleToNet -= 2 * PI;
  208.         if (angleToNet < -PI) angleToNet += 2 * PI;
  209.         if (abs(angleToNet) < PI / 4) {
  210.             move.setSpeedUp(1.0D);
  211.         } else {
  212.             if (abs(angleToNet) > -PI / 4) { // ну я и косячник :) Пускай так и остается.
  213.                 move.setSpeedUp(-1.0D);
  214.             } else {
  215.                 move.setSpeedUp(0.0D);
  216.             }
  217.         }
  218.         move.setTurn(angleToNet);
  219.     }
  220.  
  221.     private static boolean Intersection(double X1,double Y1,double XS1,double YS1, double X3,double Y3,double X4,double Y4, double XV, double YV) {
  222.         double X2=X1+XS1*200;
  223.         double Y2=Y1+YS1*200;
  224.         boolean res=false;
  225.         if ((((X3 - X1) * (Y2 - Y1) - (Y3 - Y1) * (X2 - X1)) *
  226.                 ((X4 - X1) * (Y2 - Y1) - (Y4 - Y1) * (X2 - X1)) <= 0)
  227.         &&
  228.                 (((X1 - X3) * (Y4 - Y3) - (Y1 - Y3) * (X4 - X3)) *
  229.                         ((X2 - X3) * (Y4 - Y3) - (Y2 - Y3) * (X4 - X3)) <= 0)) {
  230.               res=true;
  231.               for (int i=1;i<1000;i++)  {
  232.                   if (Y1>YV) YV+=min(Y1-YV,6);
  233.                   if (Y1<YV) YV-=min(YV-Y1,6);
  234.                   X1+=XS1;
  235.                   Y1+=YS1;
  236.                   if ((((X3 - X1) * (Y2 - Y1) - (Y3 - Y1) * (X2 - X1)) *
  237.                           ((X4 - X1) * (Y2 - Y1) - (Y4 - Y1) * (X2 - X1)) <= 0)
  238.                           &&
  239.                           (((X1 - X3) * (Y4 - Y3) - (Y1 - Y3) * (X4 - X3)) *
  240.                                   ((X2 - X3) * (Y4 - Y3) - (Y2 - Y3) * (X4 - X3)) <= 0)) {
  241.                       if (hypot(X1-XV,Y1-YV)<50) {
  242.                           res=false;
  243.                           break;
  244.                       }
  245.                   } else {
  246.                       res=true; break;
  247.                   }
  248.               }
  249.         }
  250.         return res;
  251.     }
  252.  
  253.     private static boolean isStick(double x, double y, Hockeyist self, Game game) {
  254.         double angleToNet = self.getAngleTo(x, y);
  255.         if (angleToNet > PI) angleToNet -= 2 * PI;
  256.         if (angleToNet < -PI) angleToNet += 2 * PI;
  257.         return ((abs(angleToNet) < 0.5D * game.getStickSector()) && (self.getDistanceTo(x, y) < game.getStickLength()));
  258.     }
  259.  
  260.     private static Hockeyist getNearestOpponent(double x, double y, World world) {
  261.         Hockeyist nearestOpponent = null;
  262.         double nearestOpponentRange = 0.0D;
  263.  
  264.         for (Hockeyist hockeyist : world.getHockeyists()) {
  265.             if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
  266.                     || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  267.                     || hockeyist.getState() == HockeyistState.RESTING) {
  268.                 continue;
  269.             }
  270.  
  271.             double opponentRange = hypot(x - hockeyist.getX(), y - hockeyist.getY());
  272.  
  273.             if (nearestOpponent == null || opponentRange < nearestOpponentRange) {
  274.                 nearestOpponent = hockeyist;
  275.                 nearestOpponentRange = opponentRange;
  276.             }
  277.         }
  278.  
  279.         return nearestOpponent;
  280.     }
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement