public ShotResultModel CreateShotResult(ShipDomainModel ship, GameStatsDomainModel stats) { AssertExtensions.NotNull(ship, nameof(ship)); AssertExtensions.NotNull(stats, nameof(stats)); return(new ShotResultModel(ship.Health == 0, true, stats.IsEnded)); }
public Task <GameStatsDomainModel> GetGameStats(GameDomainModel game) { ThrowIfGameNotExists(game); GameDomainModel localGame = _games.GetOrAdd(game.Id, id => throw GetDefaultException()); _shots.TryGetValue(game.Id, out var localShots); _ships.TryGetValue(game.Id, out var localShips); ShipDomainModel[] destroed = localShips is null ? Array.Empty <ShipDomainModel>() : localShips.Where(s => s.Health == 0).ToArray(); ShipDomainModel[] knoked = localShips is null ? Array.Empty <ShipDomainModel>() : localShips.Except(destroed).Where(s => s.Health != s.MaxHealth).ToArray(); var shipCount = localShips?.Count ?? 0; var shotCount = localShots?.Count ?? 0; bool ended = shipCount == destroed.Length; var stats = new GameStatsDomainModel(shipCount, destroed.Length, knoked.Length, shotCount, ended); return(Task.FromResult(stats)); }
public async Task <GameStatsModel> GetGameStats() { GameDomainModel game = await GetActiveGame(); GameStatsDomainModel stats = await _gameStateRepository.GetGameStats(game); GameStatsModel result = _modelMapper.Map(stats); return(result); }
// TODO UnitOfWork public async Task <ShotResultModel> Shot(ShotModel shotModel) { ShotDomainModel shot = _coordinatesParser.ParseCoordinate(shotModel.Coord); GameDomainModel game = await GetActiveGame(); await ThrowIfShotCanNotAdded(shot, game); ShipDomainModel ship = await TryKnockShip(game, shot); await _gameStateRepository.AddShot(game, shot, ship); GameStatsDomainModel stats = await _gameStateRepository.GetGameStats(game); if (stats.IsEnded) { await _gameStateRepository.EndGame(game); } return(ship is null ? _modelMapper.CreateShotResult(stats) : _modelMapper.CreateShotResult(ship.With(shot), stats)); }
public ShotResultModel CreateShotResult(GameStatsDomainModel stats) { AssertExtensions.NotNull(stats, nameof(stats)); return(new ShotResultModel(false, false, stats.IsEnded)); }
public GameStatsModel Map(GameStatsDomainModel stats) { return(new GameStatsModel(stats.ShipCount, stats.DestroyedCount, stats.KnockedCount, stats.ShotCount)); }