diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/IslandSimulationPavel.iml b/.idea/IslandSimulationPavel.iml new file mode 100644 index 0000000..cca7441 --- /dev/null +++ b/.idea/IslandSimulationPavel.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml new file mode 100644 index 0000000..673e4c5 --- /dev/null +++ b/.idea/intellij-javadocs-4.0.1.xml @@ -0,0 +1,204 @@ + + + + + UPDATE + false + true + + TYPE + FIELD + METHOD + + + PROTECTED + PUBLIC + DEFAULT + + + + + + ^.*(public|protected|private)*.+interface\s+\w+.* + /**\n + * The interface ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + ^.*(public|protected|private)*.+enum\s+\w+.* + /**\n + * The enum ${name}.\n + */ + + + ^.*(public|protected|private)*.+class\s+\w+.* + /**\n + * The type ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + .+ + /**\n + * The type ${name}.\n + */ + + + + + .+ + /**\n + * Instantiates a new ${name}.\n +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+ + /**\n + * Gets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+ + /**\n + * Sets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+ + /**\n + * The entry point of application.\n + + <#if element.parameterList.parameters?has_content> + *\n +</#if> + * @param ${element.parameterList.parameters[0].name} the input arguments\n +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + .+ + /**\n + * ${name}<#if isNotVoid> ${return}</#if>.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${return}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*.+static.*(\w\s\w)+.+ + /**\n + * The constant ${element.getName()}.\n + */ + + + ^.*(public|protected|private)*.*(\w\s\w)+.+ + /**\n + <#if element.parent.isInterface()> + * The constant ${element.getName()}.\n +<#else> + * The ${name}.\n +</#if> */ + + + .+ + /**\n + <#if element.parent.isEnum()> + *${name} ${typeName}.\n +<#else> + * The ${name}.\n +</#if>*/ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d8c2faf --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c7de264 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..b8b610a --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/island/IslandAbstractionDiagram.png b/island/IslandAbstractionDiagram.png new file mode 100644 index 0000000..2581d21 Binary files /dev/null and b/island/IslandAbstractionDiagram.png differ diff --git a/island/README.md b/island/README.md index 90770d0..6e88e9d 100644 --- a/island/README.md +++ b/island/README.md @@ -53,7 +53,7 @@ Optional task components: - Introduce other factors influencing the simulation: - More animal species - Different plant species - - Custom behavior for animal groups (e.g., wolves hunting and moving in packs) + - Custom behavior for animal EOrganisms (e.g., wolves hunting and moving in packs) - Terrain features, including rivers that restrict certain animal movements About parameters (if you choose to implement): diff --git a/island/src/main/java/org/island/Main.java b/island/src/main/java/org/island/Main.java index ac08ae9..a6793b7 100644 --- a/island/src/main/java/org/island/Main.java +++ b/island/src/main/java/org/island/Main.java @@ -1,28 +1,16 @@ package org.island; -import org.island.entity.Simulation; -import org.island.location.Island; -import org.island.repo.MapCreator; -import org.island.repo.factory.EntityFactory; -import org.island.repo.factory.Factory; -import org.island.services.SimulationWorkerService; -import org.island.settings.Config; -import org.island.view.ConsoleView; -import org.island.view.View; - +import org.island.initializer.Initializer; +import org.island.simulation.Simulation; public class Main { public static void main(String[] args) { - System.out.printf("Hello and Welcome to the Island Simulation!"); - Config config = Config.getConfig(); - Factory entityFactory = new EntityFactory(); - MapCreator mapCreator = new MapCreator(entityFactory); - Island island = mapCreator.createIsland(config); - View view = new ConsoleView(island, entityFactory); - Simulation game = new Simulation(island, entityFactory, view); - SimulationWorkerService gameWorker = new SimulationWorkerService(game); - gameWorker.start(); + System.out.println("Hello and Welcome to the Island Simulation!"); + + Initializer initializer = new Initializer(); + Simulation simulation = initializer.initialize(); + simulation.run(); } } \ No newline at end of file diff --git a/island/src/main/java/org/island/abilities/Eatable.java b/island/src/main/java/org/island/abilities/Eatable.java deleted file mode 100644 index e7d4174..0000000 --- a/island/src/main/java/org/island/abilities/Eatable.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.island.abilities; - -import org.island.location.Location; - -public interface Eatable { - public void eat(Location location); -} diff --git a/island/src/main/java/org/island/abilities/Movable.java b/island/src/main/java/org/island/abilities/Movable.java deleted file mode 100644 index d49f742..0000000 --- a/island/src/main/java/org/island/abilities/Movable.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.island.abilities; - -import org.island.location.Location; - -public interface Movable { - public void move(Location location); -} diff --git a/island/src/main/java/org/island/abilities/Reproducible.java b/island/src/main/java/org/island/abilities/Reproducible.java deleted file mode 100644 index 742a8af..0000000 --- a/island/src/main/java/org/island/abilities/Reproducible.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.island.abilities; - -import org.island.location.Location; - -public interface Reproducible { - public void reproduce(Location location); -} diff --git a/island/src/main/java/org/island/animals/Animal.java b/island/src/main/java/org/island/animals/Animal.java deleted file mode 100644 index 77df6d9..0000000 --- a/island/src/main/java/org/island/animals/Animal.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.island.animals; - -import lombok.AllArgsConstructor; -import lombok.Data; -import org.island.abilities.Eatable; -import org.island.abilities.Movable; -import org.island.entity.Organism; -import org.island.exceptions.OrganismNotFound; -import org.island.location.Location; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; -import org.island.repo.maps.Ration; -import org.island.repo.maps.Residents; -import org.island.util.Randomizer; - -import java.util.*; -import java.util.stream.Collectors; - -public abstract class Animal extends Organism implements Eatable, Movable { - - public Animal(OrganismInfo info, Limit limit) { - super(info, limit); - } - - - public void move(Location currentLocation) { - int speed = getSpeed(); - int countOfSteps = Randomizer.random(speed); - - Location destination = findDestinationLocation(countOfSteps, currentLocation); - - if (moveTo(destination)) { - remove(currentLocation); - } - } - - - public void eat(Location location) { - location.getLock().lock(); - - try { - Ration ration = getRation(); - double currentWeight = getCurrentWeight(); - double deltaWeight = getMaxWeight() - currentWeight; - Residents residents = location.getResidents(); - Organism prey = getTarget(ration, residents); - String preyType = prey.getType(); - - if (prey.isAlive()) { - int chanceToKill = ration.get(preyType); - int predatorTry = Randomizer.random(0, 100); - - if (predatorTry <= chanceToKill) { - prey.getDead(); - } else return; - } - - double currentTargetWeight = prey.getCurrentWeight(); - double predatorFinalWeight; - - if (deltaWeight > currentTargetWeight) { - predatorFinalWeight = currentWeight + currentTargetWeight; - prey.setCurrentWeight(0); - } else { - predatorFinalWeight = currentWeight + deltaWeight; - prey.setCurrentWeight(currentTargetWeight - deltaWeight); - } - - setCurrentWeight(predatorFinalWeight); - } finally { - location.getLock().unlock(); - } - } - - public boolean findSomeFood(Ration ration, Residents residents) { - return residents - .entrySet() - .stream() - .filter(resident -> resident.getValue().size() > 0) - .map(Map.Entry::getKey) - .anyMatch(ration::containsKey); - } - - private Organism getTarget(Ration ration, Residents residents) { - Set preys = residents - .entrySet() - .stream() - .filter(resident -> resident.getValue().size() > 0) - .filter(resident -> ration.containsKey(resident.getKey())) - .max(Comparator.comparingInt(resident -> ration.get(resident.getKey()))) - .orElseThrow(() -> new OrganismNotFound("target / prey not found")) - .getValue(); - - return preys - .stream() - .skip(Randomizer.random(0, preys.size())) - .iterator() - .next(); - - } - - private List getAvailableDirections(Set visitedLocations, Location destination){ - return destination - .getDirections() - .stream() - .filter(location -> !visitedLocations.contains(location)) - .collect(Collectors.toList()); - } - - private Location findDestinationLocation(int countOfSteps, Location location){ - Set visitedLocations = new HashSet<>(); - Location destination = location; - - while(countOfSteps > 0){ - visitedLocations.add(destination); - List directions = getAvailableDirections(visitedLocations, destination); - int countOfDirections = directions.size(); - - if (countOfDirections > 0){ - int selectedDirection = Randomizer.random(0, countOfDirections); - destination = directions.get(selectedDirection); - } - countOfSteps--; - } - return destination; - } - - private boolean moveTo(Location destination){ - destination.getLock().lock(); - - try{ - String type = getType(); - Residents residents = destination.getResidents(); - Set sameKindOrganisms = residents.get(type); - int countOfSameKindOrganisms = sameKindOrganisms.size(); - int maxCount = getMaxPopulation(); - if (countOfSameKindOrganisms < maxCount){ - return sameKindOrganisms.add(this); - } else return false; - } finally { - destination.getLock().unlock(); - } - } - - private void remove(Location location){ - location.getLock().lock(); - - try{ - Residents residents = location.getResidents(); - String type = getType(); - Set sameKindOrganisms = residents.get(type); - if (organismStillAvailable(location)){ - sameKindOrganisms.remove(this); - } - } finally { - location.getLock().unlock(); - } - } - - private boolean organismStillAvailable(Location location){ - Residents residents = location.getResidents(); - String type = getType(); - Set organismStillAvailable = residents.get(type); - return organismStillAvailable.contains(this); - } - - - -} diff --git a/island/src/main/java/org/island/animals/GrassEater.java b/island/src/main/java/org/island/animals/GrassEater.java deleted file mode 100644 index ea83b25..0000000 --- a/island/src/main/java/org/island/animals/GrassEater.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.island.animals; - -import org.island.abilities.Eatable; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public abstract class GrassEater extends Animal { - public GrassEater(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/Predator.java b/island/src/main/java/org/island/animals/Predator.java deleted file mode 100644 index 6086ded..0000000 --- a/island/src/main/java/org/island/animals/Predator.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.island.animals; - -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public abstract class Predator extends Animal { - - public Predator(OrganismInfo info, Limit limit){ - super(info, limit); - } - -} - diff --git a/island/src/main/java/org/island/animals/grasseaters/Boar.java b/island/src/main/java/org/island/animals/grasseaters/Boar.java deleted file mode 100644 index b6f7c23..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Boar.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Boar extends GrassEater { - - public Boar(OrganismInfo info, Limit limit) { - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Buffalo.java b/island/src/main/java/org/island/animals/grasseaters/Buffalo.java deleted file mode 100644 index a0550b7..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Buffalo.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Buffalo extends GrassEater { - - public Buffalo(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Caterpillar.java b/island/src/main/java/org/island/animals/grasseaters/Caterpillar.java deleted file mode 100644 index 07b5600..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Caterpillar.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Caterpillar extends GrassEater { - - public Caterpillar(OrganismInfo info, Limit limit){ - super(info, limit); - } - -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Deer.java b/island/src/main/java/org/island/animals/grasseaters/Deer.java deleted file mode 100644 index bdc79b6..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Deer.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Deer extends GrassEater { - - public Deer(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Duck.java b/island/src/main/java/org/island/animals/grasseaters/Duck.java deleted file mode 100644 index f6672ae..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Duck.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Duck extends GrassEater { - - public Duck(OrganismInfo info, Limit limit) { - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Goat.java b/island/src/main/java/org/island/animals/grasseaters/Goat.java deleted file mode 100644 index 9ff0f3a..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Goat.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Goat extends GrassEater { - - public Goat(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Horse.java b/island/src/main/java/org/island/animals/grasseaters/Horse.java deleted file mode 100644 index ee5026c..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Horse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Horse extends GrassEater { - - public Horse(OrganismInfo info, Limit limit) { - super(info, limit); - } -} - diff --git a/island/src/main/java/org/island/animals/grasseaters/Mouse.java b/island/src/main/java/org/island/animals/grasseaters/Mouse.java deleted file mode 100644 index 5c393bc..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Mouse.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Mouse extends GrassEater { - - public Mouse(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Rabbit.java b/island/src/main/java/org/island/animals/grasseaters/Rabbit.java deleted file mode 100644 index 6d74392..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Rabbit.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Rabbit extends GrassEater { - - public Rabbit(OrganismInfo info, Limit limit){ - super(info, limit); - } - -} diff --git a/island/src/main/java/org/island/animals/grasseaters/Sheep.java b/island/src/main/java/org/island/animals/grasseaters/Sheep.java deleted file mode 100644 index 2ea16b9..0000000 --- a/island/src/main/java/org/island/animals/grasseaters/Sheep.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.grasseaters; - -import org.island.animals.GrassEater; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Sheep extends GrassEater { - - public Sheep(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/predators/Bear.java b/island/src/main/java/org/island/animals/predators/Bear.java deleted file mode 100644 index 720fcea..0000000 --- a/island/src/main/java/org/island/animals/predators/Bear.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.predators; - -import org.island.animals.Predator; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Bear extends Predator { - - public Bear(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/predators/Eagle.java b/island/src/main/java/org/island/animals/predators/Eagle.java deleted file mode 100644 index aeb1aec..0000000 --- a/island/src/main/java/org/island/animals/predators/Eagle.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.predators; - -import org.island.animals.Predator; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Eagle extends Predator { - - public Eagle(OrganismInfo info, Limit limit) { - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/predators/Fox.java b/island/src/main/java/org/island/animals/predators/Fox.java deleted file mode 100644 index 4823eb0..0000000 --- a/island/src/main/java/org/island/animals/predators/Fox.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.predators; - -import org.island.animals.Predator; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Fox extends Predator { - - public Fox(OrganismInfo info, Limit limit) { - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/predators/Python.java b/island/src/main/java/org/island/animals/predators/Python.java deleted file mode 100644 index 9ad9582..0000000 --- a/island/src/main/java/org/island/animals/predators/Python.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.island.animals.predators; - -import org.island.abilities.Eatable; -import org.island.abilities.Movable; -import org.island.abilities.Reproducible; -import org.island.animals.Predator; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Python extends Predator { - - public Python(OrganismInfo info, Limit limit) { - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/animals/predators/Wolf.java b/island/src/main/java/org/island/animals/predators/Wolf.java deleted file mode 100644 index b2de8a2..0000000 --- a/island/src/main/java/org/island/animals/predators/Wolf.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.animals.predators; - - -import org.island.animals.Predator; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Wolf extends Predator { - public Wolf(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/entity/EOrganisms.java b/island/src/main/java/org/island/entity/EOrganisms.java new file mode 100644 index 0000000..0f8f922 --- /dev/null +++ b/island/src/main/java/org/island/entity/EOrganisms.java @@ -0,0 +1,30 @@ +package org.island.entity; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum EOrganisms { + WOLF("Wolf", 0, true), + PYTHON("Python", 1, true), + FOX("Fox", 2, true), + BEAR("Bear", 3, true), + EAGLE("Eagle", 4, true), + HORSE("Horse", 5, true), + DEER("Deer", 6, true), + RABBIT("Rabbit", 7, true), + MOUSE("Mouse", 8, true), + GOAT("Goat", 9, true), + SHEEP("Sheep", 10, true), + BOAR("Boar", 11, true), + BUFFALO("Buffalo", 12, true), + DUCK("Duck", 13, true), + CATERPILLAR("Caterpillar", 14, true), + HERB("Herb", 15, false); + + private final String type; + private final int groupId; + private final boolean isAnimal; + //groupId -> group (plants, grasseaters, predators) +} diff --git a/island/src/main/java/org/island/entity/Group.java b/island/src/main/java/org/island/entity/Group.java deleted file mode 100644 index 6fe9e01..0000000 --- a/island/src/main/java/org/island/entity/Group.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.island.entity; - -public enum Group { - WOLF("Wolf", 0), - PYTHON("Python", 1), - FOX("Fox", 2), - BEAR("Bear", 3), - EAGLE("Eagle", 4), - HORSE("Horse", 5), - DEER("Deer", 6), - RABBIT("Rabbit", 7), - MOUSE("Mouse", 8), - GOAT("Goat", 9), - SHEEP("Sheep", 10), - BOAR("Boar", 11), - BUFFALO("Buffalo", 12), - DUCK("Duck", 13), - CATERPILLAR("Caterpillar", 14), - HERB("Herb", 15); - - private final String type; - private final int groupId; - - public int getGroupId(){ - return groupId; - } - - public String getType(){ - return type; - } - - Group(String type, int groupId){ - this.type = type; - this.groupId = groupId; - } - - -} diff --git a/island/src/main/java/org/island/entity/Organism.java b/island/src/main/java/org/island/entity/Organism.java deleted file mode 100644 index e68ff8d..0000000 --- a/island/src/main/java/org/island/entity/Organism.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.island.entity; - -import lombok.Data; -import org.island.abilities.Reproducible; -import org.island.location.Location; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.EntityFactory; -import org.island.repo.maps.Ration; -import org.island.repo.maps.Residents; -import org.island.util.Fullness; - -import java.util.Objects; -import java.util.Set; - -@Data -public abstract class Organism implements Reproducible { - private final OrganismInfo info; - private final Limit limit; - - public Organism(OrganismInfo info, Limit limit){ - this.info = info; - this.limit = limit; - } - - public String getType(){ - return info.getType(); - } - - public int getGroupId(){ - return info.getGroupId(); - } - - public boolean isAlive(){ - return info.isAlive(); - } - - public double getCurrentWeight(){ - return info.getCurrentWeight(); - } - - public void setCurrentWeight(double currentWeight){ - info.setCurrentWeight(currentWeight); - } - - public String getIcon(){ - return info.getIcon(); - } - - public Fullness getFullness(){ - return info.getFullness(); - } - - public void setFullness(Fullness fullness){ - info.setFullness(fullness); - } - - public Ration getRation(){ - return info.getRation(); - } - - public double getMaxWeight(){ - return limit.getMaxWeight(); - } - - public int getMaxPopulation(){ - return limit.getMaxPopulation(); - } - - public int getSpeed(){ - return limit.getSpeed(); - } - - public void getDead(){ - info.setAlive(false); - } - - @Override - public void reproduce(Location location) { - location.getLock().lock(); - try { - Residents residents = location.getResidents(); - String type = getType(); - Set sameOrganisms = residents.get(type); - int maxLimit = getMaxPopulation(); - - if(sameOrganisms.contains(this) && sameOrganisms.size() >= 2 && sameOrganisms.size() < maxLimit){ - Organism organism = EntityFactory.getFactory().create(type); - sameOrganisms.add(organism); - } - } finally { - location.getLock().unlock(); - } - } - - public void killOrganism(Location location){ - location.getLock().lock(); - try{ - String type = getType(); - location.getResidents().get(type).remove(this); - } finally { - location.getLock().unlock(); - } - } - - @Override - public boolean equals(Object o){ - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Organism organism = (Organism) o; - return Objects.equals(info, organism.info); - } - - @Override - public int hashCode(){ - return Objects.hash(info); - } -} diff --git a/island/src/main/java/org/island/entity/OrganismDTO.java b/island/src/main/java/org/island/entity/OrganismDTO.java new file mode 100644 index 0000000..82f45c2 --- /dev/null +++ b/island/src/main/java/org/island/entity/OrganismDTO.java @@ -0,0 +1,38 @@ +package org.island.entity; + + +import lombok.*; + +import java.util.HashMap; +import java.util.Objects; +import java.util.UUID; + +@Builder +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode +public class OrganismDTO { + private UUID uuid; + private String type; + private int groupId; + private int organismId; + private boolean isAlive; + private double currentWeight; + private String icon; + private HashMap ration; + private double maxWeight; + private int maxPopulation; + private int speed; + + public EOrganisms getOrganismType() { + try { + return EOrganisms.valueOf(type.toUpperCase()); + } catch (IllegalArgumentException e) { + return EOrganisms.HERB; + } + } + + +} diff --git a/island/src/main/java/org/island/entity/Simulation.java b/island/src/main/java/org/island/entity/Simulation.java deleted file mode 100644 index 35861a5..0000000 --- a/island/src/main/java/org/island/entity/Simulation.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.island.entity; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.island.location.Island; -import org.island.repo.factory.Factory; -import org.island.view.View; - -@Getter -@RequiredArgsConstructor -public class Simulation { - private final Island island; - private final Factory entityFactory; - private final View view; -} diff --git a/island/src/main/java/org/island/exceptions/OrganismNotFound.java b/island/src/main/java/org/island/exceptions/OrganismNotFound.java index 1476c7e..b96db36 100644 --- a/island/src/main/java/org/island/exceptions/OrganismNotFound.java +++ b/island/src/main/java/org/island/exceptions/OrganismNotFound.java @@ -1,7 +1,6 @@ package org.island.exceptions; -public class OrganismNotFound extends RuntimeException { - +public class OrganismNotFound extends RuntimeException{ public OrganismNotFound(){} public OrganismNotFound(String message){ diff --git a/island/src/main/java/org/island/exceptions/OrganismOperationFail.java b/island/src/main/java/org/island/exceptions/OrganismOperationFail.java deleted file mode 100644 index 24c4533..0000000 --- a/island/src/main/java/org/island/exceptions/OrganismOperationFail.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.island.exceptions; - -@SuppressWarnings("unused") -public class OrganismOperationFail extends RuntimeException{ - - public OrganismOperationFail(){} - - public OrganismOperationFail(String message){ - super(message); - } - - public OrganismOperationFail(String message, Throwable cause){ - super(message, cause); - } - - public OrganismOperationFail(Throwable cause){ - super(cause); - } -} diff --git a/island/src/main/java/org/island/factory/OrganismFactory.java b/island/src/main/java/org/island/factory/OrganismFactory.java new file mode 100644 index 0000000..708ddc4 --- /dev/null +++ b/island/src/main/java/org/island/factory/OrganismFactory.java @@ -0,0 +1,34 @@ +package org.island.factory; + +import lombok.Getter; +import org.island.entity.EOrganisms; +import org.island.entity.OrganismDTO; +import org.island.settings.Config; +import org.island.settings.OrganismParameters; + +import java.util.UUID; + + +@Getter +public class OrganismFactory { + private static final OrganismParameters config; + + static { + Config configuration = Config.initialize(); + config = configuration.getOrganismParameters(); + } + + public static OrganismDTO createOrganism(EOrganisms organism) { + OrganismParameters.AnimalParams params = config.getLimits().get(organism.getType()); + + return OrganismDTO.builder() + .uuid(UUID.randomUUID()) + .type(organism.getType()) + .groupId(organism.getGroupId()) + .icon(config.getIcons().get(organism.getType())) + .maxWeight(params.getMaxWeight()) + .maxPopulation(params.getMaxPopulation()) + .speed(params.getSpeed()) + .build(); + } +} diff --git a/island/src/main/java/org/island/initializer/Initializer.java b/island/src/main/java/org/island/initializer/Initializer.java new file mode 100644 index 0000000..9d399cd --- /dev/null +++ b/island/src/main/java/org/island/initializer/Initializer.java @@ -0,0 +1,63 @@ +package org.island.initializer; + +import org.island.factory.OrganismFactory; +import org.island.model.Island; +import org.island.services.*; +import org.island.simulation.Simulation; +import org.island.settings.Config; +import org.island.view.ConsoleView; +import org.island.view.View; + +public class Initializer { + + public Simulation initialize() { + // Load configuration + Config config = loadConfig(); + + // Init island and factory + OrganismFactory factory = createFactory(); + + // Init map creator service + MapCreatorService mapCreatorService = new MapCreatorService(factory); + + // Init island and populate + Island island = mapCreatorService.createIsland(config); + + // Init view + View view = createView(island, factory); + view.showStatistics(); + view.showMap(); + + // Initialize simulation + return createSimulation(config, island, view); + } + + private Config loadConfig() { + return Config.initialize(); + } + + private OrganismFactory createFactory() { + return new OrganismFactory(); + } + + private View createView(Island island, OrganismFactory factory) { + return new ConsoleView(island, factory); + } + + private Simulation createSimulation(Config config, Island island, View view) { + MovementService movementService = new AnimalMovementService(); + MatingService matingService = new AnimalMatingService(); + FeedingService feedingService = new AnimalFeedingService(); + DeathService deathService = new AnimalDeathService(); + + return new Simulation( + view, + island, + config.getIslandSimulationConfig().getSimulation().getPeriod(), + movementService, + matingService, + feedingService, + deathService, + createFactory()); + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/location/Island.java b/island/src/main/java/org/island/location/Island.java deleted file mode 100644 index 270923c..0000000 --- a/island/src/main/java/org/island/location/Island.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.island.location; - -import lombok.Data; -/* -06/15/2024: -Island Class: Manages the entire island grid using a 2-dimensional array of Location objects. - -@Data: Lombok annotation that automatically generates getters, setters, equals(), hashCode(), -and toString() methods for all fields in the class. - */ - -@Data -public class Island { - private Location[][] grid; - - public Island(int numRows, int numCols){ - this.grid = new Location[numRows] [numCols]; - } - - public Location[][] getIslandGrid(){ - return grid; - } - -} diff --git a/island/src/main/java/org/island/location/Location.java b/island/src/main/java/org/island/location/Location.java deleted file mode 100644 index 8347b27..0000000 --- a/island/src/main/java/org/island/location/Location.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.island.location; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.Getter; -import lombok.Setter; -import org.island.animals.Animal; -import org.island.plants.Plant; -import org.island.repo.maps.Residents; - -import java.util.List; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -/* -06/15/2024: -Location Class: Represents a single cell on the island grid, -encapsulating vegetation (same as plant) and animal information. - -@Data: Lombok annotation that automatically generates getters, setters, equals(), hashCode(), -and toString() methods for all fields in the class. - -@AllArgsConstructor: Lombok annotation that automatically generates constructor with all - arguments based on all fields in the class. - */ - -@Data -@AllArgsConstructor -public class Location { - private final int row; - private final int column; - - @Getter - private List directions; - - @Setter - private final Residents residents; - - @Getter - private final Lock lock; - - public Location(int row, int column){ - this.row = row; - this.column = column; - this.residents = new Residents(); - this.lock = new ReentrantLock(true); - } - - public void setDirection(List directions){ - this.directions = directions; - } - - @Override - public String toString(){ - return "Location" + "[" + row + "]" + "[" + column + "]"; - } - - private Plant plant; - private Animal animal; -} diff --git a/island/src/main/java/org/island/model/Island.java b/island/src/main/java/org/island/model/Island.java new file mode 100644 index 0000000..eee7982 --- /dev/null +++ b/island/src/main/java/org/island/model/Island.java @@ -0,0 +1,13 @@ +package org.island.model; + +import lombok.Data; +import lombok.Getter; +import lombok.ToString; +import org.island.settings.Config; + + +@Data +@ToString +public class Island { + private Location[][] GRID; +} \ No newline at end of file diff --git a/island/src/main/java/org/island/model/Location.java b/island/src/main/java/org/island/model/Location.java new file mode 100644 index 0000000..fd6b01a --- /dev/null +++ b/island/src/main/java/org/island/model/Location.java @@ -0,0 +1,135 @@ +package org.island.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.island.entity.OrganismDTO; + +import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Data +public class Location { + private final int row; + private final int column; + private List directions; + private Map> residents; + private final Lock lock = new ReentrantLock(); + + public Location(int row, int column) { + this.row = row; + this.column = column; + this.residents = new HashMap<>(); + this.directions = new ArrayList<>(); + } + + public void addDirection(Location direction) { + this.directions.add(direction); + } + + public void addResident(OrganismDTO resident) { + lock.lock(); + try { + Set organismSet = residents.computeIfAbsent(resident.getType(), k -> new HashSet<>()); + organismSet.add(resident); + } finally { + lock.unlock(); + } + } + + public void removeResident(OrganismDTO resident) { + lock.lock(); + try { + Set organismSet = residents.get(resident.getType()); + if (organismSet != null) { + organismSet.remove(resident); + } + } finally { + lock.unlock(); + } + } + + public boolean isFull(String type, int maxPopulation) { + lock.lock(); + try { + Set organismSet = residents.get(type); + return organismSet != null && organismSet.size() >= maxPopulation; + } finally { + lock.unlock(); + } + } + + public int getResidentCount(String type) { + lock.lock(); + try { + Set organismSet = residents.get(type); + return organismSet != null ? organismSet.size() : 0; + } finally { + lock.unlock(); + } + } + + public Set getResidentsOfType(String type) { + lock.lock(); + try { + return new HashSet<>(residents.getOrDefault(type, Collections.emptySet())); + } finally { + lock.unlock(); + } + } + + @Override + public String toString() { + return "Location{" + + "row=" + row + + ", column=" + column + + ", directions=" + summarizeDirections() + + ", residents=" + summarizeResidents() + + '}'; + } + + private String summarizeDirections() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (Location direction : directions) { + sb.append("Location{row=").append(direction.getRow()).append(", column=").append(direction.getColumn()).append("}, "); + } + if (sb.length() > 1) { + sb.setLength(sb.length() - 2); + } + sb.append("]"); + return sb.toString(); + } + + private String summarizeResidents() { + StringBuilder sb = new StringBuilder(); + sb.append("{"); + for (Map.Entry> entry : residents.entrySet()) { + sb.append(entry.getKey()).append("=").append(entry.getValue().size()).append(", "); + } + if (sb.length() > 1) { + sb.setLength(sb.length() - 2); + } + sb.append("}"); + return sb.toString(); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Location location)) return false; + return row == location.row && column == location.column && Objects.equals(directions, location.directions) && Objects.equals(residents, location.residents) && Objects.equals(lock, location.lock); + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + row; + result = 31 * result + column; + result = 31 * result + directions.size(); + result = 31 * result + residents.hashCode(); + return result; + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/model/Ration.java b/island/src/main/java/org/island/model/Ration.java new file mode 100644 index 0000000..abb372c --- /dev/null +++ b/island/src/main/java/org/island/model/Ration.java @@ -0,0 +1,6 @@ +package org.island.model; + +import java.util.HashMap; + +public class Ration extends HashMap { +} diff --git a/island/src/main/java/org/island/model/Residents.java b/island/src/main/java/org/island/model/Residents.java new file mode 100644 index 0000000..6783fd5 --- /dev/null +++ b/island/src/main/java/org/island/model/Residents.java @@ -0,0 +1,9 @@ +package org.island.model; + +import org.island.entity.OrganismDTO; + +import java.util.HashMap; +import java.util.Set; + +public class Residents extends HashMap> { +} diff --git a/island/src/main/java/org/island/plants/Growable.java b/island/src/main/java/org/island/plants/Growable.java deleted file mode 100644 index 1b6d211..0000000 --- a/island/src/main/java/org/island/plants/Growable.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.island.plants; - -public interface Growable { - public void grow(); -} diff --git a/island/src/main/java/org/island/plants/Herb.java b/island/src/main/java/org/island/plants/Herb.java deleted file mode 100644 index d20f7f8..0000000 --- a/island/src/main/java/org/island/plants/Herb.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.island.plants; - -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public class Herb extends Plant { - - public Herb(OrganismInfo info, Limit limit) { - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/plants/Plant.java b/island/src/main/java/org/island/plants/Plant.java deleted file mode 100644 index 7f45f3d..0000000 --- a/island/src/main/java/org/island/plants/Plant.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.island.plants; - - -import org.island.entity.Organism; -import org.island.repo.Limit; -import org.island.repo.OrganismInfo; - -public abstract class Plant extends Organism { - - public Plant(OrganismInfo info, Limit limit){ - super(info, limit); - } -} diff --git a/island/src/main/java/org/island/repo/Limit.java b/island/src/main/java/org/island/repo/Limit.java deleted file mode 100644 index 84ab5a6..0000000 --- a/island/src/main/java/org/island/repo/Limit.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.repo; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class Limit { - private double maxWeight; - private int maxPopulation; - private int speed; -} diff --git a/island/src/main/java/org/island/repo/MapCreator.java b/island/src/main/java/org/island/repo/MapCreator.java deleted file mode 100644 index 6402935..0000000 --- a/island/src/main/java/org/island/repo/MapCreator.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.island.repo; - -import org.island.entity.Organism; -import org.island.location.Island; -import org.island.location.Location; -import org.island.repo.factory.Factory; -import org.island.repo.maps.Residents; -import org.island.settings.Config; -import org.island.util.Randomizer; - -import java.util.*; - -public class MapCreator { - - private final Factory entityFactory; - private int rows; - private int columns; - - public MapCreator(Factory factory) { - this.entityFactory = factory; - } - - public Island createIsland(Config config) { - this.rows = config.getRows(); - this.columns = config.getColumns(); - - Island island = new Island(rows, columns); - - createEmptyGrid(island); - populateIsland(island); - findLocationNeighbors(island); - - return island; - } - - private void createEmptyGrid(Island island) { - Location[][] grid = island.getIslandGrid(); - - for (int row = 0; row < grid.length; row++) { - for (int column = 0; column < grid[row].length; column++) { - grid[row][column] = new Location(row, column); - } - } - } - - private void populateIsland(Island island) { - Location[][] grid = island.getIslandGrid(); - Map prototypes = entityFactory.getPrototypes(); - - for (Location[] value : grid) { - for (Location location : value) { - Residents residents = location.getResidents(); - - for (Organism organism : prototypes.values()) { - String type = organism.getType(); - int maxCount = organism.getMaxPopulation(); - int count = Randomizer.random(maxCount / 2, maxCount); - Set organismSet = new HashSet<>(); - - for (int i = 0; i < count; i++) { - organismSet.add(entityFactory.create(type)); - } - residents.put(type, organismSet); - } - } - } - } - - private void findLocationNeighbors(Island island) { - Location[][] grid = island.getIslandGrid(); - for (int row = 0; row < grid.length; row++) { - for (int col = 0; col < grid[row].length; col++) { - Location location = grid[row][col]; - List neighbours = findNeighbors(row, col, grid); - location.setDirection(neighbours); - } - } - } - - private List findNeighbors(int row, int col, Location[][] grid) { - List result = new ArrayList<>(); - if (row > 0) result.add(grid[row - 1][col]); - if (col > 0) result.add(grid[row][col - 1]); - if (row < rows - 1) result.add(grid[row + 1][col]); - if (col < columns - 1) result.add(grid[row][col + 1]); - - return result; - } -} diff --git a/island/src/main/java/org/island/repo/OrganismInfo.java b/island/src/main/java/org/island/repo/OrganismInfo.java deleted file mode 100644 index db9d604..0000000 --- a/island/src/main/java/org/island/repo/OrganismInfo.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.island.repo; - - -import lombok.*; -import org.island.repo.maps.Ration; -import org.island.util.Fullness; - -import java.util.Objects; - -@Builder -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class OrganismInfo { - private String type; - private int groupId; - private int organismId; - private boolean isAlive; - private double currentWeight; - private String icon; - private Fullness fullness; - private Ration ration; - - @Override - public boolean equals(Object o){ - if(this == o) return true; - if(o ==null || getClass() != o.getClass()) return false; - OrganismInfo that = (OrganismInfo) o; - return groupId == that.groupId && organismId == that.organismId; - } - - @Override - public int hashCode(){ - return Objects.hash(groupId, organismId); - } -} diff --git a/island/src/main/java/org/island/repo/factory/EntityFactory.java b/island/src/main/java/org/island/repo/factory/EntityFactory.java deleted file mode 100644 index bcb3e63..0000000 --- a/island/src/main/java/org/island/repo/factory/EntityFactory.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.island.repo.factory; - -import lombok.AllArgsConstructor; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.factory.animal_factories.grasseaters.*; -import org.island.repo.factory.animal_factories.predators.*; -import org.island.repo.factory.plant_factories.HerbFactory; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -@AllArgsConstructor -public class EntityFactory implements Factory{ - private static EntityFactory FACTORY; - - private final Map factoryMap; - private final Map prototypes; - - public EntityFactory(){ - factoryMap = createFactoryMap(); - prototypes = createPrototypes(); - } - - public static EntityFactory getFactory(){ - if (FACTORY == null){ - FACTORY = new EntityFactory(); - } - return FACTORY; - } - - @Override - public Map getPrototypes() { - return prototypes; - } - - @Override - public Organism create(String type) { - OrganismFactory factory = factoryMap.get(type); - Organism organism = factory.create(type); - if (organism != null){ - return organism; - } else throw new IllegalArgumentException("Wrong type of creation - " + type); - } - - private Map createFactoryMap(){ - Map factories = new LinkedHashMap<>(){{ - put(Group.WOLF.getType(), new WolfFactory()); - put(Group.PYTHON.getType(), new PythonFactory()); - put(Group.FOX.getType(), new FoxFactory()); - put(Group.BEAR.getType(), new BearFactory()); - put(Group.EAGLE.getType(), new EagleFactory()); - put(Group.HORSE.getType(), new HorseFactory()); - put(Group.DEER.getType(), new DeerFactory()); - put(Group.RABBIT.getType(), new RabbitFactory()); - put(Group.MOUSE.getType(), new MouseFactory()); - put(Group.GOAT.getType(), new GoatFactory()); - put(Group.SHEEP.getType(), new SheepFactory()); - put(Group.BOAR.getType(), new BoarFactory()); - put(Group.BUFFALO.getType(), new BuffaloFactory()); - put(Group.DUCK.getType(), new DuckFactory()); - put(Group.CATERPILLAR.getType(), new CaterpillarFactory()); - put(Group.HERB.getType(), new HerbFactory()); - }}; - return Collections.unmodifiableMap(factories); - } - private Map createPrototypes(){ - Map result = new LinkedHashMap<>(); - - for (Map.Entry pair : factoryMap.entrySet()){ - String type = pair.getKey(); - Organism organism = pair.getValue().create(type); - result.put(type, organism); - } - return Collections.unmodifiableMap(result); - } - -} diff --git a/island/src/main/java/org/island/repo/factory/Factory.java b/island/src/main/java/org/island/repo/factory/Factory.java deleted file mode 100644 index a7d74a4..0000000 --- a/island/src/main/java/org/island/repo/factory/Factory.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.island.repo.factory; - -import org.island.entity.Organism; - -import java.util.Map; - -public interface Factory { - Organism create(String type); - Map getPrototypes(); - -} diff --git a/island/src/main/java/org/island/repo/factory/OrganismFactory.java b/island/src/main/java/org/island/repo/factory/OrganismFactory.java deleted file mode 100644 index 7607fa0..0000000 --- a/island/src/main/java/org/island/repo/factory/OrganismFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.island.repo.factory; - -import org.island.entity.Organism; -import org.island.repo.Limit; -import org.island.repo.maps.Ration; -import org.island.settings.Config; -import org.island.util.Fullness; - -import java.io.ObjectInputFilter; - -public abstract class OrganismFactory { - protected int groupId; - protected String type; - protected Config config = Config.getConfig(); - protected boolean isAlive = true; - protected double currentWeight; - protected Fullness fullness = Fullness.ALL_RIGHT; - protected Ration ration; - protected Limit limit; - protected String icon; - - public abstract Organism create(String type); -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BoarFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BoarFactory.java deleted file mode 100644 index 23c2504..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BoarFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Boar; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class BoarFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public BoarFactory() { - groupId = Group.BOAR.getGroupId(); - type = Group.BOAR.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Boar(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BuffaloFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BuffaloFactory.java deleted file mode 100644 index 0436906..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BuffaloFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Boar; -import org.island.animals.grasseaters.Buffalo; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class BuffaloFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public BuffaloFactory(){ - groupId = Group.BUFFALO.getGroupId(); - type = Group.BUFFALO.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type){ - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Buffalo(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/CaterpillarFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/CaterpillarFactory.java deleted file mode 100644 index 3c950d0..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/CaterpillarFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Caterpillar; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class CaterpillarFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public CaterpillarFactory() { - groupId = Group.CATERPILLAR.getGroupId(); - type = Group.CATERPILLAR.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Caterpillar(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DeerFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DeerFactory.java deleted file mode 100644 index e62e6c3..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DeerFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Deer; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class DeerFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public DeerFactory() { - groupId = Group.DEER.getGroupId(); - type = Group.DEER.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Deer(organismInfo, limit); - } -} - diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DuckFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DuckFactory.java deleted file mode 100644 index d2850a5..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DuckFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Duck; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class DuckFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public DuckFactory() { - groupId = Group.DUCK.getGroupId(); - type = Group.DUCK.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Duck(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/GoatFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/GoatFactory.java deleted file mode 100644 index 183f448..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/GoatFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Mouse; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class GoatFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public GoatFactory(){ - groupId = Group.GOAT.getGroupId(); - type = Group.GOAT.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type){ - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Mouse(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/HorseFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/HorseFactory.java deleted file mode 100644 index 4d3afb7..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/HorseFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Horse; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class HorseFactory extends OrganismFactory { - - public static final AtomicInteger ID = new AtomicInteger(0); - - public HorseFactory(){ - groupId = Group.HORSE.getGroupId(); - type = Group.HORSE.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type){ - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Horse(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/MouseFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/MouseFactory.java deleted file mode 100644 index 6f6369c..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/MouseFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Mouse; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class MouseFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public MouseFactory(){ - groupId = Group.MOUSE.getGroupId(); - type = Group.MOUSE.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type){ - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Mouse(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/RabbitFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/RabbitFactory.java deleted file mode 100644 index 9a46b3f..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/RabbitFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Rabbit; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class RabbitFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public RabbitFactory() { - groupId = Group.RABBIT.getGroupId(); - type = Group.RABBIT.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Rabbit(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/SheepFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/SheepFactory.java deleted file mode 100644 index 8812093..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/SheepFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.grasseaters; - -import org.island.animals.grasseaters.Sheep; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class SheepFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public SheepFactory() { - groupId = Group.SHEEP.getGroupId(); - type = Group.SHEEP.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Sheep(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/BearFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/BearFactory.java deleted file mode 100644 index d93ca86..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/BearFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.island.repo.factory.animal_factories.predators; - -import org.island.animals.predators.Bear; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class BearFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public BearFactory(){ - groupId = Group.BEAR.getGroupId(); - type = Group.BEAR.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type){ - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Bear(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/EagleFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/EagleFactory.java deleted file mode 100644 index aac7467..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/EagleFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.predators; - -import org.island.animals.predators.Eagle; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class EagleFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public EagleFactory(){ - groupId = Group.EAGLE.getGroupId(); - type = Group.EAGLE.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Eagle(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/FoxFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/FoxFactory.java deleted file mode 100644 index b7485d4..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/FoxFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.predators; - -import org.island.animals.predators.Fox; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class FoxFactory extends OrganismFactory { - - public static final AtomicInteger ID = new AtomicInteger(0); - - public FoxFactory() { - groupId = Group.FOX.getGroupId(); - type = Group.FOX.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() *config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Fox(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/PythonFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/PythonFactory.java deleted file mode 100644 index a1200c4..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/PythonFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.animal_factories.predators; - -import org.island.animals.predators.Python; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class PythonFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public PythonFactory() { - groupId = Group.PYTHON.getGroupId(); - type = Group.PYTHON.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Python(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/WolfFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/WolfFactory.java deleted file mode 100644 index 2beddb7..0000000 --- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/WolfFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.island.repo.factory.animal_factories.predators; - -import org.island.animals.predators.Wolf; -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class WolfFactory extends OrganismFactory { - private final static AtomicInteger ID = new AtomicInteger(0); - - public WolfFactory() { - groupId = Group.WOLF.getGroupId(); - type = Group.WOLF.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type) { - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Wolf(organismInfo, limit); - - } -} diff --git a/island/src/main/java/org/island/repo/factory/plant_factories/HerbFactory.java b/island/src/main/java/org/island/repo/factory/plant_factories/HerbFactory.java deleted file mode 100644 index c3903ef..0000000 --- a/island/src/main/java/org/island/repo/factory/plant_factories/HerbFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.island.repo.factory.plant_factories; - -import org.island.entity.Group; -import org.island.entity.Organism; -import org.island.plants.Herb; -import org.island.repo.OrganismInfo; -import org.island.repo.factory.OrganismFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -public class HerbFactory extends OrganismFactory { - - private static final AtomicInteger ID = new AtomicInteger(0); - - public HerbFactory(){ - groupId = Group.HERB.getGroupId(); - type = Group.HERB.getType(); - limit = config.getLimit(type); - currentWeight = limit.getMaxWeight() * config.getStartWeightFactor(); - ration = config.getRation(type); - icon = config.getIcon(type); - } - - @Override - public Organism create(String type){ - - int organismId = ID.getAndIncrement(); - - OrganismInfo organismInfo = OrganismInfo.builder() - .type(type) - .groupId(groupId) - .organismId(organismId) - .isAlive(isAlive) - .currentWeight(currentWeight) - .icon(icon) - .fullness(fullness) - .ration(ration) - .build(); - - return new Herb(organismInfo, limit); - } -} diff --git a/island/src/main/java/org/island/repo/maps/FoodMap.java b/island/src/main/java/org/island/repo/maps/FoodMap.java deleted file mode 100644 index 21d2302..0000000 --- a/island/src/main/java/org/island/repo/maps/FoodMap.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.repo.maps; - -import java.util.HashMap; - -/* -Map foodMap,contain: - K - organism String type; - V - organism ration with chanceToEat > 0 (Map). -*/ - -public class FoodMap extends HashMap { -} diff --git a/island/src/main/java/org/island/repo/maps/Ration.java b/island/src/main/java/org/island/repo/maps/Ration.java deleted file mode 100644 index fd8b8eb..0000000 --- a/island/src/main/java/org/island/repo/maps/Ration.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.island.repo.maps; - -import java.util.HashMap; - -/* -Map ration, contain: - K - creature String type; - V - chance to eat this creature - */ - -public class Ration extends HashMap { -} diff --git a/island/src/main/java/org/island/repo/maps/Residents.java b/island/src/main/java/org/island/repo/maps/Residents.java deleted file mode 100644 index 19a2911..0000000 --- a/island/src/main/java/org/island/repo/maps/Residents.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.island.repo.maps; - -import org.island.entity.Organism; - -import java.util.HashMap; -import java.util.Set; - -/* -Map residents, contain: - K - creature String type; - V - set of these organisms. -*/ - -public class Residents extends HashMap> { -} diff --git a/island/src/main/java/org/island/services/AnimalDeathService.java b/island/src/main/java/org/island/services/AnimalDeathService.java new file mode 100644 index 0000000..ed66df2 --- /dev/null +++ b/island/src/main/java/org/island/services/AnimalDeathService.java @@ -0,0 +1,40 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Location; + +import java.util.UUID; + +public class AnimalDeathService implements DeathService { + + + + @Override + public void die(OrganismDTO organism, Location location) { + location.getLock().lock(); + + try { + if (organism.isAlive()) { + organism.setAlive(false); + } + + String type = organism.getType(); + location.getResidents().get(type).remove(organism); + } finally { + location.getLock().unlock(); + } + } + + + public void remove(UUID idOrganism, Location location) { + location.getLock().lock(); + + try { + location.getResidents().values().forEach(organisms -> + organisms.removeIf(organism -> organism.getUuid().equals(idOrganism)) + ); + } finally { + location.getLock().unlock(); + } + } +} diff --git a/island/src/main/java/org/island/services/AnimalFeedingService.java b/island/src/main/java/org/island/services/AnimalFeedingService.java new file mode 100644 index 0000000..fa251f8 --- /dev/null +++ b/island/src/main/java/org/island/services/AnimalFeedingService.java @@ -0,0 +1,40 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Location; + +import java.util.Map; +import java.util.Set; + +public class AnimalFeedingService implements FeedingService { + + @Override + public void eat(OrganismDTO organism, Location location) { + location.getLock().lock(); + + try { + Map ration = organism.getRation(); + + for (Map.Entry entry : ration.entrySet()) { + String preyType = entry.getKey(); + int probability = entry.getValue(); + + Set preySet = location.getResidents().get(preyType); + + if (preySet != null && !preySet.isEmpty()) { + for (OrganismDTO prey : preySet) { + if (Math.random() * 100 < probability) { + organism.setCurrentWeight(Math.min(organism.getMaxWeight(), + organism.getCurrentWeight() + prey.getCurrentWeight())); + prey.setAlive(false); + location.getResidents().get(preyType).remove(prey); + break; + } + } + } + } + } finally { + location.getLock().unlock(); + } + } +} diff --git a/island/src/main/java/org/island/services/AnimalMatingService.java b/island/src/main/java/org/island/services/AnimalMatingService.java new file mode 100644 index 0000000..c7c2ff6 --- /dev/null +++ b/island/src/main/java/org/island/services/AnimalMatingService.java @@ -0,0 +1,51 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Location; + +import java.util.HashMap; +import java.util.Set; +import java.util.UUID; + +public class AnimalMatingService implements MatingService { + + @Override + public void findMate(OrganismDTO organism, Location location) { + location.getLock().lock(); + try { + Set sameTypeOrganisms = getSameTypeOrganisms(organism, location); + + if (canReproduce(organism, sameTypeOrganisms)) { + OrganismDTO newOrganism = createOffspring(organism); + sameTypeOrganisms.add(newOrganism); + } + } finally { + location.getLock().unlock(); + } + } + + private Set getSameTypeOrganisms(OrganismDTO organism, Location location) { + return location.getResidents().getOrDefault(organism.getType(), Set.of()); + } + + private boolean canReproduce(OrganismDTO organism, Set sameTypeOrganisms) { + int currentPopulation = sameTypeOrganisms.size(); + return currentPopulation >= 2 && currentPopulation < organism.getMaxPopulation(); + } + + private OrganismDTO createOffspring(OrganismDTO parentOrganism) { + return OrganismDTO.builder() + .uuid(UUID.randomUUID()) + .type(parentOrganism.getType()) + .groupId(parentOrganism.getGroupId()) + .isAlive(true) + .currentWeight(parentOrganism.getCurrentWeight() * 0.5) + .icon(parentOrganism.getIcon()) + .ration(new HashMap<>(parentOrganism.getRation())) + .maxWeight(parentOrganism.getMaxWeight()) + .maxPopulation(parentOrganism.getMaxPopulation()) + .speed(parentOrganism.getSpeed()) + .build(); + } + +} diff --git a/island/src/main/java/org/island/services/AnimalMovementService.java b/island/src/main/java/org/island/services/AnimalMovementService.java new file mode 100644 index 0000000..c29bfcb --- /dev/null +++ b/island/src/main/java/org/island/services/AnimalMovementService.java @@ -0,0 +1,92 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Location; +import org.island.util.Randomizer; + +import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.logging.Logger; + +public class AnimalMovementService implements MovementService { + Logger log = Logger.getLogger(this.getClass().getName()); + + private List getAvailableDirections(Set visitedLocations, Location destination) { + return destination.getDirections().stream() + .filter(location -> !visitedLocations.contains(location)) + .toList(); + } + + private Location findDestinationLocation(int countOfSteps, Location location) { + Set visitedLocations = new HashSet<>(); + Location destination = location; + + while (countOfSteps > 0) { + visitedLocations.add(destination); + List directions = getAvailableDirections(visitedLocations, destination); + int countOfDirections = directions.size(); + + if (countOfDirections > 0) { + int selectedDirection = Randomizer.random(0, countOfDirections); + if (selectedDirection < directions.size()) { + destination = directions.get(selectedDirection); + countOfSteps--; + } + else { + break; + } + } + else { + break; + } + countOfSteps--; + } + + + return destination; + } + + public void move(OrganismDTO animal, Location currentLocation) { + int speed = animal.getSpeed(); + int countOfSteps = Randomizer.random(speed); + Location destination = findDestinationLocation(countOfSteps, currentLocation); + + if (moveTo(animal, destination)) { + remove(animal, currentLocation); + } + } + + private boolean moveTo(OrganismDTO animal, Location destination) { + Lock lock = destination.getLock(); + lock.lock(); + try { + String type = animal.getType(); + Map> residents = destination.getResidents(); + Set sameKindOrganisms = residents.computeIfAbsent(type, k -> new HashSet<>()); + + if (sameKindOrganisms.size() < animal.getMaxPopulation()) { + sameKindOrganisms.add(animal); + return true; + } + return false; + } finally { + lock.unlock(); + } + } + + private void remove(OrganismDTO animal, Location location) { + Lock lock = location.getLock(); + lock.lock(); + try { + Map> residents = location.getResidents(); + String type = animal.getType(); + Set sameKindOrganisms = residents.get(type); + + if (sameKindOrganisms != null && sameKindOrganisms.contains(animal)) { + sameKindOrganisms.remove(animal); + } + } finally { + lock.unlock(); + } + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/services/DeathService.java b/island/src/main/java/org/island/services/DeathService.java new file mode 100644 index 0000000..29d5d9b --- /dev/null +++ b/island/src/main/java/org/island/services/DeathService.java @@ -0,0 +1,9 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Island; +import org.island.model.Location; + +public interface DeathService { + void die(OrganismDTO organism, Location location); +} diff --git a/island/src/main/java/org/island/services/EatTaskService.java b/island/src/main/java/org/island/services/EatTaskService.java deleted file mode 100644 index dda0504..0000000 --- a/island/src/main/java/org/island/services/EatTaskService.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.island.services; - -import org.island.animals.Animal; -import org.island.entity.Organism; -import org.island.location.Location; - -public class EatTaskService extends TaskService { - - public EatTaskService(Organism organism, Location location) { - super(organism, location); - } - - @Override - public void run() { - if (organism instanceof Animal) { - Animal animal = (Animal) organism; - animal.eat(location); - } - } -} diff --git a/island/src/main/java/org/island/services/FeedAnimalService.java b/island/src/main/java/org/island/services/FeedAnimalService.java new file mode 100644 index 0000000..3e72fc4 --- /dev/null +++ b/island/src/main/java/org/island/services/FeedAnimalService.java @@ -0,0 +1,71 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.exceptions.OrganismNotFound; +import org.island.model.Location; +import org.island.model.Ration; +import org.island.model.Residents; +import org.island.util.Randomizer; + +import java.util.Comparator; +import java.util.Set; + +public class FeedAnimalService implements FeedingService{ + + + @Override + public void eat(OrganismDTO organism, Location location) { + location.getLock().lock(); + + try { + Ration ration = (Ration) organism.getRation(); + double currentWeight = organism.getCurrentWeight(); + double deltaWeight = organism.getMaxWeight() - currentWeight; + Residents residents = (Residents) location.getResidents(); + OrganismDTO prey = getTarget(ration, residents); + String preyType = prey.getType(); + + if (prey.isAlive()) { + int chanceToKill = ration.get(preyType); + int predatorTry = Randomizer.random(0, 100); + + if (predatorTry <= chanceToKill) { + prey.setAlive(false); + } else return; + } + + double currentTargetWeight = prey.getCurrentWeight(); + double predatorFinalWeight; + + if (deltaWeight > currentTargetWeight) { + predatorFinalWeight = currentWeight + currentTargetWeight; + prey.setCurrentWeight(0); + } else { + predatorFinalWeight = currentWeight + deltaWeight; + prey.setCurrentWeight(currentTargetWeight - deltaWeight); + } + + organism.setCurrentWeight(predatorFinalWeight); + } finally { + location.getLock().unlock(); + } + } + + private OrganismDTO getTarget(Ration ration, Residents residents) { + Set preys = residents + .entrySet() + .stream() + .filter(resident -> resident.getValue().size() > 0) + .filter(resident -> ration.containsKey(resident.getKey())) + .max(Comparator.comparingInt(resident -> ration.get(resident.getKey()))) + .orElseThrow(() -> new OrganismNotFound("target / prey not found")) + .getValue(); + + return preys + .stream() + .skip(Randomizer.random(0, preys.size())) + .iterator() + .next(); + + } +} diff --git a/island/src/main/java/org/island/services/FeedingService.java b/island/src/main/java/org/island/services/FeedingService.java new file mode 100644 index 0000000..092b907 --- /dev/null +++ b/island/src/main/java/org/island/services/FeedingService.java @@ -0,0 +1,9 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Island; +import org.island.model.Location; + +public interface FeedingService { + void eat(OrganismDTO organismDTO, Location location); +} diff --git a/island/src/main/java/org/island/services/HungryTaskService.java b/island/src/main/java/org/island/services/HungryTaskService.java deleted file mode 100644 index 95e417d..0000000 --- a/island/src/main/java/org/island/services/HungryTaskService.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.island.services; - -import org.island.animals.Animal; -import org.island.entity.Organism; -import org.island.location.Location; -import org.island.settings.Config; -import org.island.util.Fullness; - -public class HungryTaskService extends TaskService { - - private static final double WELL_FED = 0.75; //TODO need different logic - private static final double ALL_RIGHT = WELL_FED - 0.2; - public static final double HUNGRY = ALL_RIGHT - 0.4; - - public HungryTaskService(Organism organism, Location location) { - super(organism, location); - } - - @Override - public void run() { - double currentWeight = organism.getCurrentWeight(); - double maxWeight = organism.getMaxWeight(); - Config config = Config.getConfig(); - double weightNextDay = currentWeight - maxWeight * config.getWeightDecreaseFactor(); - double weightRatio = weightNextDay / maxWeight; - - if (organism instanceof Animal) { - Animal animal = (Animal) organism; - Fullness fullness = animal.getFullness(); - - if (weightRatio >= WELL_FED && fullness != Fullness.WELL_FED) { - animal.setFullness(Fullness.WELL_FED); - } else if (weightRatio >= ALL_RIGHT && weightRatio < WELL_FED && fullness != Fullness.ALL_RIGHT) { - animal.setFullness(Fullness.ALL_RIGHT); - } else if (weightRatio >= HUNGRY && weightRatio < ALL_RIGHT && fullness != Fullness.HUNGRY) { - animal.setFullness(Fullness.HUNGRY); - } else if (weightRatio < HUNGRY && fullness != Fullness.WILL_BE_FINE) { - animal.setFullness(Fullness.WILL_BE_FINE); - } - } - - double deathThreshold = config.getDeathThreshold(); - if (weightRatio < deathThreshold) { - organism.killOrganism(location); - } else { - organism.setCurrentWeight(weightNextDay); - } - } -} diff --git a/island/src/main/java/org/island/services/KillTaskService.java b/island/src/main/java/org/island/services/KillTaskService.java deleted file mode 100644 index 65bd9ee..0000000 --- a/island/src/main/java/org/island/services/KillTaskService.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.island.services; - -import org.island.entity.Organism; -import org.island.location.Location; - -public class KillTaskService extends TaskService { - - public KillTaskService(Organism organism, Location location) { - super(organism, location); - } - - @Override - public void run() { - if (organism.isAlive()) { - organism.getDead(); - } - } -} diff --git a/island/src/main/java/org/island/services/MapCreatorService.java b/island/src/main/java/org/island/services/MapCreatorService.java new file mode 100644 index 0000000..b206687 --- /dev/null +++ b/island/src/main/java/org/island/services/MapCreatorService.java @@ -0,0 +1,99 @@ +package org.island.services; + + +import org.island.entity.EOrganisms; +import org.island.entity.OrganismDTO; +import org.island.factory.OrganismFactory; +import org.island.model.Island; +import org.island.model.Location; +import org.island.settings.Config; +import org.island.util.Randomizer; + +import java.util.*; + +public class MapCreatorService { + + private final OrganismFactory organismFactory; + private int rows; + private int columns; + + public MapCreatorService(OrganismFactory factory) { + this.organismFactory = factory; + } + +// public Island(Config config) { + +// this.GRID = new Location[rows][columns]; +// initializeGrid(rows, columns); +// } + + public Island createIsland(Config config) { + Island island = new Island(); + initializeGrid(island, config); + populateIsland(island); + findLocationNeighbors(island); + return island; + } + + private void initializeGrid(Island island, Config config) { + rows = config.getIslandSimulationConfig().getIslandSize().getRows(); + columns = config.getIslandSimulationConfig().getIslandSize().getColumns(); + island.setGRID(new Location[rows][columns]); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + island.getGRID()[i][j] = new Location(i, j); + } + } + } + + + private void populateIsland(Island island) { + Location[][] grid = island.getGRID(); + + for (Location[] row : grid) { + for (Location location : row) { + for (EOrganisms organismType : EOrganisms.values()) { + OrganismDTO prototype = OrganismFactory.createOrganism(organismType); + int maxCount = prototype.getMaxPopulation(); + System.out.println(maxCount); + int count = Randomizer.random(0, maxCount); + + for (int i = 0; i < count; i++) { + location.addResident(OrganismFactory.createOrganism(organismType)); + } + } +// logLocationContent(location);// Метод проверки количества каждого вида на клетке + } + } + } + + private void logLocationContent(Location location) { + StringBuilder log = new StringBuilder(); + log.append("Location (").append(location.getRow()).append(", ").append(location.getColumn()).append("): "); + for (Map.Entry> entry : location.getResidents().entrySet()) { + log.append(entry.getKey()).append(" - ").append(entry.getValue().size()).append("; "); + } + System.out.println(log.toString()); + } + + private void findLocationNeighbors(Island island) { + Location[][] grid = island.getGRID(); + for (int row = 0; row < grid.length; row++) { + for (int col = 0; col < grid[row].length; col++) { + Location location = grid[row][col]; + List neighbours = findNeighbors(row, col, grid); + location.setDirections(neighbours); + } + } + } + + private List findNeighbors(int row, int col, Location[][] grid) { + List result = new ArrayList<>(); + if (row > 0) result.add(grid[row - 1][col]); + if (col > 0) result.add(grid[row][col - 1]); + if (row < rows - 1) result.add(grid[row + 1][col]); + if (col < columns - 1) result.add(grid[row][col + 1]); + + return result; + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/services/MatingService.java b/island/src/main/java/org/island/services/MatingService.java new file mode 100644 index 0000000..216e7e4 --- /dev/null +++ b/island/src/main/java/org/island/services/MatingService.java @@ -0,0 +1,11 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Island; +import org.island.model.Location; + +public interface MatingService { +// void findMate(OrganismDTO organismDTO, Island island); + + void findMate(OrganismDTO organismDTO, Location location); +} diff --git a/island/src/main/java/org/island/services/MoveTaskService.java b/island/src/main/java/org/island/services/MoveTaskService.java deleted file mode 100644 index 55da14b..0000000 --- a/island/src/main/java/org/island/services/MoveTaskService.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.island.services; - -import org.island.animals.Animal; -import org.island.entity.Organism; -import org.island.location.Location; - -public class MoveTaskService extends TaskService { - - public MoveTaskService(Organism organism, Location location) { - super(organism, location); - } - - @Override - public void run() { - if (organism instanceof Animal) { - Animal animal = (Animal) organism; - int speed = animal.getSpeed(); - - if (speed > 0) { - animal.move(location); - } - } - } -} diff --git a/island/src/main/java/org/island/services/MovementService.java b/island/src/main/java/org/island/services/MovementService.java new file mode 100644 index 0000000..2b951ba --- /dev/null +++ b/island/src/main/java/org/island/services/MovementService.java @@ -0,0 +1,9 @@ +package org.island.services; + +import org.island.entity.OrganismDTO; +import org.island.model.Island; +import org.island.model.Location; + +public interface MovementService { + void move(OrganismDTO organism, Location location); +} diff --git a/island/src/main/java/org/island/services/OrganismWorkerService.java b/island/src/main/java/org/island/services/OrganismWorkerService.java deleted file mode 100644 index 4de4417..0000000 --- a/island/src/main/java/org/island/services/OrganismWorkerService.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.island.services; - -import org.island.animals.Animal; -import org.island.entity.Organism; -import org.island.exceptions.OrganismOperationFail; -import org.island.location.Island; -import org.island.location.Location; -import org.island.repo.maps.Ration; -import org.island.repo.maps.Residents; - -import java.util.Objects; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.CountDownLatch; - -public class OrganismWorkerService implements Runnable { - private final Organism organism; - private final Island island; - private final Queue tasks = new ConcurrentLinkedQueue<>(); - private final Queue hungryTasks = new ConcurrentLinkedQueue<>(); - private final CountDownLatch latch; - - public OrganismWorkerService(Organism organism, Island island, CountDownLatch latch) { - this.organism = organism; - this.island = island; - this.latch = latch; - } - - @Override - public void run() { - Location[][] grid = island.getIslandGrid(); - for (Location[] row : grid) { - for (Location location : row) { - try { - processOneLocation(location); - } catch (Exception e) { - throw new OrganismOperationFail("Problem operation with creature - " + this.organism, e); - } - } - } - } - - private void processOneLocation(Location location) { - String type = organism.getType(); - Residents residents = location.getResidents(); - Set organisms = residents.get(type); - - if (Objects.nonNull(organisms)) { - location.getLock().lock(); - try { - for (Organism organism : organisms) { - TaskService task = chooseAction(organism, location, residents); - tasks.add(task); - TaskService hungry = new HungryTaskService(organism, location); - hungryTasks.add(hungry); - } - } finally { - location.getLock().unlock(); - } - tasks.forEach(TaskService::run); - tasks.clear(); - latch.countDown(); - - hungryTasks.forEach(TaskService::run); - hungryTasks.clear(); - latch.countDown(); - } - } - - private TaskService chooseAction(Organism organism, Location location, Residents residents) { - TaskService task = null; - - if (organism instanceof Animal) { - Animal animal = (Animal) organism; - task = switch (organism.getFullness()) { - case WELL_FED -> new ReproduceTaskService(organism, location); - case ALL_RIGHT -> new MoveTaskService(organism, location); - case HUNGRY -> { - Ration myRation = organism.getRation(); - boolean haveFoodHere = animal.findSomeFood(myRation, residents); - yield haveFoodHere ? new EatTaskService(organism, location) : new MoveTaskService(organism, location); - } - case WILL_BE_FINE -> new KillTaskService(organism, location); - }; - } else { - task = new ReproduceTaskService(organism, location); - } - return task; - } - -} diff --git a/island/src/main/java/org/island/services/ReproduceTaskService.java b/island/src/main/java/org/island/services/ReproduceTaskService.java deleted file mode 100644 index 12b1317..0000000 --- a/island/src/main/java/org/island/services/ReproduceTaskService.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.island.services; - -import org.island.entity.Organism; -import org.island.location.Location; - -public class ReproduceTaskService extends TaskService { - - public ReproduceTaskService(Organism organism, Location location) { - super(organism, location); - } - - @Override - public void run() { - organism.reproduce(location); - } -} diff --git a/island/src/main/java/org/island/services/SimulationWorkerService.java b/island/src/main/java/org/island/services/SimulationWorkerService.java deleted file mode 100644 index 9cc9c99..0000000 --- a/island/src/main/java/org/island/services/SimulationWorkerService.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.island.services; - -import org.island.entity.Organism; -import org.island.entity.Simulation; -import org.island.settings.Config; -import org.island.view.View; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.*; -import java.util.stream.Collectors; - -public class SimulationWorkerService extends Thread { - private final Simulation simulation; - private final int period; - - public SimulationWorkerService(Simulation simulation) { - this.simulation = simulation; - this.period = Config.getConfig().getPeriod(); - } - - @Override - public void run() { - View view = simulation.getView(); - view.showMap(); - view.showStatistics(); - ScheduledExecutorService mainPool = Executors.newScheduledThreadPool(1); - Map prototypes = simulation.getEntityFactory().getPrototypes(); - CountDownLatch latch = new CountDownLatch(prototypes.size()); - - List workers = prototypes - .values() - .stream() - .map(organism -> new OrganismWorkerService(organism, simulation.getIsland(), latch)) - .collect(Collectors.toList()); - - mainPool.scheduleWithFixedDelay(() -> { - ExecutorService servicPool = Executors.newFixedThreadPool(4); - workers.forEach(servicPool::submit); - servicPool.shutdown(); - await(view, servicPool); - - }, period, period, TimeUnit.MILLISECONDS); - } - - private void await(View view, ExecutorService servicePool) { - try { - if (servicePool.awaitTermination(3, TimeUnit.SECONDS)) { - view.showMap(); - view.showStatistics(); - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - -} diff --git a/island/src/main/java/org/island/services/TaskService.java b/island/src/main/java/org/island/services/TaskService.java deleted file mode 100644 index 88a809a..0000000 --- a/island/src/main/java/org/island/services/TaskService.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.island.services; - -import lombok.RequiredArgsConstructor; -import org.island.entity.Organism; -import org.island.location.Location; - -@RequiredArgsConstructor -public abstract class TaskService implements Runnable { - protected final Organism organism; - protected final Location location; - - public abstract void run(); -} diff --git a/island/src/main/java/org/island/services/ViewMapService.java b/island/src/main/java/org/island/services/ViewMapService.java new file mode 100644 index 0000000..764261c --- /dev/null +++ b/island/src/main/java/org/island/services/ViewMapService.java @@ -0,0 +1,104 @@ +package org.island.services; + +import org.island.entity.EOrganisms; +import org.island.entity.OrganismDTO; +import org.island.factory.OrganismFactory; +import org.island.model.Island; +import org.island.model.Location; +import org.island.settings.Config; + +import java.util.*; +import java.util.stream.Collectors; + +public class ViewMapService { + + private static final int HEIGHT_DIAGRAM = 10; + private static final int POPULATION_HIGH = 90; + private static final int POPULATION_AVERAGE = 50; + + private final OrganismFactory factory; + + public ViewMapService(OrganismFactory factory) { + this.factory = factory; + } + + public void showMap(Island island) { + StringBuilder out = new StringBuilder("\n"); + Location[][] grid = island.getGRID(); + List organisms = createOrganismPrototypes(); + Map currentPopulation = countOrganisms(organisms, grid); + drawPopulationDiagram(out, organisms, currentPopulation); + drawIcons(out, organisms); + System.out.println(out); + } + + private List createOrganismPrototypes() { + return Arrays.stream(EOrganisms.values()) + .map(OrganismFactory::createOrganism) + .collect(Collectors.toList()); + } + + private void drawPopulationDiagram(StringBuilder out, List organisms, Map currentPopulation) { + for (int row = 0; row < HEIGHT_DIAGRAM; row++) { + int percent = 100 - row * 10; + out.append(String.format("%-3d %%|", percent)); + + for (OrganismDTO organism : organisms) { + String residentString = getPopulationFill(row, organism, currentPopulation); + out.append(residentString); + } + + + out.append(Color.RESET).append("\n"); + } + } + + private void drawIcons(StringBuilder out, List organisms) { + out.append(" ".repeat(5)); + organisms.forEach(organism -> out.append(organism.getIcon()).append(" ")); + out.append("\n"); + } + + private Map countOrganisms(List organisms, Location[][] grid) { + Map result = new EnumMap<>(EOrganisms.class); + for (Location[] row : grid) { + for (Location location : row) { + location.getResidents().values().stream() + .flatMap(Set::stream) + .map(OrganismDTO::getOrganismType) + .forEach(type -> result.merge(type, 1, Integer::sum)); + } + } + return result; + } + + private String getPopulationFill(int row, OrganismDTO organism, Map currentPopulation) { + Config config = Config.initialize(); + int totalCells = config.getIslandSimulationConfig().getIslandSize().getRows() * + config.getIslandSimulationConfig().getIslandSize().getColumns(); + int maxCount = organism.getMaxPopulation() * totalCells; + int currentCount = currentPopulation.getOrDefault(organism.getOrganismType(), 0); + double ratioPercent = 100.0 * currentCount / maxCount; + double currentPercent = 100.0 - row * 10; + return ratioPercent >= currentPercent + ? chooseColorBasedOnPopulation(ratioPercent) + " " + : Color.RESET + " "; + } + + private String chooseColorBasedOnPopulation(double ratioPercent) { + if (ratioPercent >= POPULATION_HIGH) { + return Color.FILL_GREEN; + } else if (ratioPercent >= POPULATION_AVERAGE) { + return Color.FILL_YELLOW; + } else { + return Color.FILL_RED; + } + } + + private static class Color { + public static final String RESET = "\u001B[0m"; + public static final String FILL_GREEN = "\u001B[42m"; + public static final String FILL_YELLOW = "\u001B[43m"; + public static final String FILL_RED = "\u001B[41m"; + } +} diff --git a/island/src/main/java/org/island/services/ViewStatisticsService.java b/island/src/main/java/org/island/services/ViewStatisticsService.java new file mode 100644 index 0000000..1079377 --- /dev/null +++ b/island/src/main/java/org/island/services/ViewStatisticsService.java @@ -0,0 +1,72 @@ +package org.island.services; + +import org.island.entity.EOrganisms; +import org.island.entity.OrganismDTO; +import org.island.model.Island; +import org.island.model.Location; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +public class ViewStatisticsService { + + public void showStatistics(Island island, int day) { + Map statsPredators = new HashMap<>(); + Map statsGrassEaters = new HashMap<>(); + Map statsPlants = new HashMap<>(); + + Location[][] grid = island.getGRID(); + for (Location[] row : grid) { + for (Location location : row) { + Map> residents = location.getResidents(); + if (Objects.nonNull(residents)) { + residents.values().stream() + .filter(set -> set.size() > 0) + .forEach(set -> { + OrganismDTO organism = set.stream().findAny().get(); + EOrganisms organismType = organism.getOrganismType(); + String name = organismType.getType(); + String icon = Objects.nonNull(organism.getIcon()) ? organism.getIcon() : ""; + String info = icon + name; + + if (organismType.isAnimal()) { + if (organismType.getGroupId() <= 4) { + statsPredators.put(info, statsPredators.getOrDefault(info, 0) + set.size()); + } + else { + statsGrassEaters.put(info, statsGrassEaters.getOrDefault(info, 0) + set.size()); + } + } + else { + statsPlants.put(info, statsPlants.getOrDefault(info, 0) + set.size()); + } + }); + } + } + } + + printStatistics(statsPredators, statsGrassEaters, statsPlants, day); + } + + private void printStatistics(Map statsPredators, Map statsGrassEaters, Map statsPlants, int day) { + StringBuilder out = new StringBuilder("\n"); + out.append(String.format("--------Island DAY %d--------%n", day)); + out.append("Predators:\n"); + out.append(mapToString(statsPredators)); + out.append("GrassEaters:\n"); + out.append(mapToString(statsGrassEaters)); + out.append("Plants:\n"); + out.append(mapToString(statsPlants)); + out.append("----------------------------"); + + System.out.println(out); + } + + private String mapToString(Map map) { + StringBuilder out = new StringBuilder(); + map.forEach((key, value) -> out.append(String.format("%19s - %d%n", key, value))); + return out.toString(); + } +} diff --git a/island/src/main/java/org/island/settings/Config.java b/island/src/main/java/org/island/settings/Config.java index b4ce0a7..073aa3f 100644 --- a/island/src/main/java/org/island/settings/Config.java +++ b/island/src/main/java/org/island/settings/Config.java @@ -1,117 +1,41 @@ package org.island.settings; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import org.island.entity.Group; -import org.island.repo.Limit; -import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; -import java.net.URL; -import java.util.Map; -import java.util.Objects; - -import org.island.repo.maps.FoodMap; -import org.island.repo.maps.Ration; - -import java.util.Map; +import java.io.InputStream; @Getter -@Setter(AccessLevel.PROTECTED) +@Setter public final class Config { public static final String SETTING_YAML = "new_master_config.yaml"; - private static volatile Config CONFIG; - - private int rows; - private int columns; - private int period; - private int[][] rationTable; - private Map limits; - private Map icons; - private FoodMap foodMap; - private double startWeightFactor; - private double weightDecreaseFactor; - private double deathThreshold; - - private Config() { - loadDefaultSetting(); - updateFromFile(); - } - - public static Config getConfig() { - Config result = CONFIG; - if (result != null) { - return result; - } - - synchronized (Config.class) { - if (CONFIG == null) { - CONFIG = new Config(); - } - } - return CONFIG; - } - public Limit getLimit(String type) { - return limits.get(type); - } - - public String getIcon(String type) { - return icons.get(type); - } + private IslandSimulationConfig islandSimulationConfig; + private OrganismParameters organismParameters; - public Ration getRation(String type) { - return foodMap.get(type); - } - - private FoodMap createFoodMap(int[][] rationTable) { - FoodMap foodMap = new FoodMap(); - Group[] groups = Group.values(); - int countGroups = groups.length; + private static Config instance; - for (int groupId = 0; groupId < countGroups; groupId++) { - Group group = groups[groupId]; - String type = group.getType(); - Ration ration = new Ration(); + private Config() {} - for (int targetGroupId = 0; targetGroupId < countGroups; targetGroupId++) { - Group targetGroup = groups[targetGroupId]; - String targetType = targetGroup.getType(); - int chanceToEat = rationTable[groupId][targetGroupId]; - if (chanceToEat > 0) { - ration.put(targetType, chanceToEat); - } - } - foodMap.put(type, ration); + public static synchronized Config initialize() { + if (instance == null) { + instance = loadConfig(); } - return foodMap; - } - - private void loadDefaultSetting() { - rows = Default.ROWS; - columns = Default.COLUMNS; - period = Default.PERIOD; - rationTable = Default.RATION_TABLE; - limits = Default.LIMITS; - icons = Default.ICONS; - startWeightFactor = Default.START_WEIGHT_FACTOR; - weightDecreaseFactor = Default.WEIGHT_DECREASE_FACTOR; - deathThreshold = Default.DEATH_THRESHOLD; - - foodMap = createFoodMap(rationTable); - + return instance; } @SneakyThrows - private void updateFromFile() { + private static Config loadConfig() { ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); - ObjectReader readerForUpdating = mapper.readerForUpdating(this); - URL resource = Config.class.getClassLoader().getResource(SETTING_YAML); - if (Objects.nonNull(resource)) { - readerForUpdating.readValue(resource.openStream()); + try (InputStream inputStream = Config.class.getClassLoader().getResourceAsStream(SETTING_YAML)) { + if (inputStream != null) { + return mapper.readValue(inputStream, Config.class); + } else { + throw new IllegalStateException("Could not find the YAML configuration file."); + } } } } diff --git a/island/src/main/java/org/island/settings/Default.java b/island/src/main/java/org/island/settings/Default.java deleted file mode 100644 index 43aacb9..0000000 --- a/island/src/main/java/org/island/settings/Default.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.island.settings; - -import org.island.repo.Limit; - -import java.util.Map; - -import static java.util.Map.entry; - -public final class Default { - - public static final int ROWS = 100; - public static final int COLUMNS = 20; - public static final int PERIOD = 500; //in milliseconds, period for one iteration - public static final double START_WEIGHT_FACTOR = 0.75; //maxWeight for newly created/born organism - public static final double WEIGHT_DECREASE_FACTOR = 0.02; // weight decreasing every iteration if organism not eat - public static final double DEATH_THRESHOLD = 0.1; // ratio of organism current weight to it's max weight, when reached organism kills / die - - private Default() { - } - - /* - int[K1][K2] = V ,where: - K1 - Creature groupId; - K2 - Target groupId; - V - chance to eat. - */ - - public static final int[][] RATION_TABLE = { - {0, 0, 0, 0, 0, 10, 15, 60, 80, 60, 70, 15, 10, 40, 0, 0}, - {0, 0, 15, 0, 0, 0, 0, 20, 40, 0, 0, 0, 0, 10, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 70, 90, 0, 0, 0, 0, 60, 40, 0}, - {0, 80, 0, 0, 0, 40, 80, 80, 90, 70, 70, 50, 20, 10, 0, 0}, - {0, 0, 10, 0, 0, 0, 0, 90, 90, 0, 0, 0, 0, 80, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 90, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - }; - - /* - Map LIMITS,where: - K - organism String type; - V - limits of this organism Limit(double maxWeight, int maxPopulation, int speed). - */ - //TODO: needs to simplify it, maybe through reflection API - public static final Map LIMITS = Map.ofEntries( - entry("Wolf", new Limit(50, 30, 3)), - entry("Python", new Limit(15, 30, 1)), - entry("Fox", new Limit(8, 30, 2)), - entry("Bear", new Limit(500, 5, 2)), - entry("Eagle", new Limit(6, 20, 3)), - entry("Horse", new Limit(400, 20, 4)), - entry("Deer", new Limit(300, 20, 4)), - entry("Rabbit", new Limit(2, 150, 2)), - entry("Mouse", new Limit(0.05, 500, 1)), - entry("Goat", new Limit(60, 140, 3)), - entry("Sheep", new Limit(70, 140, 3)), - entry("Boar", new Limit(400, 50, 2)), - entry("Buffalo", new Limit(700, 10, 3)), - entry("Duck", new Limit(1, 200, 4)), - entry("Caterpillar", new Limit(0.01, 1000, 0)), - entry("Herb", new Limit(10, 200, 0)) - ); - - /* - Map ICONS,where: - K - organism String type; - V - organism icon. - */ - public static final Map ICONS = Map.ofEntries( - entry("Wolf", "🐺"), - entry("Python", "🐍"), - entry("Fox", "🦊"), - entry("Bear", "🐻"), - entry("Eagle", "🦅"), - entry("Horse", "🐎"), - entry("Deer", "🦌"), - entry("Rabbit", "🐇"), - entry("Mouse", "🐁"), - entry("Goat", "🦌"), - entry("Sheep", "🐑"), - entry("Boar", "🐗"), - entry("Buffalo", "🐃"), - entry("Duck", "🦆"), - entry("Caterpillar", "🐛"), - entry("Herb", "☘") - ); - -} diff --git a/island/src/main/java/org/island/settings/IslandSimulationConfig.java b/island/src/main/java/org/island/settings/IslandSimulationConfig.java new file mode 100644 index 0000000..41dfb46 --- /dev/null +++ b/island/src/main/java/org/island/settings/IslandSimulationConfig.java @@ -0,0 +1,28 @@ +package org.island.settings; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public final class IslandSimulationConfig { + private IslandSize islandSize; + private SimulationParameters simulation; + + @Getter + @Setter + public static class IslandSize { + private int rows; + private int columns; + } + + @Getter + @Setter + public static class SimulationParameters { + private int period; + private double startWeightFactor; + private double weightDecreaseFactor; + private double deathThreshold; + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/settings/OrganismParameters.java b/island/src/main/java/org/island/settings/OrganismParameters.java new file mode 100644 index 0000000..fc1718e --- /dev/null +++ b/island/src/main/java/org/island/settings/OrganismParameters.java @@ -0,0 +1,23 @@ +package org.island.settings; + + +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public final class OrganismParameters { + private Map limits; + private Map icons; + private Map> foodMap; + + @Getter + @Setter + public static class AnimalParams { + private double maxWeight; + private int maxPopulation; + private int speed; + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/simulation/Simulation.java b/island/src/main/java/org/island/simulation/Simulation.java new file mode 100644 index 0000000..64eacb5 --- /dev/null +++ b/island/src/main/java/org/island/simulation/Simulation.java @@ -0,0 +1,121 @@ +package org.island.simulation; + +import lombok.RequiredArgsConstructor; +import org.island.entity.EOrganisms; +import org.island.entity.OrganismDTO; +import org.island.factory.OrganismFactory; +import org.island.model.Island; +import org.island.model.Location; +import org.island.services.DeathService; +import org.island.services.FeedingService; +import org.island.services.MatingService; +import org.island.services.MovementService; +import org.island.util.Randomizer; +import org.island.view.View; + +import java.util.*; + +@RequiredArgsConstructor +public class Simulation implements SimulationEngine { + private final View view; + private final Island island; + private final int period; + private final MovementService movementService; + private final MatingService matingService; + private final FeedingService feedingService; + private final DeathService deathService; + private final OrganismFactory organismFactory; + + public void populateIsland(Island island) { + Location[][] grid = island.getGRID(); + + for (Location[] locations : grid) { + for (Location location : locations) { + Map> residents = location.getResidents(); + + for (EOrganisms organismType : EOrganisms.values()) { + String type = organismType.getType(); + int maxCount = organismFactory.createOrganism(organismType).getMaxPopulation(); + int count = Randomizer.random(maxCount / 2, maxCount); + Set organismSet = new HashSet<>(); + + for (int i = 0; i < count; i++) { + // Создание нового экземпляра для каждого организма + organismSet.add(OrganismFactory.createOrganism(organismType)); + } + residents.put(type, organismSet); + } + } + } + } + + // TODO: Дописать сервисы + public void runCycle() { + Location[][] grid = island.getGRID(); + + for (int cycle = 0; cycle < period; cycle++) { + view.showMessage("Starting cycle " + (cycle + 1)); + + processLocations(grid); + updateView(); + + view.showMessage("Cycle " + (cycle + 1) + " completed"); + } + + view.showMessage("Simulation completed"); + } + + private void processLocations(Location[][] grid) { + for (Location[] locations : grid) { + for (Location location : locations) { + processLocation(location); + } + } + } + + private void processLocation(Location location) { + + moveOrganisms(location); + // feedOrganisms(location); + // handleDeaths(location); + // mateOrganisms(location); + } + + private void moveOrganisms(Location location) { + Map> residents = location.getResidents(); + List types = new ArrayList<>(residents.keySet()); + + types.forEach(type -> { + Set organisms = residents.get(type); + if (organisms != null) { + organisms.forEach(organism -> movementService.move(organism, location)); + } + }); + } + +// private void feedOrganisms(Location location) { +// feedingService.eat(location); +// } + +// private void mateOrganisms(Location location) { +// matingService.findMate(location); +// } + +// private void handleDeaths(Location location) { +// deathService.die(location); +// } + + private void updateView() { + view.showStatistics(); + view.showMap(); + } + + + public void run() { + view.showMessage("Initializing island population..."); + populateIsland(island); + + view.showMessage("Starting simulation..."); + runCycle(); + } +} \ No newline at end of file diff --git a/island/src/main/java/org/island/simulation/SimulationEngine.java b/island/src/main/java/org/island/simulation/SimulationEngine.java new file mode 100644 index 0000000..4255a59 --- /dev/null +++ b/island/src/main/java/org/island/simulation/SimulationEngine.java @@ -0,0 +1,9 @@ +package org.island.simulation; + +import org.island.model.Island; + +public interface SimulationEngine { + void populateIsland(Island island); + void runCycle(); + void run(); +} \ No newline at end of file diff --git a/island/src/main/java/org/island/util/Fullness.java b/island/src/main/java/org/island/util/Fullness.java deleted file mode 100644 index 93c422b..0000000 --- a/island/src/main/java/org/island/util/Fullness.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.island.util; - -public enum Fullness { - WELL_FED, - ALL_RIGHT, - HUNGRY, - WILL_BE_FINE -} diff --git a/island/src/main/java/org/island/util/Randomizer.java b/island/src/main/java/org/island/util/Randomizer.java index 7c8df5b..924d759 100644 --- a/island/src/main/java/org/island/util/Randomizer.java +++ b/island/src/main/java/org/island/util/Randomizer.java @@ -1,17 +1,20 @@ package org.island.util; +import java.util.Random; import java.util.concurrent.ThreadLocalRandom; public class Randomizer { + private static final Random RANDOM = new Random(); + private Randomizer(){} public static int random(int maxValue){ return ThreadLocalRandom.current().nextInt(maxValue + 1); } - public static int random(int minValue, int maxValue){ - return ThreadLocalRandom.current().nextInt(minValue, maxValue); + public static int random(int min, int max) { + return RANDOM.nextInt(max - min + 1) + min; } } diff --git a/island/src/main/java/org/island/view/ConsoleView.java b/island/src/main/java/org/island/view/ConsoleView.java index 3cf6b2f..4c825bc 100644 --- a/island/src/main/java/org/island/view/ConsoleView.java +++ b/island/src/main/java/org/island/view/ConsoleView.java @@ -1,186 +1,38 @@ package org.island.view; -import org.island.animals.GrassEater; -import org.island.animals.Predator; -import org.island.entity.Organism; -import org.island.location.Island; -import org.island.location.Location; -import org.island.repo.factory.Factory; -import org.island.repo.maps.Residents; -import org.island.settings.Config; - -import java.util.*; +import lombok.RequiredArgsConstructor; +import org.island.factory.OrganismFactory; +import org.island.model.Island; +import org.island.services.ViewMapService; +import org.island.services.ViewStatisticsService; +@RequiredArgsConstructor public class ConsoleView implements View { - - public static final int HEIGHT_DIAGRAM = 10; - public static final int POPULATION_HIGH = 70; // int between 40 - 100 - public static final int POPULATION_AVERAGE = POPULATION_HIGH - 40; - private final Island island; - private final Factory factory; + private final OrganismFactory factory; + private final ViewStatisticsService viewStatisticsService; + private final ViewMapService viewMapService; private int day = 0; - public ConsoleView(Island island, Factory factory) { + public ConsoleView(Island island, OrganismFactory factory) { this.island = island; this.factory = factory; + this.viewStatisticsService = new ViewStatisticsService(); + this.viewMapService = new ViewMapService(factory); } @Override public void showStatistics() { - Map statsPredators = new HashMap<>(); - Map statsGrassEaters = new HashMap<>(); - Map statsPlants = new HashMap<>(); - - Location[][] grid = island.getGrid(); - - for (Location[] row : grid) { - for (Location location : row) { - var residents = location.getResidents(); - if (Objects.nonNull(residents)) { - residents.values().stream() - .filter(set -> set.size() > 0) - .forEach(set -> { - Organism organism = set.stream().findAny().get(); - String name = organism.getClass().getSimpleName(); - String icon = organism.getIcon(); - String info = icon + name; - - if (organism instanceof Predator) { - statsPredators.put(info, statsPredators.getOrDefault(info, 0) + set.size()); - } else if (organism instanceof GrassEater) { - statsGrassEaters.put(info, statsGrassEaters.getOrDefault(info, 0) + set.size()); - } else { - statsPlants.put(info, statsPlants.getOrDefault(info, 0) + set.size()); - } - }); - } - } - } - - printStatistics(statsPredators, statsGrassEaters, statsPlants); + viewStatisticsService.showStatistics(island, day++); } @Override public void showMap() { - StringBuilder out = new StringBuilder("\n"); - Map prototypes = factory.getPrototypes(); - List organisms = new ArrayList<>(prototypes.values()); - Location[][] grid = island.getGrid(); - int organismsCount = organisms.size(); - Map currentPopulation = countOrganisms(organisms, grid); - drawDiagram(out, organisms, organismsCount, currentPopulation); - out.append(" ".repeat(5)).append("|"); - drawIcons(out, organisms); - System.out.println(out); - } - - @SuppressWarnings("StringBufferReplaceableByString") - private void printStatistics(Map statsPredators, Map statsGrassEaters, Map statsPlants) { - StringBuilder out = new StringBuilder("\n"); - out.append(String.format("--------Island DAY %d--------%n", day++)); - out.append("Predators:\n"); - out.append(MapToString(statsPredators)); - out.append("GrassEaters:\n"); - out.append(MapToString(statsGrassEaters)); - out.append("Plants:\n"); - out.append(MapToString(statsPlants)); - out.append("----------------------------"); - - System.out.println(out); - } - - private String MapToString(Map map) { - StringBuilder out = new StringBuilder(); - map.forEach((key, value) -> out.append(String.format("%19s - %d%n", key, value))); - return out.toString(); - } - - private void drawDiagram(StringBuilder out, List organisms, int organismsCount, Map currentPopulation) { - for (int row = 0; row < HEIGHT_DIAGRAM; row++) { - int percent = 100; - out.append(row == 0 - ? String.format("%-3s %%|", percent) - : String.format(" %-2s %%|", percent - row * 10) - ); - - for (int col = 0; col < organismsCount; col++) { - String residentString = fill(row, col, currentPopulation, organisms); - int LocationWidth = 5; - out.append(String.format("%-" + LocationWidth + "s", residentString)); - } - - out.append("\n"); - } + viewMapService.showMap(island); } - private void drawIcons(StringBuilder out, List organisms) { - List skipList = List.of(3, 7, 10); // icons with different width, so will be offset in this position - - for (int i = 0; i < organisms.size(); i++) { - String icon = organisms.get(i).getIcon(); - out.append(icon); - if (!skipList.contains(i)) { - out.append(" "); - } - } - } - - private Map countOrganisms(List organisms, Location[][] grid) { - Map result = new HashMap<>(); - for (Location[] row : grid) { - for (Location location : row) { - Residents residents = location.getResidents(); - if (Objects.nonNull(residents)) { - organisms.forEach(organism -> { - String type = organism.getType(); - result.put(type, result.getOrDefault(type, 0) + residents.get(type).size()); - }); - } - } - } - return result; - } - - private String fill(int row, int col, Map currentPopulation, List organisms) { - Organism organism = organisms.get(col); - String type = organism.getType(); - Config config = Config.getConfig(); - int mapRow = config.getRows(); - int mapCol = config.getColumns(); - int maxCount = organism.getMaxPopulation() * mapRow * mapCol; - int currentCount = currentPopulation.get(type); - double ratioPercent = 100.0 * currentCount / maxCount; - double currentPercent = 100.0 - row * 10; - - String filler = choseFiller(ratioPercent, currentPercent); - return "." + filler + Color.RESET + "."; - } - - private String choseFiller(double ratioPercent, double currentPercent) { - String filler = "."; - String color = Color.RESET; - - if (currentPercent <= ratioPercent) { - if (ratioPercent >= POPULATION_HIGH) { - color = Color.FILL_GREEN; - } else if (ratioPercent >= POPULATION_AVERAGE) { - color = Color.FILL_YELLOW; - } else { - color = Color.FILL_RED; - } - filler = " "; - } - - return color + filler; - } - - private static class Color{ - public static final String RESET = "\u001B[0m"; - public static final String FILL_GREEN = "\u001B[42m"; - public static final String FILL_YELLOW = "\u001B[43m"; - public static final String FILL_RED = "\u001B[41m"; + @Override + public void showMessage(String message) { + System.out.println(message); } - - -} +} \ No newline at end of file diff --git a/island/src/main/java/org/island/view/View.java b/island/src/main/java/org/island/view/View.java index aed297d..351eda9 100644 --- a/island/src/main/java/org/island/view/View.java +++ b/island/src/main/java/org/island/view/View.java @@ -3,4 +3,5 @@ public interface View { void showStatistics(); void showMap(); + void showMessage(String message); } diff --git a/island/src/main/resources/configuration/animals_initial_parameters_config.yaml b/island/src/main/resources/configuration/animals_initial_parameters_config.yaml deleted file mode 100644 index 09502a5..0000000 --- a/island/src/main/resources/configuration/animals_initial_parameters_config.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Initial parameters for Organism's like Animal and Plant -limits: - Wolf: - maxWeight: 50.0 - maxPopulation: 30 - speed: 3 - Python: - maxWeight: 15.0 - maxPopulation: 30 - speed: 1 - Fox: - maxWeight: 8.0 - maxPopulation: 30 - speed: 2 - Bear: - maxWeight: 500.0 - maxPopulation: 5 - speed: 2 - Eagle: - maxWeight: 6.0 - maxPopulation: 20 - speed: 3 - Horse: - maxWeight: 400.0 - maxPopulation: 20 - speed: 4 - Deer: - maxWeight: 300.0 - maxPopulation: 20 - speed: 4 - Rabbit: - maxWeight: 2.0 - maxPopulation: 150 - speed: 2 - Mouse: - maxWeight: 0.05 - maxPopulation: 500 - speed: 1 - Goat: - maxWeight: 60.0 - maxPopulation: 140 - speed: 3 - Sheep: - maxWeight: 70.0 - maxPopulation: 140 - speed: 3 - Boar: - maxWeight: 400.0 - maxPopulation: 50 - speed: 2 - Buffalo: - maxWeight: 700.0 - maxPopulation: 10 - speed: 3 - Duck: - maxWeight: 1.0 - maxPopulation: 200 - speed: 4 - Caterpillar: - maxWeight: 0.01 - maxPopulation: 1000 - speed: 0 - Plant: - maxWeight: 10.0 - maxPopulation: 200 - speed: 0 - - diff --git a/island/src/main/resources/configuration/eat_chances_config.yaml b/island/src/main/resources/configuration/eat_chances_config.yaml deleted file mode 100644 index 81e2e69..0000000 --- a/island/src/main/resources/configuration/eat_chances_config.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Chance of eating food -foodMap: - Wolf: - Horse: 10 - Deer: 15 - Rabbit: 60 - Mouse: 80 - Goat: 60 - Sheep: 70 - Boar: 15 - Buffalo: 10 - Duck: 40 - Python: - Fox: 15 - Rabbit: 20 - Mouse: 40 - Duck: 10 - Fox: - Rabbit: 70 - Mouse: 90 - Duck: 60 - Caterpillar: 40 - Bear: - Python: 80 - Horse: 40 - Deer: 80 - Rabbit: 80 - Mouse: 90 - Goat: 70 - Sheep: 70 - Boar: 50 - Buffalo: 20 - Eagle: - Fox: 10 - Rabbit: 90 - Mouse: 90 - Duck: 80 - Horse: - Plant: 100 - Deer: - Plant: 100 - Rabbit: - Plant: 100 - Mouse: - Caterpillar: 90 - Plant: 100 - Goat: - Plant: 100 - Sheep: - Plant: 100 - Boar: - Mouse: 50 - Caterpillar: 90 - Plant: 100 - Buffalo: - Plant: 100 - Duck: - Caterpillar: 90 - Plant: 100 - Caterpillar: - Plant: 100 - - - - - - - diff --git a/island/src/main/resources/configuration/icons_config.yaml b/island/src/main/resources/configuration/icons_config.yaml deleted file mode 100644 index 3f7593f..0000000 --- a/island/src/main/resources/configuration/icons_config.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Icons of animals for displaying stats on a screen after each iteration -icons: - Wolf: "🐺" - Python: "🐍" - Fox: "🦊" - Bear: "🐻" - Eagle: "🦅" - Horse: "🐎" - Deer: "🦌" - Rabbit: "🐇" - Mouse: "🐁" - Goat: "🦌" - Sheep: "🐑" - Boar: "🐗" - Buffalo: "🐃" - Duck: "🦆" - Caterpillar: "🐛" - Plant: "☘" \ No newline at end of file diff --git a/island/src/main/resources/configuration/island_config.yaml b/island/src/main/resources/configuration/island_config.yaml deleted file mode 100644 index e4b8abf..0000000 --- a/island/src/main/resources/configuration/island_config.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# Island parameters defined the location/area and iteration time (milliseconds) -rows: 100 -columns: 20 -period: 500 \ No newline at end of file diff --git a/island/src/main/resources/configuration/lifecycle_config.yaml b/island/src/main/resources/configuration/lifecycle_config.yaml deleted file mode 100644 index bc92b14..0000000 --- a/island/src/main/resources/configuration/lifecycle_config.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# Parameters of life cycle -startWeightFactor: 0.70 -weightDecreaseFactor: 0.03 -deathThreshold: 0.1 \ No newline at end of file diff --git a/island/src/main/resources/configuration/new_master_config.yaml b/island/src/main/resources/configuration/new_master_config.yaml deleted file mode 100644 index 6ad8ce4..0000000 --- a/island/src/main/resources/configuration/new_master_config.yaml +++ /dev/null @@ -1,159 +0,0 @@ ---- -# Island size parameters -rows: 100 -columns: 20 -period: 500 - -# Basic animal parameters -limits: - Wolf: - maxWeight: 50.0 - maxPopulation: 30 - speed: 3 - Python: - maxWeight: 15.0 - maxPopulation: 30 - speed: 1 - Fox: - maxWeight: 8.0 - maxPopulation: 30 - speed: 2 - Bear: - maxWeight: 500.0 - maxPopulation: 5 - speed: 2 - Eagle: - maxWeight: 6.0 - maxPopulation: 20 - speed: 3 - Horse: - maxWeight: 400.0 - maxPopulation: 20 - speed: 4 - Deer: - maxWeight: 300.0 - maxPopulation: 20 - speed: 4 - Rabbit: - maxWeight: 2.0 - maxPopulation: 150 - speed: 2 - Mouse: - maxWeight: 0.05 - maxPopulation: 500 - speed: 1 - Goat: - maxWeight: 60.0 - maxPopulation: 140 - speed: 3 - Sheep: - maxWeight: 70.0 - maxPopulation: 140 - speed: 3 - Boar: - maxWeight: 400.0 - maxPopulation: 50 - speed: 2 - Buffalo: - maxWeight: 700.0 - maxPopulation: 10 - speed: 3 - Duck: - maxWeight: 1.0 - maxPopulation: 200 - speed: 4 - Caterpillar: - maxWeight: 0.01 - maxPopulation: 1000 - speed: 0 - Herb: - maxWeight: 10.0 - maxPopulation: 200 - speed: 0 - - -# Icons of animals -icons: - Wolf: "🐺" - Python: "🐍" - Fox: "🦊" - Bear: "🐻" - Eagle: "🦅" - Horse: "🐎" - Deer: "🦌" - Rabbit: "🐇" - Mouse: "🐁" - Goat: "🦌" - Sheep: "🐑" - Boar: "🐗" - Buffalo: "🐃" - Duck: "🦆" - Caterpillar: "🐛" - Herb: "☘" - -# Chance of eating food -foodMap: - Wolf: - Horse: 10 - Deer: 15 - Rabbit: 60 - Mouse: 80 - Goat: 60 - Sheep: 70 - Boar: 15 - Buffalo: 10 - Duck: 40 - Python: - Fox: 15 - Rabbit: 20 - Mouse: 40 - Duck: 10 - Fox: - Rabbit: 70 - Mouse: 90 - Duck: 60 - Caterpillar: 40 - Bear: - Python: 80 - Horse: 40 - Deer: 80 - Rabbit: 80 - Mouse: 90 - Goat: 70 - Sheep: 70 - Boar: 50 - Buffalo: 20 - Eagle: - Fox: 10 - Rabbit: 90 - Mouse: 90 - Duck: 80 - Horse: - Herb: 100 - Deer: - Herb: 100 - Rabbit: - Herb: 100 - Mouse: - Caterpillar: 90 - Herb: 100 - Goat: - Herb: 100 - Sheep: - Herb: 100 - Boar: - Mouse: 50 - Caterpillar: 90 - Herb: 100 - Buffalo: - Herb: 100 - Duck: - Caterpillar: 90 - Herb: 100 - Caterpillar: - Herb: 100 - -# Parameters of life cycle -startWeightFactor: 0.70 -weightDecreaseFactor: 0.03 -deathThreshold: 0.1 \ No newline at end of file diff --git a/island/src/main/resources/new_master_config.yaml b/island/src/main/resources/new_master_config.yaml new file mode 100644 index 0000000..f553564 --- /dev/null +++ b/island/src/main/resources/new_master_config.yaml @@ -0,0 +1,185 @@ +islandSimulationConfig: + islandSize: + rows: 100 + columns: 20 + simulation: + period: 50 + startWeightFactor: 0.70 + weightDecreaseFactor: 0.03 + deathThreshold: 0.1 + +organismParameters: + limits: + Wolf: + maxWeight: 50.0 + maxPopulation: 30 + speed: 3 + + Python: + maxWeight: 15.0 + maxPopulation: 30 + speed: 1 + + Fox: + maxWeight: 8.0 + maxPopulation: 30 + speed: 2 + + Bear: + maxWeight: 500.0 + maxPopulation: 5 + speed: 2 + + Eagle: + maxWeight: 6.0 + maxPopulation: 20 + speed: 3 + + Horse: + maxWeight: 400.0 + maxPopulation: 20 + speed: 4 + + Deer: + maxWeight: 300.0 + maxPopulation: 20 + speed: 4 + + Rabbit: + maxWeight: 2.0 + maxPopulation: 150 + speed: 2 + + Mouse: + maxWeight: 0.05 + maxPopulation: 500 + speed: 1 + + Goat: + maxWeight: 60.0 + maxPopulation: 140 + speed: 3 + + Sheep: + maxWeight: 70.0 + maxPopulation: 140 + speed: 3 + + Boar: + maxWeight: 400.0 + maxPopulation: 50 + speed: 2 + + Buffalo: + maxWeight: 700.0 + maxPopulation: 10 + speed: 3 + + Duck: + maxWeight: 1.0 + maxPopulation: 200 + speed: 4 + + Caterpillar: + maxWeight: 0.01 + maxPopulation: 1000 + speed: 0 + + Herb: + maxWeight: 0.01 + maxPopulation: 1000 + speed: 0 + + icons: + Wolf: "🐺" + Python: "🐍" + Fox: "🦊" + Bear: "🐻" + Eagle: "🦅" + Horse: "🐎" + Deer: "🦌" + Rabbit: "🐇" + Mouse: "🐁" + Goat: "🦌" + Sheep: "🐑" + Boar: "🐗" + Buffalo: "🐃" + Duck: "🦆" + Caterpillar: "🐛" + Herb: "🌿" + + foodMap: + Wolf: + Horse: 10 + Deer: 15 + Rabbit: 60 + Mouse: 80 + Goat: 60 + Sheep: 70 + Boar: 15 + Buffalo: 10 + Duck: 40 + + Python: + Fox: 15 + Rabbit: 20 + Mouse: 40 + Duck: 10 + + Fox: + Rabbit: 70 + Mouse: 90 + Duck: 60 + Caterpillar: 40 + + Bear: + Python: 80 + Horse: 40 + Deer: 80 + Rabbit: 80 + Mouse: 90 + Goat: 70 + Sheep: 70 + Boar: 50 + Buffalo: 20 + + Eagle: + Fox: 10 + Rabbit: 90 + Mouse: 90 + Duck: 80 + + Horse: + Herb: 100 + + Deer: + Herb: 100 + + Rabbit: + Herb: 100 + + Mouse: + Caterpillar: 90 + Herb: 100 + + Goat: + Herb: 100 + + Sheep: + Herb: 100 + + Boar: + Mouse: 50 + Caterpillar: 90 + Herb: 100 + + Buffalo: + Herb: 100 + + Duck: + Caterpillar: 90 + Herb: 100 + + Caterpillar: + Herb: 100 +