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;
  }