public void CountByRuleType(SeasonScheduleRule rule)
        {
            switch (rule.RuleType)
            {
            case SeasonScheduleRuleType.Divisional:
                if (rule.HomeGroup == null || rule.AwayGroup == null)
                {
                    throw new SeasonScheduleException("One or both Groups are null but Divisonal Rule Type selected");
                }

                AddGames(rule.HomeGroup.GetTeamsInDivision(), rule.AwayGroup.GetTeamsInDivision(), true, rule.HomeAndAway);

                break;

            case SeasonScheduleRuleType.PreviousDivisionRank:
                if (rule.HomeGroup == null || rule.AwayGroup == null)
                {
                    throw new SeasonScheduleException("One or both Groups are null but Previous Division Rank Rule Type selected");
                }


                break;

            case SeasonScheduleRuleType.Team:
                break;

            default:
                throw new SeasonScheduleException("Base rule type: " + rule.RuleType);
            }
        }
Example #2
0
        public static Schedule CreateGamesByRule(SeasonScheduleRule rule, Season season)
        {
            var schedule = season.Schedule;

            switch (rule.RuleType)
            {
            case SeasonScheduleRuleType.Divisional:
                var homeTeams = season.Divisions.Where(d => d.Name.Equals(rule.HomeGroup.Name)).First().Teams.ToList <ITeam>();
                var awayTeams = rule.AwayGroup == null ? null : season.Divisions.Where(d => d.Name.Equals(rule.AwayGroup.Name)).FirstOrDefault().Teams.ToList <ITeam>();

                var divisionalSchedule = CreateGames(season.Year, -1, 1, homeTeams, awayTeams, rule.Iterations, rule.HomeAndAway, season.GameCreator);

                MergeSchedules(schedule, divisionalSchedule);

                break;

            case SeasonScheduleRuleType.DivisionLevel:
                var level = rule.DivisionLevel;

                var divisionsAtLevel = season.Divisions.Where(d => d.Level == level).ToList();

                divisionsAtLevel.ForEach(division =>
                {
                    var schedulingTeams = division.Teams.ToList <ITeam>();

                    var divisionLevelSchedule = CreateGames(season.Year, -1, 1, schedulingTeams, rule.Iterations, rule.HomeAndAway, season.GameCreator);

                    MergeSchedules(schedule, divisionLevelSchedule);
                });
                break;

            case SeasonScheduleRuleType.Team:
                var homeTeam = season.Teams.ToList().Where(t => t.Parent.Id == rule.ParentHomeTeam.Id).First();
                var awayTeam = season.Teams.ToList().Where(t => t.Parent.Id == rule.ParentAwayTeam.Id).First();

                var teamVsTeamSchedule = CreateGames(season.Year, -1, 1, new List <ITeam>()
                {
                    homeTeam
                }, new List <ITeam>()
                {
                    awayTeam
                }, rule.Iterations, rule.HomeAndAway, season.GameCreator);

                MergeSchedules(schedule, teamVsTeamSchedule);

                break;

            default:
                throw new SeasonScheduleException("Rule has not been implemented yet: " + rule.RuleType);
            }

            return(schedule);
        }
        public void CountByRule(SeasonScheduleRule rule)
        {
            if (rule.ParentHomeTeam != null)
            {
                //Home vs Away
                if (rule.ParentAwayTeam != null)
                {
                    AddGame(rule.ParentHomeTeam, rule.ParentAwayTeam, rule.HomeAndAway);
                }
                //Home vs AwayGroup
                else if (rule.AwayGroup != null)
                {
                    AddGames(rule.ParentHomeTeam, rule.AwayGroup.GetTeamsInDivision(), true, rule.HomeAndAway);
                }
                else
                {
                    //validation error
                    throw new SchedulingException("Rule : " + rule.RuleName + " has a Parent Home Team but no  Away opponent");
                }
            }
            else if (rule.ParentAwayTeam != null)
            {
                if (rule.HomeGroup == null)
                {
                    throw new SchedulingException("Rule : " + rule.RuleName + " has a Parent Away Team but no Home opponent");
                }
                //Away vs HomeGroup
                else
                {
                    AddGames(rule.ParentAwayTeam, rule.HomeGroup.GetTeamsInDivision(), false, rule.HomeAndAway);
                }
            }
            else
            {
                if (rule.HomeGroup == null)
                {
                    throw new SchedulingException("Rule : " + rule.RuleName + " has no teams and no home group. ");
                }
                //HomeGroup vs AwayGroup or HomeGroup vs HomeGroup
                else
                {
                    var homeTeams = rule.HomeGroup.GetTeamsInDivision().ToList();

                    if (rule.AwayGroup != null)
                    {
                        var awayTeams = rule.AwayGroup.GetTeamsInDivision().ToList();

                        homeTeams.ForEach(t =>
                        {
                            AddGames(t, awayTeams, true, rule.HomeAndAway);
                        });
                    }
                    else
                    {
                        for (int i = 0; i < homeTeams.Count - 1; i++)
                        {
                            for (int j = i + 1; j < homeTeams.Count; j++)
                            {
                                var homeTeam = homeTeams[i];
                                var awayTeam = homeTeams[j];

                                AddGame(homeTeam, awayTeam, rule.HomeAndAway);
                            }
                        }
                    }
                }
            }
        }
Example #4
0
        public static SeasonRule SetupSeasonRule(int numberOfTeams)
        {
            var rule = new SeasonRule();

            /*
             * var leagueRule= new SeasonDivisionRule(DivisionLevel.League, "NHL", null);
             * var easternRule = new SeasonDivisionRule(DivisionLevel.Conference, "Eastern", leagueRule);
             * var westernRule = new SeasonDivisionRule(DivisionLevel.Conference, "Western", leagueRule);
             * var canadaRule = new SeasonDivisionRule(DivisionLevel.Country, "Canada", null);
             * var bcRule = new SeasonDivisionRule(DivisionLevel.Province, "BC", canadaRule);
             * var albertaRule = new SeasonDivisionRule(DivisionLevel.Province, "Alberta", canadaRule);
             * var ontarioRule = new SeasonDivisionRule(DivisionLevel.Province, "Ontario", canadaRule);
             * var quebecRule = new SeasonDivisionRule(DivisionLevel.Province, "Quebec", canadaRule);
             * var manitobaRule = new SeasonDivision
             *
             * leagueRule.AddChildRule(easternRule);
             * leagueRule.AddChildRule(westernRule);
             * canadaRule.AddChildRule(bcRule);
             * canadaRule.AddChildRule(albertaRule);
             * canadaRule.AddChildRule(ontarioRule);
             * canadaRule.AddChildRule(quebecRule);
             */
            var leagueName     = "NHL";
            var easternName    = "Eastern";
            var westernName    = "Western";
            var canadaName     = "Canada";
            var bcName         = "BC";
            var albertaName    = "Alberta";
            var ontarioName    = "Ontario";
            var quebecName     = "Quebec";
            var manitobaName   = "Manitoba";
            var usaName        = "USA";
            var michiganName   = "Michigan";
            var notOntarioName = "Not Ontario";

            var divisionRules = new List <SeasonDivisionRule>();

            AddDivisionRule(null, divisionRules, DivisionLevel.League, leagueName);
            AddDivisionRule(leagueName, divisionRules, DivisionLevel.Conference, easternName, westernName);
            AddDivisionRule(null, divisionRules, DivisionLevel.Country, canadaName, usaName);
            AddDivisionRule(canadaName, divisionRules, DivisionLevel.Province, bcName, albertaName, ontarioName, quebecName, manitobaName);
            AddDivisionRule(usaName, divisionRules, DivisionLevel.Province, michiganName);
            AddDivisionRule(null, divisionRules, DivisionLevel.SubDivision, notOntarioName);

            long id = 0;

            var toronto    = CreateTeam(id++, "Toronto", 5);
            var montreal   = CreateTeam(id++, "Montreal", 5);
            var ottawa     = CreateTeam(id++, "Ottawa", 5);
            var detroit    = CreateTeam(id++, "Detroit", 5);
            var quebecCity = CreateTeam(id++, "Quebec City", 5);
            var hamilton   = CreateTeam(id++, "Hamilton", 5);

            var vancouver = CreateTeam(id++, "Vancouver", 5);
            var calgary   = CreateTeam(id++, "Calgary", 5);
            var edmonton  = CreateTeam(id++, "Edmonton", 5);
            var winnipeg  = CreateTeam(id++, "Winnipeg", 5);

            var teamRules = new List <SeasonTeamRule>();


            AddTeamsForRule(easternName, divisionRules, teamRules, toronto, montreal, ottawa, detroit, quebecCity, hamilton);
            AddTeamsForRule(westernName, divisionRules, teamRules, vancouver, calgary, edmonton, winnipeg);
            AddTeamsForRule(bcName, divisionRules, teamRules, vancouver);
            AddTeamsForRule(albertaName, divisionRules, teamRules, calgary, edmonton);
            AddTeamsForRule(ontarioName, divisionRules, teamRules, ottawa, toronto, hamilton);
            AddTeamsForRule(quebecName, divisionRules, teamRules, montreal, quebecCity);
            AddTeamsForRule(manitobaName, divisionRules, teamRules, winnipeg);
            AddTeamsForRule(michiganName, divisionRules, teamRules, detroit);
            AddTeamsForRule(notOntarioName, divisionRules, teamRules, detroit, quebecCity, montreal);


            var leagueScheduleRule     = SeasonScheduleRule.CreateDivisionalRule("NHL Rule", divisionRules.Where(d => d.Name.Equals(leagueName)).First(), 2, true);
            var westernScheduleRule    = SeasonScheduleRule.CreateDivisionalRule("Western Rule", divisionRules.Where(d => d.Name.Equals(westernName)).First(), 3, true);
            var ontarioScheduleRule    = SeasonScheduleRule.CreateDivisionalRule("Ontario Rule", divisionRules.Where(d => d.Name.Equals(ontarioName)).First(), 2, true);
            var notOntarioScheduleRule = SeasonScheduleRule.CreateDivisionalRule("Not Ontario Rule", divisionRules.Where(d => d.Name.Equals(notOntarioName)).First(), 2, true);
            var easternScheduleRule    = SeasonScheduleRule.CreateDivisionalRule("Eastern Rule", divisionRules.Where(d => d.Name.Equals(easternName)).First(), 1, true);
            //var teamRule = SeasonScheduleRule.CreateTeamVsTeamRule("Team Rule", teamRules.Select(t => t.Parent).Where(t => t.Name.Equals("Montreal")).First(), teamRules.Select(t => t.Parent).Where(t => t.Name.Equals("Winnipeg")).First(), 55, true);
            var scheduleRules = new List <SeasonScheduleRule>()
            {
                leagueScheduleRule,
                westernScheduleRule,
                ontarioScheduleRule,
                notOntarioScheduleRule,
                easternScheduleRule
            };

            rule.DivisionRules = divisionRules;
            rule.TeamRules     = teamRules;
            rule.ScheduleRules = scheduleRules;

            return(rule);
        }