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); }
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))); }
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); }