Пример #1
0
        private static tMyPlace updateCowPosition(tMyPlace currentMyPlace)
        {
            tMyPlace nextMyPlace = currentMyPlace;

            List <tPlace> places       = currentMyPlace.Place.ToList();
            tPlace        currentPlace = places[0];
            List <tPlace> neighbours   = places.Where((value, index) => index != 0).ToList();

            List <tPosition> wolvesPositions = neighbours.Where(neighbour => neighbour.Wolf)
                                               .Select(wolf => wolf.Position).ToList();
            List <tPosition> validPositions = neighbours
                                              .Where(neighbour => neighbour.Position != null && !neighbour.Obstacle &&
                                                     neighbour.Grass > 0 && !neighbour.Wolf && !neighbour.Cow &&
                                                     !neighbour.Dog)
                                              .Select(validNeighbour => validNeighbour.Position).ToList();

            if (currentPlace.Grass > 0)
            {
                validPositions.Add(currentPlace.Position);
            }

            if (validPositions.Count > 0)
            {
                if (wolvesPositions.Count > 0)
                {
                    double    maxDistance         = 0;
                    tPosition maxDistancePosition = null;
                    foreach (tPosition validPosition in validPositions)
                    {
                        double distance = 0;
                        foreach (tPosition wolfPosition in wolvesPositions)
                        {
                            distance += euclidianDistance(validPosition, wolfPosition);
                        }

                        double averageDistance = distance / wolvesPositions.Count;
                        if (averageDistance > maxDistance)
                        {
                            maxDistance         = averageDistance;
                            maxDistancePosition = validPosition;
                        }
                    }

                    nextMyPlace.Place[0].Position = maxDistancePosition;
                }
                else
                {
                    nextMyPlace.Place[0].Position = randomTPositionFromList(validPositions);
                }
            }


            return(nextMyPlace);
        }
Пример #2
0
 private static double euclidianDistance(tPosition a, tPosition b)
 {
     return(Math.Sqrt(Math.Pow(a.xx - b.xx, 2) + Math.Pow(a.yy - b.yy, 2)));
 }
Пример #3
0
        private static tMyPlace updateWolfPosition(tMyPlace currentMyPlace)
        {
            tMyPlace nextMyPlace = currentMyPlace;

            List <tPlace> places = nextMyPlace.Place.ToList();

            //TODO: IMPLEMENT A STAMINA SYSTEM, EXAMPLE:
            // Stamina starts at 100
            // Each movement spends 1 stamina
            // Staying restores 1 stamina
            // Eating a cow restores 50 stamina

            //TODO: GET DOGS POSITIONS TO LATER RUN

            List <tPosition> dogsPositions = places.Where(neighbour => neighbour.Dog)
                                             .Select(dog => dog.Position).ToList();

            List <tPosition> cowsPositions = places.Where(place => place.Cow)
                                             .Select(cow => cow.Position).ToList();

            List <tPosition> validPositions = places
                                              .Where(place => place.Position != null && !place.Obstacle && !place.Wolf && !place.Dog && !place.Cow)
                                              .Select(validPlace => validPlace.Position).ToList();

            validPositions.Add(places[0].Position);

            if (validPositions.Count > 0)
            {
                if (dogsPositions.Count > 0)
                {
                    double    maxDistance         = 0;
                    tPosition maxDistancePosition = null;
                    foreach (tPosition validPosition in validPositions)
                    {
                        double distance = 0;
                        foreach (tPosition dogPosition in dogsPositions)
                        {
                            distance += euclidianDistance(validPosition, dogPosition);
                        }

                        double averageDistance = distance / dogsPositions.Count;
                        if (averageDistance > maxDistance)
                        {
                            maxDistance         = averageDistance;
                            maxDistancePosition = validPosition;
                        }
                    }

                    nextMyPlace.Place[0].Position = maxDistancePosition;
                }
                else if (cowsPositions.Count > 0)
                { // choose random cow and move to it
                    tPosition selectedCowPosition = randomTPositionFromList(cowsPositions);
                    nextMyPlace.Place[0].Position = selectedCowPosition;
                }
                else
                {
                    nextMyPlace.Place[0].Position = randomTPositionFromList(validPositions);
                }
            }

            return(nextMyPlace);
        }