コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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);
                }
            };
        }
コード例 #3
0
        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));
                }
            }
        }