示例#1
0
        public void MakeTurn()
        {
            if (!_inputEntered)
            {
                Console.WriteLine("At first make input");
                return;
            }

            var playerTurn = new PlayerTurnModel
            {
                AcresToPlant  = _acresToPlant,
                AcrChange     = _acrChange,
                BushelsToFeed = _bushelsToFeed
            };

            var result = _game.MakeTurn(playerTurn);

            ResetInput();

            if (result.TurnHandleResult == TurnHandleResult.ValidationError)
            {
                Console.WriteLine(result.ValidationErrorMessage);
                return;
            }

            if (result.TurnHandleResult == TurnHandleResult.GameOver)
            {
                IsGameOver = true;
            }

            Console.WriteLine(result.Report);
        }
示例#2
0
        public ValidationResultModel Validate(CityDomain cityDomain, PlayerTurnModel turnModel)
        {
            ValidationResultModel valid = new ValidationResultModel()
            {
                HasErrors = false
            };
            StringBuilder sb = new StringBuilder();

            if (turnModel.BushelsToFeed > cityDomain.BushelsCount)
            {
                sb.Append("You do not have as many bushels").Append(_separator);
                valid.HasErrors = true;
            }

            if (turnModel.AcrChange < 0 && -turnModel.AcrChange > cityDomain.AcresCount)
            {
                sb.Append("You do not have as many acres for sale!").Append(_separator);
                valid.HasErrors = true;
            }

            if (turnModel.AcrChange > 0 && cityDomain.BushelsCount / cityDomain.AcrCost < turnModel.AcrChange)
            {
                sb.Append("You do not have as many bushels to buy as many acres!").Append(_separator);
                valid.HasErrors = true;
            }

            if (turnModel.AcresToPlant > cityDomain.AlivePeople * 10)
            {
                sb.Append("You do not have so many people to sow such a count of acres!").Append(_separator);
                valid.HasErrors = true;
            }

            if (turnModel.BushelsToFeed < 0)
            {
                sb.Append("You can not enter a negative value in the field for food!").Append(_separator);
                valid.HasErrors = true;
            }

            if (turnModel.AcresToPlant < 0)
            {
                sb.Append("You can not enter a negative value in the field for sowing acres!").Append(_separator);
                valid.HasErrors = true;
            }


            if (valid.HasErrors)
            {
                valid.ErrorMessage = sb.ToString();
            }
            return(valid);
        }
示例#3
0
        public TurnResultModel MakeTurn(PlayerTurnModel model)
        {
            var handleResult = _turnHandler.HandleTurn(model);
            var turnResult   = new TurnResultModel
            {
                TurnHandleResult = handleResult.TurnHandleResult
            };

            switch (handleResult.TurnHandleResult)
            {
            case TurnHandleResult.ValidationError:
                turnResult.ValidationErrorMessage = handleResult.ValidationResult.ErrorMessage;
                break;

            case TurnHandleResult.GameOver:
            case TurnHandleResult.Succeed:
                turnResult.Report = _reporter.GenerateYearReport(handleResult);
                break;
            }

            return(turnResult);
        }
示例#4
0
        public HandleResult HandleTurn(PlayerTurnModel model)
        {
            _cityDomain.BushelsCount -= model.AcrChange * _cityDomain.AcrCost;
            var validationResult = _validator.Validate(_cityDomain, model);

            if (validationResult.HasErrors)
            {
                return(new HandleResult
                {
                    TurnHandleResult = TurnHandleResult.ValidationError,
                    ValidationResult = validationResult
                });
            }


            _currentYear            = ++_cityDomain.CurrentYear;
            _cityDomain.AcresCount += model.AcrChange;

            var bushelsForPerson = model.BushelsToFeed / _normFoodForPerson;
            var fedPeopleCount   = bushelsForPerson > _cityDomain.AlivePeople
                                                ? _cityDomain.AlivePeople
                                                : bushelsForPerson;

            _cityDomain.StarvedPeople = _cityDomain.AlivePeople - fedPeopleCount;
            _cityDomain.AlivePeople  -= _cityDomain.StarvedPeople;

            if (_cityDomain.AlivePeople <= _cityDomain.StarvedPeople)
            {
                return(new HandleResult
                {
                    TurnHandleResult = TurnHandleResult.GameOver,
                    CityDomain = _cityDomain.Clone(),
                    GameOverCause = GameOverCause.PeopleDead
                });
            }

            _cityDomain.ComingInCurrentYearPeople = GameRandom.Next(2, 11);
            _cityDomain.AlivePeople += _cityDomain.ComingInCurrentYearPeople;


            _cityDomain.AcrCost = GameRandom.Next(16, 26);


            _cityDomain.BushelsCount          -= model.AcresToPlant + model.BushelsToFeed;
            _cityDomain.HarvestedBushelsPerAcr = _cityDomain.BushelsCount < 3000
                                                ? GameRandom.Next(1, 6)
                                                : OneBushelPerAcr;

            _cityDomain.BushelsCount += _cityDomain.HarvestedBushelsPerAcr * model.AcresToPlant;

            var eatenByRatsPercent = GameRandom.NextDouble();

            _cityDomain.EatenByRats = (int)(_cityDomain.BushelsCount * (eatenByRatsPercent >= 0.6
                                                                        ? eatenByRatsPercent - ReductionRatsFactor
                                                                        : eatenByRatsPercent));
            _cityDomain.BushelsCount -= _cityDomain.EatenByRats;


            var result = new HandleResult
            {
                CityDomain       = _cityDomain.Clone(),
                TurnHandleResult = _currentYear > _maxYears
                                    ? TurnHandleResult.GameOver
                                    : TurnHandleResult.Succeed,
            };

            result.GameOverCause = result.TurnHandleResult == TurnHandleResult.GameOver
                                    ? GameOverCause.CameLastYear
                                    : GameOverCause.None;
            return(result);
        }