示例#1
0
        private Game AddNextGameIfNotExists(RoundNumber roundNumber, GameNumber nextGameNumber)
        {
            var nextGame = this.Games
                           .Where(o => o.GameNumber == nextGameNumber)
                           .FirstOrDefault();

            if (nextGame == null)
            {
                nextGame = new Game(nextGameNumber, roundNumber, this.DrawSettings);

                var opponent = new Opponent(drawNumber: new DrawNumber(1), seedLevel: null, assignOrder: null);
                opponent.UpdateBlockNumber(this.BlockNumber);
                opponent.UpdateGameNumber(nextGameNumber);
                nextGame.AssignOpponent(opponent);

                opponent = new Opponent(drawNumber: new DrawNumber(2), seedLevel: null, assignOrder: null);
                opponent.UpdateBlockNumber(this.BlockNumber);
                opponent.UpdateGameNumber(nextGameNumber);
                nextGame.AssignOpponent(opponent);

                this.Games.Add(nextGame);
            }

            return(nextGame);
        }
示例#2
0
 /// <summary>
 /// 試合の新しいインスタンスを生成します。
 /// </summary>
 /// <param name="gameNumber">試合番号。</param>
 /// <param name="roundNumber">ラウンド番号。</param>
 /// <param name="drawSettings">ドロー設定。</param>
 public Game(GameNumber gameNumber, RoundNumber roundNumber, DrawSettings drawSettings)
 {
     this.GameNumber   = gameNumber;
     this.RoundNumber  = roundNumber;
     this.DrawSettings = drawSettings;
     this.Opponents    = new Opponents();
     this.GameResult   = new GameResult();
 }
示例#3
0
        /// <summary>
        /// 試合一覧を更新します。
        /// </summary>
        public void Update()
        {
            var gameNumbersMap  = new Dictionary <GameNumber, GameNumber>();
            var firstGameNumber = 0;
            var numberOfGames   = 0;

            foreach (var roundNumber in Enumerable.Range(1, this.DrawSettings.NumberOfRoundsPerBlock))
            {
                var numberOfGamesPerRound = this.CalculateNumberOfGamesPerRound(roundNumber);
                firstGameNumber = numberOfGames + 1;
                numberOfGames  += numberOfGamesPerRound;

                var gameNumberPerRound = 0;
                foreach (var gameNumber in Enumerable.Range(firstGameNumber, numberOfGamesPerRound))
                {
                    gameNumberPerRound++;

                    var nextRoundNumber = new RoundNumber(roundNumber + 1);
                    if (nextRoundNumber.Value > this.DrawSettings.NumberOfRoundsPerBlock)
                    {
                        return;
                    }

                    var game = this.Games.FirstOrDefault(o => o.RoundNumber.Value == roundNumber && o.GameNumber.Value == gameNumber);
                    if (game == null)
                    {
                        continue;
                    }

                    if (!(game.IsWalkover || game.IsNotPlayed))
                    {
                        // Walkover でも NotPlayed でもない場合は、
                        // 自動進出させる必要がないので次の週へ
                        continue;
                    }

                    var nextGameNumber = this.CalculateNextGameNumber(numberOfGames, gameNumberPerRound);
                    var nextGame       = this.AddNextGameIfNotExists(nextRoundNumber, nextGameNumber);
                    if (nextGame.IsDone)
                    {
                        continue;
                    }

                    nextGame.UnassignOpponent(game.GameNumber);

                    var winner = game.GetWinner();
                    if (winner == null)
                    {
                        continue;
                    }

                    winner.UpdateBlockNumber(this.BlockNumber);
                    winner.UpdateGameNumber(nextGameNumber);
                    nextGame.UpdateOpponent(
                        winner.PlayerClassification,
                        winner.EntryNumber,
                        winner.SeedNumber,
                        winner.TeamCodes,
                        winner.TeamAbbreviatedNames,
                        winner.PlayerCodes,
                        winner.PlayerNames,
                        game.GameNumber,
                        game.GameNumber.NextDrawNumber
                        );

                    if (nextGame.Opponents.Count(o => o.IsAssigned) == Game.maxOpponentsCount)
                    {
                        nextGame.GameResult.Ready();
                    }

                    if (nextGame.Opponents.Count(o => o.IsBye) == Game.maxOpponentsCount)
                    {
                        nextGame.GameResult.NotPlayed();
                    }

                    var gameStatus = game.IsWalkover
                        ? GameStatus.Walkover
                        : GameStatus.NotPlayed;
                    var gameScore = game.IsWalkover
                        ? new GameScore(GameStatus.Walkover.Name)
                        : new GameScore(GameStatus.NotPlayed.Name);
                    game.GameResult.UpdateGameResult(
                        gameStatus,
                        winner.PlayerClassification,
                        winner.EntryNumber,
                        gameScore
                        );
                }
            }
        }
示例#4
0
        /// <summary>
        /// 試合一覧を更新します。
        /// </summary>
        /// <param name="game">試合。</param>
        /// <param name="isWinnerChanged">勝者変更フラグ。</param>
        public void Update(Game game, bool isWinnerChanged)
        {
            var firstGameNumber = 0;
            var numberOfGames   = 0;

            foreach (var roundNumber in Enumerable.Range(1, this.DrawSettings.NumberOfRoundsPerBlock))
            {
                var numberOfGamesPerRound = this.CalculateNumberOfGamesPerRound(roundNumber);
                firstGameNumber = numberOfGames + 1;
                numberOfGames  += numberOfGamesPerRound;

                var gameNumberPerRound = 0;
                foreach (var gameNumber in Enumerable.Range(firstGameNumber, numberOfGamesPerRound))
                {
                    gameNumberPerRound++;
                    if (!(game.RoundNumber.Value == roundNumber && game.GameNumber.Value == gameNumber))
                    {
                        continue;
                    }

                    var nextRoundNumber = new RoundNumber(roundNumber + 1);
                    if (nextRoundNumber.Value > this.DrawSettings.NumberOfRoundsPerBlock)
                    {
                        return;
                    }

                    var nextGameNumber = this.CalculateNextGameNumber(numberOfGames, gameNumberPerRound);
                    var nextGame       = this.AddNextGameIfNotExists(nextRoundNumber, nextGameNumber);

                    if (!isWinnerChanged)
                    {
                        return;
                    }

                    nextGame.UnassignOpponent(game.GameNumber);

                    var winner = game.GetWinner();
                    if (winner == null)
                    {
                        return;
                    }

                    if (winner.PlayerClassification == PlayerClassification.Bye)
                    {
                        winner.UpdateBlockNumber(this.BlockNumber);
                    }

                    winner.UpdateGameNumber(nextGameNumber);
                    nextGame.UpdateOpponent(
                        winner.PlayerClassification,
                        winner.EntryNumber,
                        winner.SeedNumber,
                        winner.TeamCodes,
                        winner.TeamAbbreviatedNames,
                        winner.PlayerCodes,
                        winner.PlayerNames,
                        game.GameNumber,
                        game.GameNumber.NextDrawNumber
                        );

                    if (nextGame.Opponents.Count(o => o.IsAssigned) == Game.maxOpponentsCount)
                    {
                        nextGame.GameResult.Ready();
                    }

                    return;
                }
            }
        }