Esempio n. 1
0
        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));
        }
Esempio n. 5
0
        public ShotResultModel CreateShotResult(GameStatsDomainModel stats)
        {
            AssertExtensions.NotNull(stats, nameof(stats));

            return(new ShotResultModel(false, false, stats.IsEnded));
        }
Esempio n. 6
0
 public GameStatsModel Map(GameStatsDomainModel stats)
 {
     return(new GameStatsModel(stats.ShipCount, stats.DestroyedCount, stats.KnockedCount, stats.ShotCount));
 }