public Randomizer(IGameLayer gameLayer, ILoggerFactory loggerFactory, TurnStrategyBase strategy = null)
        {
            _gameLayer = gameLayer;
            _gameState = gameLayer.GetState();
            _logger    = loggerFactory.CreateLogger <Randomizer>();

            if (strategy == null)
            {
                _strategy = TurnStrategyBase.Build(loggerFactory)
                            .Append <BuildUtilityCloseToResidencesTurnStrategy>(c =>
                {
                    c.BuildingName         = "Mall";
                    c.MaxNumberOfBuildings = 3;
                })
                            .Append <BuildUtilityCloseToResidencesTurnStrategy>(c =>
                {
                    c.BuildingName         = "Park";
                    c.MaxNumberOfBuildings = 2;
                })
                            .Append <BuildBuildingWhenCloseToPopMaxTurnStrategy>()
                            .Append <BuyUpgradeTurnStrategy>()
                            .Append <MaintenanceWhenBuildingIsGettingDamagedTurnStrategy>()
                            .Append <BuildWhenHasBuildingsUnderConstructionTurnStrategy>()
                            .Append <AdjustBuildingTemperaturesTurnStrategy>()
                            .Append <SingletonBuildingTurnStrategy>()
                            .Compile();
            }
            else
            {
                _strategy = strategy;
            }
            _logger.LogInformation($"Strategy: {Environment.NewLine + _strategy}");
        }
Example #2
0
        public ScoreResponse Run(TurnStrategyBase strategy = null)
        {
            // Make actions
            GameState state = GameLayer.GetState();

            _logger.LogInformation("Map: " + Environment.NewLine + state.MapToString());

            var randomizer = new Randomizer(GameLayer, _loggerFactory, strategy);

            while (state.Turn < state.MaxTurns)
            {
                PrintDebug_NewTurn(state);

                randomizer.HandleTurn();

                foreach (var message in state.Messages)
                {
                    _logger.LogInformation(message);
                }

                foreach (var error in state.Errors)
                {
                    _logger.LogError("Error: " + error);
                }
            }

            state = GameLayer.GetState();
            var score = GameLayer.GetScore(state.GameId);

            _logger.LogInformation("");
            _logger.LogInformation("");
            _logger.LogInformation($"Done with game: {state.GameId}");
            _logger.LogInformation("");
            _logger.LogInformation($"::SUMMARY::");
            _logger.LogInformation($"Funds: {state.Funds}");
            _logger.LogInformation($"Buildings: {state.GetCompletedBuildings().Count()}");
            _logger.LogInformation($"Upgrades: {state.GetCompletedBuildings().Sum(x => x.Effects.Count)}");
            _logger.LogInformation("");
            _logger.LogInformation($"::ACTIONS::");
            foreach (GameActions action in Enum.GetValues(typeof(GameActions)))
            {
                var count = state.ActionHistory.Count(x => x.Value == action);
                if (count < 1)
                {
                    continue;
                }
                var percent = count / (double)state.ActionHistory.Count;
                _logger.LogInformation($"\t{percent:P1}\t {action} ({count}/{state.ActionHistory.Count})");
            }
            _logger.LogInformation("");
            _logger.LogInformation($"::SCORE::");
            _logger.LogInformation($"Final score: {score.FinalScore}");
            _logger.LogInformation($"Co2: {score.TotalCo2}");
            _logger.LogInformation($"Pop: {score.FinalPopulation}");
            _logger.LogInformation($"Happiness: {score.TotalHappiness}");
            return(score);
        }
Example #3
0
            protected virtual TurnStrategyBase.StrategyBuilder StrategyBuilder()
            {
                var builder = TurnStrategyBase.Build(_loggerFactory);

                return(builder);
            }