/// <summary>
        /// 
        /// </summary>
        /// <param name="teamChooser"></param>
        /// <param name="seedChooser"></param>
        public SimpleAllTeamsChooser( ITeamChooser teamChooser, ISeedChooser seedChooser )
        {
            if ( teamChooser != null )
                TeamChooser = teamChooser;
            else
                throw new NullReferenceException();

            if ( seedChooser != null )
                SeedChooser = seedChooser;
            else
                SeedChooser = new SimpleSeedChooser();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="players"></param>
        /// <param name="teamChooser"></param>
        /// <param name="seedChooser"></param>
        /// <param name="playersPerTeam"></param>
        /// <returns></returns>
        private List<Tuple<Team, Team>> chooseAllTeams( List<Player> players, ITeamChooser teamChooser, ISeedChooser seedChooser, int playersPerTeam )
        {
            List<Tuple<Team, Team>> games = new List<Tuple<Team, Team>>();
            List<Player> t = new List<Player>( players );
            List<Player> played = new List<Player>();
            int count = 0;

            seedChooser.Initialize();

            while ( t.Count >= 2 * playersPerTeam )
            {
                Player seed = seedChooser.ChooseSeed( t );

                if ( seed != null )
                {
                    Tuple<Team, Team> game = teamChooser.ChooseTeams( t, seed, playersPerTeam );
                    count++;

                    if ( game == null || isEmptyGame( game ) )
                    {
                        seedChooser.IgnorePlayer( seed );

                        continue;
                    }

                    games.Add( game );

                    foreach ( Player p in game.Item1.Players )
                    {
                        if ( played.Contains( p ) )
                            Console.WriteLine( "Bad!" );

                        t.Remove( p );
                        played.Add( p );
                    }

                    foreach ( Player p in game.Item2.Players )
                    {
                        if ( played.Contains( p ) )
                            Console.WriteLine( "Bad!" );

                        t.Remove( p );
                        played.Add( p );
                    }
                }
            }

            return games;
        }
        /// <summary>
        /// Run multiple rounds of simultaneous games so that each player is only in one game at a time.
        /// </summary>
        /// <param name="numGames">The number of games to run simultaneously</param>
        /// <param name="numRounds">The number of rounds of simultaneous games</param>
        public void RunOnly( int numGames, int numRounds, ISeedChooser seedChooser )
        {
            for ( int i = 0; i < numRounds; i++ )
            {
                //Play a round of matches

                //Randomize players
                List<Player> t = _players.RandomOrdering().ToList();
                //List of games
                List<Tuple<Team, Team>> games = new List<Tuple<Team, Team>>();
                //Get players that are online for this round
                List<Player> players = getSubset( t, NUM_PLAYERS_ONLINE_AT_ONCE );

                int count = 0;

                //Initialize seed chooser
                seedChooser.Initialize();

                //Create games
                while ( count < numGames )
                {
                    //Get a seed
                    Player seed = seedChooser.ChooseSeed( players );

                    if ( seed != null )
                    {
                        //Make a game
                        Tuple<Team, Team> game = TeamChooser.ChooseTeams( players, seed, PLAYERS_PER_TEAM );

                        //Check if the game is valid
                        if ( game != null && !isEmptyGame( game ) )
                        {
                            //Add to list of games to play
                            games.Add( game );

                            //Remove players so that they aren't in any games in this round
                            foreach ( Player p in game.Item1.Players )
                                players.Remove( p );

                            foreach ( Player p in game.Item2.Players )
                                players.Remove( p );
                        }
                        else
                        {
                            //Ignore a seed that couldn't make a valid game
                            seedChooser.IgnorePlayer( seed );
                        }
                    }

                    count++;
                }

                //Play out the games for this round
                playGames( games );
            }

            outputGameInfo( numGames * numRounds );
        }