using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using TrackerLibrary.Models; namespace TrackerLibrary { public static class TournamentLogic { // Order our list randomly of teams // Check if it is big enough - if not , add byes 2*2*2*2 - 2^4 // Create our first round of matchups // Create every round after that - 8 matchups - 4 matchups - 2 matchups - 1 matchup public static void CreateRounds(TournamentModel model) { List randomizedTeams = RandomizeTeamOrder(model.EnteredTeams); int rounds = FindNumberOfRounds(randomizedTeams.Count); int byes = NumberOfByes(rounds, randomizedTeams.Count); model.Rounds.Add(CreateFirstRound(byes, randomizedTeams)); CreateOtherRounds(model, rounds); //UpdateTournamentResults(model); } public static void UpdateTournamentResults(TournamentModel model) { List toScore = new List(); foreach (List round in model.Rounds) { foreach (MatchupModel rm in round) { if (rm.Winner == null && (rm.Entries.Any(x => x.Score != 0) || rm.Entries.Count == 1)) { toScore.Add(rm); } } } MarkWinnersInMatchups(toScore); AdvanceWinners(toScore, model); toScore.ForEach(x => GlobalConfig.Connection.UpdateMatchup(x)); } private static void AdvanceWinners(List models, TournamentModel tournament) { foreach (MatchupModel m in models) { foreach (List round in tournament.Rounds) { foreach (MatchupModel rm in round) { foreach (MatchupEntryModel me in rm.Entries) { if (me.ParentMatchup != null) { if (me.ParentMatchup.Id == m.Id) { me.TeamCompeting = m.Winner; GlobalConfig.Connection.UpdateMatchup(rm); } } } } } } } private static void MarkWinnersInMatchups(List models) { // greaterWins string greaterWins = ConfigurationManager.AppSettings["greaterWins"]; foreach (MatchupModel m in models) { if (m.Entries.Count == 1) { m.Winner = m.Entries[0].TeamCompeting; continue; } // "0" means false or low scare wins if (greaterWins == "0") { if (m.Entries[0].Score < m.Entries[1].Score) { m.Winner = m.Entries[0].TeamCompeting; } else if (m.Entries[1].Score < m.Entries[0].Score) { m.Winner = m.Entries[1].TeamCompeting; } else { throw new Exception("We do not allow ties in this application"); } } else { // 1 mean true, or high score wins if (m.Entries[0].Score > m.Entries[1].Score) { m.Winner = m.Entries[0].TeamCompeting; } else if (m.Entries[1].Score > m.Entries[0].Score) { m.Winner = m.Entries[1].TeamCompeting; } else { throw new Exception("We do not allow ties in this application"); } } } //if (teamOneScore > teamTwoScore) //{ // // Team one winns // m.Winner = m.Entries[0].TeamCompeting; //} //else // if (teamTwoScore > teamOneScore) //{ // // Team one winns // m.Winner = m.Entries[1].TeamCompeting; //} //else //{ // MessageBox.Show("I dont handle tie games."); //} } private static void CreateOtherRounds(TournamentModel model, int rounds) { int round = 2; List previousRound = model.Rounds[0]; List currRound = new List(); MatchupModel currMatchup = new MatchupModel(); while (round <= rounds) { foreach (MatchupModel match in previousRound) { currMatchup.Entries.Add(new MatchupEntryModel { ParentMatchup = match }); if (currMatchup.Entries.Count > 1) { currMatchup.MatchupRound = round; currRound.Add(currMatchup); currMatchup = new MatchupModel(); } } model.Rounds.Add(currRound); previousRound = currRound; currRound = new List(); round += 1; } } private static List CreateFirstRound(int byes, List teams) { List output = new List(); MatchupModel curr = new MatchupModel(); foreach (TeamModel team in teams) { curr.Entries.Add(new MatchupEntryModel { TeamCompeting = team }); if (byes > 0 || curr.Entries.Count > 1) { curr.MatchupRound = 1; output.Add(curr); curr = new MatchupModel(); if (byes > 0) { byes -= 1; } } } return output; } private static int NumberOfByes(int rounds, int numberOfTeams) { //Math.Pow(2, rounds); int output = 0; int totalTeams = 1; for (int i = 1; i <= rounds; i++) { totalTeams *= 2; } output = totalTeams - numberOfTeams; return output; } private static int FindNumberOfRounds(int teamCount) { int output = 1; int val = 2; while (val < teamCount) { output += 1; val *= 2; } return output; } private static List RandomizeTeamOrder(List teams) { // cards.OrderBy(a => Guid.NewGuid()).ToList(); return teams.OrderBy(t => Guid.NewGuid()).ToList(); } } }