Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import model.*;
- import static java.lang.StrictMath.*;
- import static java.lang.StrictMath.abs;
- import static java.lang.StrictMath.hypot;
- public final class MyStrategy implements Strategy {
- @Override
- public void move(Hockeyist self, World world, Game game, Move move) {
- // Если вдруг в замахе, то ударим
- if (self.getState() == HockeyistState.SWINGING) {
- move.setAction(ActionType.STRIKE);
- return;
- }
- double angleToNet;
- // Если шайба у соперника, то бежим за шайбой, и бьем по шайбе и владельцу (но не по своим игрокам)
- if (world.getPuck().getOwnerPlayerId() != -1)
- if (world.getPuck().getOwnerPlayerId() != self.getPlayerId()) {
- double dx = 0;
- double dy = 0;
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate()) continue;
- if (hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING) continue;
- if (hockeyist.getId() == world.getPuck().getOwnerHockeyistId()) {
- dx = hockeyist.getSpeedX();
- dy = hockeyist.getSpeedY();
- }
- if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
- }
- GotoTo(world.getPuck().getX(), world.getPuck().getY(), dx, dy, self, move);
- if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
- move.setAction(ActionType.STRIKE);
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate()) {
- if (hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING) continue;
- if (hockeyist.getId() == self.getId()) continue;
- if (isStick(hockeyist.getX(), hockeyist.getY(), self, game))
- move.setAction(ActionType.TAKE_PUCK);
- }
- }
- return;
- }
- // Если шайба ничья, то подбираем шайбу
- if (world.getPuck().getOwnerPlayerId() == -1) {
- Player opponentPlayer = world.getOpponentPlayer();
- //if (Intersection(world.getPuck().getX(), world.getPuck().getY(),world.getPuck().getX()+world.getPuck().getSpeedX()*200, world.getPuck().getY()+world.getPuck().getSpeedY()*200,
- // opponentPlayer.getNetFront(),opponentPlayer.getNetBottom(), opponentPlayer.getNetFront(), opponentPlayer.getNetTop()))
- // if (hypot(world.getPuck().getSpeedX(),world.getPuck().getSpeedY())>10)
- //System.out.println("Шайба ничья "+hypot(world.getPuck().getSpeedX(),world.getPuck().getSpeedY()));
- GotoTo(world.getPuck().getX(), world.getPuck().getY(), world.getPuck().getSpeedX(), world.getPuck().getSpeedY(), self, move);
- move.setAction(ActionType.TAKE_PUCK);
- double XV=100000;
- double YV=100000;
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
- continue;
- }
- XV=hockeyist.getX();
- YV=hockeyist.getY();
- }
- if (Intersection(world.getPuck().getX(), world.getPuck().getY(),world.getPuck().getSpeedX(), world.getPuck().getSpeedY(),
- opponentPlayer.getNetFront(),opponentPlayer.getNetBottom(), opponentPlayer.getNetFront(), opponentPlayer.getNetTop(),XV,YV))
- {
- // System.out.println("Гол!! "+hypot(world.getPuck().getSpeedX(),world.getPuck().getSpeedY()));
- Hockeyist nearestOpponent = getNearestOpponent(self.getX(), self.getY(), world);
- if (nearestOpponent != null)
- GotoTo(nearestOpponent.getX(), nearestOpponent.getY(), nearestOpponent.getSpeedX(), nearestOpponent.getSpeedY(), self, move);
- else
- GotoTo(world.getPuck().getX(), world.getPuck().getY(), 0, 0, self, move);
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING)
- continue;
- if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
- }
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate()) {
- if (hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING) continue;
- if (hockeyist.getId() == self.getId()) continue;
- if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.NONE);
- }
- }
- if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
- move.setAction(ActionType.NONE);
- }
- return;
- }
- // Если шайба наша, но не у этого игрока, то бежим за ближайшим живым соперникам, и бьем по всем живым
- if (world.getPuck().getOwnerPlayerId() == self.getPlayerId())
- if (world.getPuck().getOwnerHockeyistId() != self.getId()) {
- Hockeyist nearestOpponent = getNearestOpponent(self.getX(), self.getY(), world);
- if (nearestOpponent != null)
- GotoTo(nearestOpponent.getX(), nearestOpponent.getY(), nearestOpponent.getSpeedX(), nearestOpponent.getSpeedY(), self, move);
- else
- GotoTo(world.getPuck().getX(), world.getPuck().getY(), 0, 0, self, move);
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING)
- continue;
- if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.STRIKE);
- }
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate()) {
- if (hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING) continue;
- if (hockeyist.getId() == self.getId()) continue;
- if (isStick(hockeyist.getX(), hockeyist.getY(), self, game)) move.setAction(ActionType.NONE);
- }
- }
- if (isStick(world.getPuck().getX(), world.getPuck().getY(), self, game))
- move.setAction(ActionType.NONE);
- return;
- }
- // игрок с шайбой
- if (world.getPuck().getOwnerPlayerId() == self.getPlayerId()) {
- if (world.getPuck().getOwnerHockeyistId() == self.getId()) {
- Player opponentPlayer = world.getOpponentPlayer();
- double netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
- double netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
- // netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();
- // найдем вратаря
- boolean isv = false;
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
- continue;
- }
- isv = true;
- netY += (self.getY() < netY ? -0.6D : 0.6D) * game.getGoalNetHeight();
- netX += (self.getX() < netX ? -1.5D : 1.5D) * game.getGoalNetHeight();
- GotoTo(netX, netY, 0, 0, self, move);
- }
- if ((hypot(self.getY() - netY, self.getX() - netX) < 60) && (isv)) {
- netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
- netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
- netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();
- //double angleToNet1=self.getAngleTo(netX, netY);
- netX += (self.getX() - world.getPuck().getX());
- netY += (self.getY() - world.getPuck().getY());
- angleToNet = self.getAngleTo(netX, netY);
- move.setTurn(angleToNet<0 ? -1.0D:1.0D);
- double XV=100000;
- double YV=100000;
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate() || hockeyist.getType() != HockeyistType.GOALIE || hockeyist.getState() != HockeyistState.ACTIVE) {
- continue;
- }
- XV=hockeyist.getX();
- YV=hockeyist.getY();
- }
- 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()));
- if (abs(angleToNet) < 0.5D * game.getPassSector())
- if (Intersection(world.getPuck().getX(), world.getPuck().getY(),(netX-self.getX())*hspeed, (netY-self.getY())*hspeed,
- opponentPlayer.getNetFront(),opponentPlayer.getNetBottom(), opponentPlayer.getNetFront(), opponentPlayer.getNetTop(),XV,YV))
- //if (hypot(self.getSpeedX(),self.getSpeedY())*cos(self.getAngleTo(self.getX()+self.getSpeedX(),self.getY()+self.getSpeedY())-angleToNet)>=-1.0D)
- {
- move.setPassPower(1.0D);
- move.setPassAngle(angleToNet);
- move.setAction(ActionType.PASS);
- // System.out.println();
- // System.out.println(15.0D+hypot(self.getSpeedX(),self.getSpeedY())*cos(self.getAngleTo(self.getX()+self.getSpeedX(),self.getY()+self.getSpeedY())-angleToNet));
- }
- }
- if (isv == false) {
- netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
- netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
- GotoTo(netX, netY, 0, 0, self, move);
- netX += (self.getX() - world.getPuck().getX());
- netY += (self.getY() - world.getPuck().getY());
- angleToNet = self.getAngleTo(netX, netY);
- if (abs(angleToNet) < game.getPassSector()) {
- move.setPassPower(1.0D);
- move.setPassAngle(angleToNet);
- move.setAction(ActionType.PASS);
- }
- }
- }
- }
- }
- private static void GotoTo(double x1, double y1, double dx, double dy, Hockeyist self, Move move) {
- double x;
- double y;
- x = x1 + dx * min(self.getDistanceTo(x1, y1) / 15, 30);
- y = y1 + dy * min(self.getDistanceTo(x1, y1) / 15, 30);
- x = x1 + dx * min(self.getDistanceTo(x, y) / 15, 30);
- y = y1 + dy * min(self.getDistanceTo(x, y) / 15, 30);
- double angleToNet = self.getAngleTo(x, y);
- if (angleToNet > PI) angleToNet -= 2 * PI;
- if (angleToNet < -PI) angleToNet += 2 * PI;
- if (abs(angleToNet) < PI / 4) {
- move.setSpeedUp(1.0D);
- } else {
- if (abs(angleToNet) > -PI / 4) { // ну я и косячник :) Пускай так и остается.
- move.setSpeedUp(-1.0D);
- } else {
- move.setSpeedUp(0.0D);
- }
- }
- move.setTurn(angleToNet);
- }
- private static boolean Intersection(double X1,double Y1,double XS1,double YS1, double X3,double Y3,double X4,double Y4, double XV, double YV) {
- double X2=X1+XS1*200;
- double Y2=Y1+YS1*200;
- boolean res=false;
- if ((((X3 - X1) * (Y2 - Y1) - (Y3 - Y1) * (X2 - X1)) *
- ((X4 - X1) * (Y2 - Y1) - (Y4 - Y1) * (X2 - X1)) <= 0)
- &&
- (((X1 - X3) * (Y4 - Y3) - (Y1 - Y3) * (X4 - X3)) *
- ((X2 - X3) * (Y4 - Y3) - (Y2 - Y3) * (X4 - X3)) <= 0)) {
- res=true;
- for (int i=1;i<1000;i++) {
- if (Y1>YV) YV+=min(Y1-YV,6);
- if (Y1<YV) YV-=min(YV-Y1,6);
- X1+=XS1;
- Y1+=YS1;
- if ((((X3 - X1) * (Y2 - Y1) - (Y3 - Y1) * (X2 - X1)) *
- ((X4 - X1) * (Y2 - Y1) - (Y4 - Y1) * (X2 - X1)) <= 0)
- &&
- (((X1 - X3) * (Y4 - Y3) - (Y1 - Y3) * (X4 - X3)) *
- ((X2 - X3) * (Y4 - Y3) - (Y2 - Y3) * (X4 - X3)) <= 0)) {
- if (hypot(X1-XV,Y1-YV)<50) {
- res=false;
- break;
- }
- } else {
- res=true; break;
- }
- }
- }
- return res;
- }
- private static boolean isStick(double x, double y, Hockeyist self, Game game) {
- double angleToNet = self.getAngleTo(x, y);
- if (angleToNet > PI) angleToNet -= 2 * PI;
- if (angleToNet < -PI) angleToNet += 2 * PI;
- return ((abs(angleToNet) < 0.5D * game.getStickSector()) && (self.getDistanceTo(x, y) < game.getStickLength()));
- }
- private static Hockeyist getNearestOpponent(double x, double y, World world) {
- Hockeyist nearestOpponent = null;
- double nearestOpponentRange = 0.0D;
- for (Hockeyist hockeyist : world.getHockeyists()) {
- if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
- || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
- || hockeyist.getState() == HockeyistState.RESTING) {
- continue;
- }
- double opponentRange = hypot(x - hockeyist.getX(), y - hockeyist.getY());
- if (nearestOpponent == null || opponentRange < nearestOpponentRange) {
- nearestOpponent = hockeyist;
- nearestOpponentRange = opponentRange;
- }
- }
- return nearestOpponent;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement