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