public Move makeMove(double deltaTime) { Point2D tankPosition = getPlayerTank().getCenterPoint(); switch (currentAction) { case Searching: if (target == null) { searchForTarget(); } if (target != null) { currentAction = Action.ReachingTarget; } break; case ReachingTarget: if ((euclideanSpaceDistance(target, getPlayerTank().getCenterPoint()) < bonusRadius)) { target = null; isAngleSet = false; } if (target == null) { currentAction = Action.Searching; isSearchingStarted = false; } break; } switch (currentAction) { case Idle: break; case Searching: if (!isSearchingStarted) { rotationToDo = getBestRotationDirection(); isSearchingStarted = true; } movementToDo = Move.Movement.Staying; break; case ReachingTarget: double bonusAngle = (Math.toDegrees( Math.atan2( target.getY() - tankPosition.getY(), target.getX() - tankPosition.getX())) + 360) % 360; double tankRotationAngle = (getPlayerTank().getRotationAngle() + 270) % 360; double bonusVisionAngle = (Math.toDegrees(Math.atan2(bonusRadius, euclideanSpaceDistance(tankPosition, target))) + 360) % 360; double deltaAngle = (bonusAngle - tankRotationAngle + 360) % 360; double shift = euclideanSpaceDistance(tankPosition, lastPosition); double maxShift = 2 * getPlayerTank().getVelocity() * (1.0 / GameState.getFramesPerSecond()); if (shift > maxShift) { isAngleSet = false; } if (!isAngleSet) { if (deltaAngle < 180 + bonusVisionAngle && deltaAngle > 180 - bonusVisionAngle) { isAngleSet = true; } else if (deltaAngle >= 0 && deltaAngle <= 180 - bonusVisionAngle) { rotationToDo = Move.Rotation.CounterClockwise; } else if (deltaAngle >= 180 + bonusVisionAngle && deltaAngle < 360) { rotationToDo = Move.Rotation.Clockwise; } movementToDo = Move.Movement.Staying; } else { double tankRadius = getPlayerTank().getRadius(); if (tankPosition.getY() - tankRadius <= tankRadius / 8) { if (tankRotationAngle >= 0 && tankRotationAngle < 90) { rotationToDo = Move.Rotation.CounterClockwise; } else if (tankRotationAngle > 90 && tankRotationAngle <= 180) { rotationToDo = Move.Rotation.Clockwise; } } else if (tankPosition.getX() + tankRadius >= GameState.getFieldWidth() - tankRadius / 8) { if (tankRotationAngle >= 90 && tankRotationAngle < 180) { rotationToDo = Move.Rotation.CounterClockwise; } else if (tankRotationAngle > 180 && tankRotationAngle <= 270) { rotationToDo = Move.Rotation.Clockwise; } } else if (tankPosition.getY() + tankRadius >= GameState.fieldHeight - tankRadius / 8) { if (tankRotationAngle >= 180 && tankRotationAngle < 270) { rotationToDo = Move.Rotation.CounterClockwise; } else if (tankRotationAngle > 270 && tankRotationAngle <= 360) { rotationToDo = Move.Rotation.Clockwise; } } else if (tankPosition.getX() - tankRadius <= tankRadius / 8) { if (tankRotationAngle >= 270 && tankRotationAngle < 360) { rotationToDo = Move.Rotation.CounterClockwise; } else if (tankRotationAngle > 0 && tankRotationAngle <= 90) { rotationToDo = Move.Rotation.Clockwise; } } else { rotationToDo = Move.Rotation.Staying; } if (rotationToDo != Move.Rotation.Staying) { isAngleSet = false; } movementToDo = Move.Movement.Backward; } lastPosition = getPlayerTank().getCenterPoint(); break; } return new Move(movementToDo, rotationToDo, shootingToDo); }