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); }
/// <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(); }
/// <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 ); } } }
/// <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; } } }