public static Engine GetDefaultDeathmatchEngine(IEnumerable <IFighterStats> fighters)
        {
            var battlefield = new PlainBattlefield();
            var bounds      = new Tiny();

            var features = new List <IEngineFeature>()
            {
                new FeatureApplyCondition(),
                new FeatureReviveDeadFighters(),
            };

            var moveOrder         = new AllRandomMoveOrder();
            var positionGenerator = new AllRandomPositionGenerator();
            var winCondition      = new FiftyRoundsWinCondition();
            var staleCondition    = new NoneStaleCondition();

            return(GetEngine(fighters, battlefield, bounds, features, moveOrder, positionGenerator, winCondition, staleCondition, 2));
        }
        public static Engine GetDefaultEngine(IEnumerable <IFighterStats> fighters)
        {
            var battlefield = new PlainBattlefield();
            var bounds      = new Tiny();

            var features = new List <IEngineFeature>()
            {
                new FeatureApplyCondition(),
                new FeatureSacrificeToEntity(),
            };

            var moveOrder         = new AllRandomMoveOrder();
            var positionGenerator = new AllRandomPositionGenerator();
            var winCondition      = new LastManStandingWinCondition();
            var staleCondition    = new NoWinnerCanBeDeterminedStaleCondition();

            return(GetEngine(fighters, battlefield, bounds, features, moveOrder, positionGenerator, winCondition, staleCondition, 2));
        }
        public double Evaluate(IChromosome chromosome)
        {
            var engineCalculationChromosome = chromosome as EngineCalculationChromosome;

            if (engineCalculationChromosome == null)
            {
                return(0);
            }

            var battlefield = new PlainBattlefield();

            var features = new List <IEngineFeature>()
            {
            };

            double fitness = 0;

            for (int i = 0; i < MatchCount; i++)
            {
                Engine engine = new Engine(
                    cfg =>
                {
                    cfg.ActionsPerRound   = 1;
                    cfg.Battlefield       = battlefield;
                    cfg.Bounds            = new Small();
                    cfg.Features          = features;
                    cfg.MoveOrder         = new AllRandomMoveOrder();
                    cfg.PositionGenerator = new AllRandomPositionGenerator();
                    cfg.WinCondition      = new LastManStandingWinCondition();
                    engineCalculationChromosome.ApplyTo(cfg.CalculationValues);

                    return(cfg);
                }, GetFighters(FighterCount));

                fitness += GetFitness(engine);
            }

            return(fitness / MatchCount);
        }