Advertisement
Guest User

NS_Serg CodeHockey ver.4

a guest
Oct 20th, 2014
357
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.82 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.         if (world.getPuck().getOwnerPlayerId() == -1) {
  53.             GotoTo(world.getPuck().getX(), world.getPuck().getY(), world.getPuck().getSpeedX(), world.getPuck().getSpeedY(), self, move);
  54.             move.setAction(ActionType.TAKE_PUCK);
  55.             return;
  56.         }
  57.  
  58.         // Если шайба наша, но не у этого игрока, то бежим за ближайшим живым соперникам, и бьем по всем живым
  59.         if (world.getPuck().getOwnerPlayerId() == self.getPlayerId())
  60.             if (world.getPuck().getOwnerHockeyistId() != self.getId()) {
  61.                 Hockeyist nearestOpponent = getNearestOpponent(self.getX(), self.getY(), world);
  62.                 if (nearestOpponent != null)
  63.                     GotoTo(nearestOpponent.getX(), nearestOpponent.getY(), nearestOpponent.getSpeedX(), nearestOpponent.getSpeedY(), self, move);
  64.                 else
  65.                     GotoTo(world.getPuck().getX(), world.getPuck().getY(), 0, 0, self, move);
  66.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  67.                     if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
  68.                             || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  69.                             || hockeyist.getState() == HockeyistState.RESTING)
  70.                         continue;
  71.                     if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
  72.                 }
  73.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  74.                     if (hockeyist.isTeammate()) {
  75.                         if (hockeyist.getType() == HockeyistType.GOALIE
  76.                                 || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  77.                                 || hockeyist.getState() == HockeyistState.RESTING) continue;
  78.                         if (hockeyist.getId() == self.getId()) continue;
  79.                         if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.NONE);
  80.                     }
  81.                 }
  82.                 if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
  83.                     move.setAction(ActionType.NONE);
  84.                 return;
  85.             }
  86.         // игрок с шайбой
  87.         if (world.getPuck().getOwnerPlayerId() == self.getPlayerId()) {
  88.             if (world.getPuck().getOwnerHockeyistId() == self.getId()) {
  89.                 Player opponentPlayer = world.getOpponentPlayer();
  90.                 double netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
  91.                 double netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
  92.                 // netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();
  93.                 // найдем вратаря
  94.                 boolean isv = false;
  95.                 for (Hockeyist hockeyist : world.getHockeyists()) {
  96.                     if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
  97.                         continue;
  98.                     }
  99.                     isv = true;
  100.                     netY += (self.getY() < netY ? -0.6D : 0.6D) * game.getGoalNetHeight();
  101.                     netX += (self.getX() < netX ? -1.5D : 1.5D) * game.getGoalNetHeight();
  102.                     GotoTo(netX, netY, 0, 0, self, move);
  103.                 }
  104.                 if ((hypot(self.getY() - netY, self.getX() - netX) < 60) && (isv)) {
  105.                     netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
  106.                     netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
  107.                     netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();
  108.                     netX += (self.getX() - world.getPuck().getX());
  109.                     netY += (self.getY() - world.getPuck().getY());
  110.                     angleToNet = self.getAngleTo(netX, netY);
  111.                     move.setTurn(angleToNet < 0 ? -1.0D : 1.0D);
  112.                     if (abs(angleToNet) < 0.5D * game.getPassSector()) {
  113.                         move.setPassPower(1.0D);
  114.                         move.setPassAngle(angleToNet);
  115.                         move.setAction(ActionType.PASS);
  116.                     }
  117.                 }
  118.  
  119.                 if (isv == false) {
  120.                     netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
  121.                     netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
  122.                     GotoTo(netX, netY, 0, 0, self, move);
  123.                     netX += (self.getX() - world.getPuck().getX());
  124.                     netY += (self.getY() - world.getPuck().getY());
  125.                     angleToNet = self.getAngleTo(netX, netY);
  126.                     if (abs(angleToNet) < game.getPassSector()) {
  127.                         move.setPassPower(1.0D);
  128.                         move.setPassAngle(angleToNet);
  129.                         move.setAction(ActionType.PASS);
  130.                     }
  131.                 }
  132.             }
  133.         }
  134.  
  135.     }
  136.  
  137.     private static void GotoTo(double x1, double y1, double dx, double dy, Hockeyist self, Move move) {
  138.         double x;
  139.         double y;
  140.         x = x1 + dx * min(self.getDistanceTo(x1, y1) / 15, 30);
  141.         y = y1 + dy * min(self.getDistanceTo(x1, y1) / 15, 30);
  142.         x = x1 + dx * min(self.getDistanceTo(x, y) / 15, 30);
  143.         y = y1 + dy * min(self.getDistanceTo(x, y) / 15, 30);
  144.         double angleToNet = self.getAngleTo(x, y);
  145.         if (angleToNet > PI) angleToNet -= 2 * PI;
  146.         if (angleToNet < -PI) angleToNet += 2 * PI;
  147.         if (abs(angleToNet) < PI / 4) {
  148.             move.setSpeedUp(1.0D);
  149.         } else {
  150.             if (abs(angleToNet) > -PI / 4) { // ну я и косячник :) Пускай так и остается.
  151.                 move.setSpeedUp(-1.0D);
  152.             } else {
  153.                 move.setSpeedUp(0.0D);
  154.             }
  155.         }
  156.         move.setTurn(angleToNet);
  157.     }
  158.  
  159.     private static boolean isStick(double x, double y, Hockeyist self, Game game) {
  160.         double angleToNet = self.getAngleTo(x, y);
  161.         if (angleToNet > PI) angleToNet -= 2 * PI;
  162.         if (angleToNet < -PI) angleToNet += 2 * PI;
  163.         return ((abs(angleToNet) < 0.5D * game.getStickSector()) && (self.getDistanceTo(x, y) < game.getStickLength()));
  164.     }
  165.  
  166.     private static Hockeyist getNearestOpponent(double x, double y, World world) {
  167.         Hockeyist nearestOpponent = null;
  168.         double nearestOpponentRange = 0.0D;
  169.  
  170.         for (Hockeyist hockeyist : world.getHockeyists()) {
  171.             if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
  172.                     || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
  173.                     || hockeyist.getState() == HockeyistState.RESTING) {
  174.                 continue;
  175.             }
  176.  
  177.             double opponentRange = hypot(x - hockeyist.getX(), y - hockeyist.getY());
  178.  
  179.             if (nearestOpponent == null || opponentRange < nearestOpponentRange) {
  180.                 nearestOpponent = hockeyist;
  181.                 nearestOpponentRange = opponentRange;
  182.             }
  183.         }
  184.  
  185.         return nearestOpponent;
  186.     }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement