Exemplo n.º 1
0
        public SimulationResult Simulation(GameInfosForDebug gameInfosDebug)
        {
            var simResult = new SimulationResult();
            var agent     = new SimulationAgent();

            while (agent.TotalMs < GameInfos.TIMEOUT_FOR_A_TURN_IN_MS && agent.SimRun <= GameInfos.MAX_SIMULATIONS_RUN)
            {
                var t0 = DateTime.UtcNow;

                var infosTurn = new GameTurnInfos(
                    nash: TurnInfos.Nash,
                    humans: TurnInfos.Humans,
                    zombies: TurnInfos.Zombies
                    );

                var tmpResult = SimulateGame(infosTurn, gameInfosDebug);

                if (tmpResult.Points >= simResult.Points)
                {
                    simResult = new SimulationResult(tmpResult);
                }

                var t1 = DateTime.UtcNow;
                agent.TotalMs += Tools.TimeDifferenceInMillisecond(t0, t1);
                agent.SimRun++;
            }

            DebugInfos.WriteDebugMessage(
                functionName: "Simulation end",
                strings: new string[] { $"total sim run {agent.SimRun} in {agent.TotalMs} ms\n" },
                debugLevel: DebugInfos.INFOS
                );

            return(simResult);
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            string[] inputs;
            var      previousHumansCount  = 0;
            var      previousZombiesCount = 0;
            var      simulation           = new SimulationGame();

            var gameInfosDebug = new GameInfosForDebug();

            // game loop
            while (true)
            {
                inputs = Console.ReadLine().Split(' ');
                var nashPosition = new Tuple <int, int>(int.Parse(inputs[0]), int.Parse(inputs[1]));
                var nash         = new PlayerNash(nashPosition);

                int humanCount = int.Parse(Console.ReadLine());
                var humans     = new List <Human>();
                for (var i = 0; i < humanCount; i++)
                {
                    inputs = Console.ReadLine().Split(' ');
                    var human = new Human(
                        id: int.Parse(inputs[0]),
                        pos: new Tuple <int, int>(int.Parse(inputs[1]), int.Parse(inputs[2]))
                        );
                    humans.Add(human);
                }

                int zombieCount = int.Parse(Console.ReadLine());
                var zombies     = new List <Zombie>();
                for (var i = 0; i < zombieCount; i++)
                {
                    inputs = Console.ReadLine().Split(' ');
                    var zombie = new Zombie(
                        id: int.Parse(inputs[0]),
                        pos: new Tuple <int, int>(int.Parse(inputs[1]), int.Parse(inputs[2])),
                        nextPos: new Tuple <int, int>(int.Parse(inputs[3]), int.Parse(inputs[4]))
                        );
                    zombies.Add(zombie);
                }

                if (zombieCount < previousZombiesCount)
                {
                    int zombiesDead = previousZombiesCount - zombieCount;
                    int humanPoints = 10 * previousHumansCount * previousHumansCount;

                    for (var i = 0; i < zombiesDead; i++)
                    {
                        var tmpPoints = humanPoints;

                        if (zombiesDead > 1)
                        {
                            tmpPoints *= Tools.Fibonacci(i + 1);
                        }
                        simulation.ActualScore += tmpPoints;
                    }
                }

                var turnInfos = new GameTurnInfos(nash, humans, zombies);

                // For each turn, we want to simulate the maximum of game played to find the best next move possible.
                simulation.InitTurnInfos(turnInfos);
                var simResult = simulation.Simulation(gameInfosDebug);

                if (simulation.NewBest)
                {
                    simulation.NumTurn = 0;
                    simulation.NewBest = false;
                }

    #if DEBUG_MODE
                DebugInfos.WriteSimulTurnInfos(gameInfosDebug.DebugInfosForTurn[simulation.NumTurn], DebugInfos.DEBUG);
    #endif

                Tools.PrintMove(simulation.BestSimulation.Moves[simulation.NumTurn]);

                previousHumansCount  = humanCount;
                previousZombiesCount = zombieCount;

                simulation.NumTurn++;
            }
        }