/// <summary> /// Create a new set of teams /// </summary> /// <param name="teamCount">The number of teams to generate</param> public async Task CreateNewRound(int teamCount, CancellationToken cancel) { var teams = new List <Team>(); if (Settings.Algorithm2) { var algo2 = new Algorithm2() { LoggingOn = Settings.LoggingOn, LoggingPath = _storage.LoggingPath }; teams = algo2.Generate(PlayerProvider, teamCount, Rounds.ToList()); } else { var numTeamGens = Settings.NumberOfGenerations; var teamCreator = new RoundCreator(); var winnersPenalty = new TooManyWinnersPenalty(PlayerProvider); var penalties = new IPenalty[] { PlayerPairings, winnersPenalty }; teams = await teamCreator.CreateApproximatelyOptimalTeams(penalties, PlayerProvider, numTeamGens, teamCount, cancel); } var filename = _storage.GetNextHatRoundPath(); var round = new HatRound(teams, filename); round.SaveToFile(); AddRound(round); }
private void AddRound(HatRound round) { Rounds.Add(round); round.AddRoundToPairingCount(PlayerPairings); round.GameDone += (sender, args) => { // Guard against race conditions var gameDone = GameDone; if (gameDone != null) { gameDone(sender, args); } }; }
public void LoadExistingData() { Rounds.Clear(); PlayerPairings.Clear(); var files = _storage.GetHatRoundPaths(); foreach (var file in files) { try { var doc = new XmlDocument(); using (var stream = new FileStream(file, FileMode.Open)) { doc.Load(stream); } var teams = doc.SelectNodes("/HatRound/Teams/Team"); // Basic validation if (teams.Count == 0 || teams.Count % 2 != 0) { throw new Exception(); } var teamList = new List <Team>(); foreach (XmlNode team in teams) { var teamName = team.SelectSingleNode("Name").InnerText; Team t = new Team(teamName); var players = team.SelectNodes("Players/Player"); // Basic validation if (players.Count == 0) { throw new Exception(); } foreach (XmlNode player in players) { var name = player.SelectSingleNode("Name").InnerText; Player p = PlayerProvider.GetPlayer(name); // Player list may have changed throughout the day, so accept this difference if (p != null) { t.AddPlayer(p); } } GameResult gameResult = (GameResult)Enum.Parse(typeof(GameResult), team.SelectSingleNode("GameResult").InnerText); if (gameResult != GameResult.NoneYet) { t.GameDone(gameResult); } teamList.Add(t); } var round = new HatRound(teamList, file); AddRound(round); } catch (Exception) { throw new InvalidRoundException(string.Format("Round file {0} is an invalid file", file)); } } }