@Override
  public void onStep(Controller controller, Snapshot snapshot) throws ConfusedException {

    // get our robot and the ball
    Robot ourRobot = snapshot.getBalle();
    Ball ball = snapshot.getBall();

    // if neither the ball nor the robot can be found then return
    if ((ourRobot.getPosition() == null) || (ball.getPosition() == null)) {
      return;
    }

    Strategy strategy = getStrategy(snapshot);
    LOG.debug("Selected strategy: " + strategy.getClass().getName());

    // use strategy that was chosen
    setCurrentStrategy(strategy.getClass().getName());

    try {

      strategy.step(controller, snapshot);

    } catch (ConfusedException e) {

      // If a strategy does not know what to do
      LOG.error("Wut Wut?", e);
      // Default to goToBallPFN
      Intercept.step(controller, snapshot);
    }
  }
  public MovementDirection getMovementDirection(Snapshot snapshot) {
    Robot opponent = snapshot.getOpponent();
    Robot ourRobot = snapshot.getBalle();
    Goal ourGoal = snapshot.getOwnGoal();
    Ball ball = snapshot.getBall();

    if ((opponent.getPosition() == null) || (ourRobot.getPosition() == null))
      return MovementDirection.NONE;

    Coord intersectionPoint = null;
    if ((ball.getPosition() != null) && (!ball.getPosition().isEstimated()))
      intersectionPoint =
          opponent.getBallKickLine(ball).getIntersect(ourRobot.getFacingLineBothWays());

    if (intersectionPoint == null)
      intersectionPoint = opponent.getFacingLine().getIntersect(ourRobot.getFacingLineBothWays());

    if (intersectionPoint == null) return MovementDirection.NONE;

    double yCoord = intersectionPoint.getY();
    yCoord = Math.max(yCoord, ourGoal.getMinY() + Globals.ROBOT_LENGTH / 3);
    yCoord = Math.min(yCoord, ourGoal.getMaxY() - Globals.ROBOT_LENGTH / 3);

    Coord targetPoint = new Coord(ourRobot.getPosition().getX(), yCoord);
    addDrawable(new Dot(targetPoint, Color.WHITE));

    boolean isUpward;
    Orientation ourOrientation = ourRobot.getOrientation();
    if ((ourOrientation.radians() >= 0) && (ourOrientation.radians() < Math.PI)) isUpward = true;
    else isUpward = false;

    // If we are already blocking the point stop
    if (ourRobot.containsCoord(targetPoint)) return MovementDirection.NONE;

    double diff = (targetPoint.getY() - ourRobot.getPosition().getY());
    if (diff > 0)
      if (isUpward) return MovementDirection.FORWARD;
      else return MovementDirection.BACKWARD;
    else if (isUpward) return MovementDirection.BACKWARD;
    else return MovementDirection.FORWARD;
  }