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; } } }
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"); } }
public FightStat Execute() { var fitnessStat = new FightStat(); while (!Battle.IsOver) { Battle.MakeStep(fitnessStat); Visualise(fitnessStat); } Visualise(fitnessStat); fitnessStat.CountFitness(Battle); return(fitnessStat); }
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++; }
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); } }