Пример #1
0
        private void ShootAction(Tank tank, FightStat fightStat)
        {
            var shiftCoord = Movements[tank.Direction];

            for (var i = 1; i <= Map.FireArea; i++)
            {
                var newCoord = tank.Coord + i * shiftCoord;
                if (Map.Obstacles.Contains(newCoord))
                {
                    return;
                }
                if (Map.AllTanks.Any(t => t.Coord == newCoord && t.IsAlive))
                {
                    if (tank == Map.Tank)
                    {
                        fightStat.Killed++;
                    }
                    else
                    {
                        fightStat.EnemiesKilledByEnemies++;
                    }
                    var visibleTank = Map.AllTanks.First(t => t.Coord == newCoord && t.IsAlive);
                    visibleTank.IsAlive       = false;
                    visibleTank.FirstMoveDead = 0;
                    if (visibleTank == Map.Tank)
                    {
                        fightStat.IsAlive = false;
                    }
                    return;
                }
            }
        }
Пример #2
0
        private void ExecuteCommand(Tank tank, string command, FightStat fitnessStat)
        {
            switch (command)
            {
            case "Forward":
                CheckAndMove(tank, tank.Coord + Movements[tank.Direction]);
                return;

            case "Backward":
                CheckAndMove(tank, tank.Coord - Movements[tank.Direction]);
                return;

            case "TurnRight":
                tank.Direction = DirectionMethods.RotateRight(tank.Direction);
                return;

            case "TurnLeft":
                tank.Direction = DirectionMethods.RotateLeft(tank.Direction);
                return;

            case "Shoot":
                ShootAction(tank, fitnessStat);
                return;

            case "Finish":
                tank.IsAlive = false;
                return;

            default:
                throw new Exception("Unknown command");
            }
        }
Пример #3
0
        public FightStat Execute()
        {
            var fitnessStat = new FightStat();

            while (!Battle.IsOver)
            {
                Battle.MakeStep(fitnessStat);
                Visualise(fitnessStat);
            }
            Visualise(fitnessStat);
            fitnessStat.CountFitness(Battle);
            return(fitnessStat);
        }
Пример #4
0
 public void MakeStep(FightStat fitnessStat)
 {
     foreach (var tank in Map.AllTanks.Where(tank => tank.IsAlive))
     {
         var command = GetNextStrategy(tank);
         ExecuteCommand(tank, command, fitnessStat);
         if (Map.Tank.Coord == Map.FinishCoord)
         {
             hasTankReachFinish         = true;
             fitnessStat.FinishAchieved = true;
         }
     }
     fitnessStat.Steps++;
 }
Пример #5
0
 private void Visualise(FightStat fitnessValue)
 {
     if (isDebug)
     {
         Visualiser.Visualise(Battle);
         fitnessValue.CountFitness(Battle);
         Console.WriteLine($"LastCommand: {Battle.Map.Tank.Strategy.LastCommand} ");
         Console.WriteLine($"FitnessValue: {fitnessValue.Result}");
         Console.WriteLine($"Steps: {fitnessValue.Steps}");
         Console.WriteLine($"Killed: {fitnessValue.Killed}");
         Console.WriteLine($"EnemiesKilledEachOther:{fitnessValue.EnemiesKilledByEnemies} ");
         Console.WriteLine($"Tanks left: {Battle.Map.Enemies.Count} ");
         System.Threading.Thread.Sleep(1000);
     }
 }