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) {
- GotoTo(world.getPuck().getX(), world.getPuck().getY(), world.getPuck().getSpeedX(), world.getPuck().getSpeedY(), self, move);
- move.setAction(ActionType.TAKE_PUCK);
- 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();
- 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);
- if (abs(angleToNet) < 0.5D * game.getPassSector()) {
- move.setPassPower(1.0D);
- move.setPassAngle(angleToNet);
- move.setAction(ActionType.PASS);
- }
- }
- 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 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