Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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;
                    }
                }
            }
        }