/// <summary> /// Find best step for victim catching /// </summary> private Position FindBestStepForCatching(Carnivore carnivore, Field field) { var minDistance = double.MaxValue; var bestStep = new Position(0, 0); var nextStep = new Position(); for (nextStep.X = -carnivore.MaxSpeed; nextStep.X <= carnivore.MaxSpeed; nextStep.X++) { for (nextStep.Y = -carnivore.MaxSpeed; nextStep.Y <= carnivore.MaxSpeed; nextStep.Y++) { var newPosition = carnivore.Position.Clone().Add(nextStep); if (!_validator.PositionIsOutOfField(field, newPosition) && (!_validator.PositionIsTakenByCarnivore(field, newPosition) || carnivore.Position.Equals(newPosition))) { var distance = _calculations.Distance(newPosition, carnivore.ClosestEnemy.Position); if (distance < minDistance) { minDistance = distance; bestStep = nextStep.Clone(); if (carnivore.ClosestEnemy.Position.Equals(newPosition)) { break; } } } } } return(bestStep); }
/// <summary> /// Find best step for escaping /// </summary> private Position FindBestStepToEscape(Herbivore herbivore, Field field) { var maxDistance = double.MinValue; var bestStep = new Position(0, 0); var nextStep = new Position(); for (nextStep.X = -herbivore.MaxSpeed; nextStep.X <= herbivore.MaxSpeed; nextStep.X++) { for (nextStep.Y = -herbivore.MaxSpeed; nextStep.Y <= herbivore.MaxSpeed; nextStep.Y++) { var newPosition = herbivore.Position.Clone().Add(nextStep); if (!_validator.PositionIsOutOfField(field, newPosition) && (!_validator.PositionIsTaken(field, newPosition) || herbivore.Position.Equals(newPosition))) { var distance = _calculations.Distance(newPosition, herbivore.ClosestEnemy.Position); if (distance > maxDistance) { maxDistance = distance; bestStep = nextStep.Clone(); } } } } return(bestStep); }
/// <summary> /// For every animal in 'FriendsList' locate closest animal in 'EnemiesList' /// </summary> private void LocateEnemiesForOneSpecie(IEnumerable <Animal> FriendsList, IEnumerable <Animal> EnemiesList) { foreach (var currentAnimal in FriendsList) { currentAnimal.ClosestEnemy = null; var minDistance = double.MaxValue; foreach (var enemy in EnemiesList) { var distance = _calculations.Distance(currentAnimal, enemy); if (distance <= currentAnimal.VisionRange && distance < minDistance) { minDistance = distance; currentAnimal.ClosestEnemy = enemy; } } } }