public GoalieStrategy(int strategyNumber, GoalieInputYDistance ballDistance, GoalieInputYDistance goalieDistance, GoalieOutputYDistance yOutput)
        {
            _ball_distance   = ballDistance;
            _goalie_distance = goalieDistance;
            _y_output        = yOutput;

            List <ParentRule> rules;

            switch (strategyNumber)
            {
            case 1: rules = CreateRules1();
                break;

            case 2: rules = CreateRules2();
                break;

            case 3: rules = CreateRules3();
                break;

            case 4: rules = CreateRules4();
                break;

            default: throw new ArgumentException("Startegy Number must be a number from 1 to 4 inclusive.");
            }

            _rule_base = new EvaluationTreeRuleBase(
                new List <FuzzySet <IInputFuzzyMember> >()
            {
                _ball_distance, _goalie_distance
            },
                _y_output, rules);

            _fls = new FuzzyLogicSystem(new Fuzzifier(), new CenterOfSumsDefuzzifier(), _rule_base);
        }
    void Start()
    {
        _robot_controller                    = GetComponent <RobotCarController>();
        _robot_controller.Driver             = new GoalieDriver(_robot_controller);
        _robot_controller.transform.rotation = Quaternion.Euler(0f, 90f, 0f);
        _robot_controller.IsGoalie           = true;
        Ball   = GameObject.Find("Soccer Ball");
        Goal   = (_robot_controller.Team.Team == TeamController.TEAM.RED) ? GameObject.Find("LeftRing") : GameObject.Find("RightRing");
        Config = GameObject.Find("ConfigurationHolder").GetComponent <ConfigurationHolder>();
        GoalieOutputYDistance yOutput = null;
        var category = new GoalieCategory(6);

        float goalOffset;

        switch (Config.c.NumberOfRobots)
        {
        case 3:
            _goalie_x_distance = new SmallGoalieXDistance(1);
            _goalie_y_distance = new SmallGoalieInputYDistance(2);
            _ball_x_distance   = new SmallGoalieXDistance(3);
            _ball_y_distance   = new SmallGoalieInputYDistance(4);
            yOutput            = new SmallGoalieOutputYDistance(5);
            goalOffset         = 15f;
            break;

        case 5:
            _goalie_x_distance = new MiddleGoalieXDistance(1);
            _goalie_y_distance = new MiddleGoalieInputYDistance(2);
            _ball_x_distance   = new MiddleGoalieXDistance(3);
            _ball_y_distance   = new MiddleGoalieInputYDistance(4);
            yOutput            = new MiddleGoalieOutputYDistance(5);
            goalOffset         = 20f;
            break;

        case 11:
            _goalie_x_distance = new LargeGoalieXDistance(1);
            _goalie_y_distance = new LargeGoalieInputYDistance(2);
            _ball_x_distance   = new LargeGoalieXDistance(3);
            _ball_y_distance   = new LargeGoalieInputYDistance(4);
            yOutput            = new LargeGoalieOutputYDistance(5);
            goalOffset         = 25f;
            break;

        default:
            goalOffset = 15f;
            break;
        }

        _strategizer = new GoalieStrategizer(_ball_x_distance, _goalie_x_distance, category);

        _strategy_1 = new GoalieStrategy(1, _ball_y_distance, _goalie_y_distance, yOutput);
        _strategy_2 = new GoalieStrategy(2, _ball_y_distance, _goalie_y_distance, yOutput);
        _strategy_3 = new GoalieStrategy(3, _ball_y_distance, _goalie_y_distance, yOutput);
        _strategy_4 = new GoalieStrategy(4, _ball_y_distance, _goalie_y_distance, yOutput);

        float goalX = Goal.transform.position.z;

        FixedX = goalX < 0 ? goalX + goalOffset : goalX - goalOffset;
    }