From e1396d53e6c084c666a980e0c56a42869f575efb Mon Sep 17 00:00:00 2001 From: jkbstepien Date: Sun, 18 Dec 2022 14:15:40 +0100 Subject: [PATCH 01/25] Added: Utils, Plant, Animal + Genes demo --- .../java/org/example/SimulationEngine.java | 4 + .../org/example/map/AbstractWorldMap.java | 8 ++ src/main/java/org/example/map/MapBuilder.java | 5 ++ .../example/map/MapPreferencesToObjects.java | 4 + src/main/java/org/example/map/WorldMap1.java | 4 + src/main/java/org/example/map/WorldMap2.java | 5 ++ .../java/org/example/map/objects/Animal.java | 54 ++++++++++++ .../java/org/example/map/objects/Genes.java | 80 ++++++++++++++++++ .../example/map/objects/GenesFullRandom.java | 8 ++ .../map/objects/GenesSlightCorrection.java | 8 ++ .../java/org/example/map/objects/Plant.java | 15 ++++ .../org/example/map/options/IMapElement.java | 8 ++ .../org/example/map/options/IMutation.java | 7 ++ src/main/java/org/example/utils/Gene.java | 26 ++++++ .../java/org/example/utils/MapDirection.java | 82 +++++++++++++++++++ .../org/example/utils/MutationOption.java | 6 ++ src/main/java/org/example/utils/Vector2d.java | 62 ++++++++++++++ 17 files changed, 386 insertions(+) create mode 100644 src/main/java/org/example/SimulationEngine.java create mode 100644 src/main/java/org/example/map/AbstractWorldMap.java create mode 100644 src/main/java/org/example/map/MapBuilder.java create mode 100644 src/main/java/org/example/map/MapPreferencesToObjects.java create mode 100644 src/main/java/org/example/map/WorldMap1.java create mode 100644 src/main/java/org/example/map/WorldMap2.java create mode 100644 src/main/java/org/example/map/objects/Animal.java create mode 100644 src/main/java/org/example/map/objects/Genes.java create mode 100644 src/main/java/org/example/map/objects/GenesFullRandom.java create mode 100644 src/main/java/org/example/map/objects/GenesSlightCorrection.java create mode 100644 src/main/java/org/example/map/objects/Plant.java create mode 100644 src/main/java/org/example/map/options/IMapElement.java create mode 100644 src/main/java/org/example/map/options/IMutation.java create mode 100644 src/main/java/org/example/utils/Gene.java create mode 100644 src/main/java/org/example/utils/MapDirection.java create mode 100644 src/main/java/org/example/utils/MutationOption.java create mode 100644 src/main/java/org/example/utils/Vector2d.java diff --git a/src/main/java/org/example/SimulationEngine.java b/src/main/java/org/example/SimulationEngine.java new file mode 100644 index 0000000..5e02558 --- /dev/null +++ b/src/main/java/org/example/SimulationEngine.java @@ -0,0 +1,4 @@ +package org.example; + +public class SimulationEngine { +} diff --git a/src/main/java/org/example/map/AbstractWorldMap.java b/src/main/java/org/example/map/AbstractWorldMap.java new file mode 100644 index 0000000..027f0bf --- /dev/null +++ b/src/main/java/org/example/map/AbstractWorldMap.java @@ -0,0 +1,8 @@ +package org.example.map; + +public class AbstractWorldMap { + + public void AbstractWorldMap() { + + } +} diff --git a/src/main/java/org/example/map/MapBuilder.java b/src/main/java/org/example/map/MapBuilder.java new file mode 100644 index 0000000..9f14ebf --- /dev/null +++ b/src/main/java/org/example/map/MapBuilder.java @@ -0,0 +1,5 @@ +package org.example.map; + +public class MapBuilder { + +} diff --git a/src/main/java/org/example/map/MapPreferencesToObjects.java b/src/main/java/org/example/map/MapPreferencesToObjects.java new file mode 100644 index 0000000..bf28be1 --- /dev/null +++ b/src/main/java/org/example/map/MapPreferencesToObjects.java @@ -0,0 +1,4 @@ +package org.example.map; + +public class MapPreferencesToObjects { +} diff --git a/src/main/java/org/example/map/WorldMap1.java b/src/main/java/org/example/map/WorldMap1.java new file mode 100644 index 0000000..c3030d1 --- /dev/null +++ b/src/main/java/org/example/map/WorldMap1.java @@ -0,0 +1,4 @@ +package org.example.map; + +public class WorldMap1 extends AbstractWorldMap { +} diff --git a/src/main/java/org/example/map/WorldMap2.java b/src/main/java/org/example/map/WorldMap2.java new file mode 100644 index 0000000..15fdcc1 --- /dev/null +++ b/src/main/java/org/example/map/WorldMap2.java @@ -0,0 +1,5 @@ +package org.example.map; + +public class WorldMap2 extends AbstractWorldMap { + +} diff --git a/src/main/java/org/example/map/objects/Animal.java b/src/main/java/org/example/map/objects/Animal.java new file mode 100644 index 0000000..1902f31 --- /dev/null +++ b/src/main/java/org/example/map/objects/Animal.java @@ -0,0 +1,54 @@ +package org.example.map.objects; + +import org.example.map.options.IMapElement; +import org.example.utils.MapDirection; +import org.example.utils.MutationOption; +import org.example.utils.Vector2d; + +public class Animal implements IMapElement { + private Vector2d position; + private MapDirection direction; + private Genes genotype; // TODO: correction variant + private int numberOfMutations; + private MutationOption mutationOption; + private int energy; + + public Animal(Vector2d position, int energy, int numberOfMutations, MutationOption mutationOption) { + // Basic parameters. + this.position = position; + this.direction = MapDirection.NORTH.randomDirection(); + this.energy = energy; + + // Obtaining genotype basing on mutation type. + this.numberOfMutations = numberOfMutations; + this.mutationOption = mutationOption; + this.genotype = new Genes(this.numberOfMutations, this.mutationOption); + } + + @Override + public String toString() { + return switch (this.direction) { + case NORTH -> "↑"; + case EAST -> "→"; + case SOUTH -> "↓"; + case WEST -> "←"; + case NORTHEAST -> "↗"; + case NORTHWEST -> "↖"; + case SOUTHEAST -> "↘"; + case SOUTHWEST -> "↙"; + } + "\t" + energy; + } + + @Override + public Vector2d getPosition() { + return position; + } + + public MapDirection getDirection() { + return direction; + } + + public int getEnergy() { + return energy; + } +} diff --git a/src/main/java/org/example/map/objects/Genes.java b/src/main/java/org/example/map/objects/Genes.java new file mode 100644 index 0000000..46f5d60 --- /dev/null +++ b/src/main/java/org/example/map/objects/Genes.java @@ -0,0 +1,80 @@ +package org.example.map.objects; + +import org.example.map.options.IMutation; +import org.example.utils.MutationOption; + +import java.util.*; + +public abstract class Genes { + + private final Random randomGenerator; + private final List genotype; + + private List randomGenotype(){ + List newGenotype = new ArrayList<>(); + for (int i = 0; i < 32; i++) { + genotype.add(randomGenerator.nextInt(8)); + } + return newGenotype; + } + + private List inheritedGenotype(Genes father, Genes mother, int percentageFatherEnergy, int percentageMotherEnergy){ + boolean chooseSide = randomGenerator.nextInt(100) < 50; + List newGenotype = new ArrayList<>(); + + if (chooseSide) { + for (int x = 0; x < percentageFatherEnergy; x++) newGenotype.add(father.getGenotype().get(x)); + for (int y = percentageFatherEnergy; y < 32; y++) newGenotype.add(mother.getGenotype().get(y)); + } else { + for (int x = 0; x < percentageMotherEnergy; x++) newGenotype.add(mother.getGenotype().get(x)); + for (int y = percentageMotherEnergy; y < 32; y++) newGenotype.add(father.getGenotype().get(y)); + } + mutate(); + return newGenotype; + } + + + public Genes(Random randomGenerator){ + // Constructor creates genotypes for first animals ever placed on map + genotype = randomGenotype(); + Collections.sort(genotype); + mutate(); + } + + + public Genes(Random randomGenerator, Genes father, Genes mother, int percentageFatherEnergy, int percentageMotherEnergy) { + // Constructor creates genotypes for descendants of first animals. + this(randomGenerator); + genotype = inheritedGenotype(father, mother, percentageFatherEnergy, percentageMotherEnergy); + mutate(); + } + + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + this.genotype.forEach(stringBuilder::append); + return stringBuilder.toString(); + } + + public int getRandomGene() { + return genotype.get(randomGenerator.nextInt(32)); + } + + @Override + public int hashCode() { + return Objects.hash(genotype); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Genes genome = (Genes) o; + return genotype.equals(genome.genotype); + } + + public List getGenotype(){ + return genotype; + } + + protected abstract void mutate(); +} diff --git a/src/main/java/org/example/map/objects/GenesFullRandom.java b/src/main/java/org/example/map/objects/GenesFullRandom.java new file mode 100644 index 0000000..fd163d9 --- /dev/null +++ b/src/main/java/org/example/map/objects/GenesFullRandom.java @@ -0,0 +1,8 @@ +package org.example.map.objects; + +public class GenesFullRandom extends Genes{ + @Override + protected void mutate() { + + } +} diff --git a/src/main/java/org/example/map/objects/GenesSlightCorrection.java b/src/main/java/org/example/map/objects/GenesSlightCorrection.java new file mode 100644 index 0000000..baa8dcb --- /dev/null +++ b/src/main/java/org/example/map/objects/GenesSlightCorrection.java @@ -0,0 +1,8 @@ +package org.example.map.objects; + +public class GenesSlightCorrection extends Genes{ + @Override + protected void mutate() { + + } +} diff --git a/src/main/java/org/example/map/objects/Plant.java b/src/main/java/org/example/map/objects/Plant.java new file mode 100644 index 0000000..a560809 --- /dev/null +++ b/src/main/java/org/example/map/objects/Plant.java @@ -0,0 +1,15 @@ +package org.example.map.objects; + +import org.example.utils.Vector2d; + +public class Plant { + private final Vector2d plantPosition; + + public Plant(Vector2d plantPosition) { + this.plantPosition = plantPosition; + } + + public Vector2d getPosition() { + return this.plantPosition; + } +} diff --git a/src/main/java/org/example/map/options/IMapElement.java b/src/main/java/org/example/map/options/IMapElement.java new file mode 100644 index 0000000..10a994b --- /dev/null +++ b/src/main/java/org/example/map/options/IMapElement.java @@ -0,0 +1,8 @@ +package org.example.map.options; + +import org.example.utils.Vector2d; + +public interface IMapElement { + public Vector2d getPosition(); + public String toString(); +} diff --git a/src/main/java/org/example/map/options/IMutation.java b/src/main/java/org/example/map/options/IMutation.java new file mode 100644 index 0000000..427f440 --- /dev/null +++ b/src/main/java/org/example/map/options/IMutation.java @@ -0,0 +1,7 @@ +package org.example.map.options; + +public interface IMutation { + + public void mutate(); + +} diff --git a/src/main/java/org/example/utils/Gene.java b/src/main/java/org/example/utils/Gene.java new file mode 100644 index 0000000..a6e9049 --- /dev/null +++ b/src/main/java/org/example/utils/Gene.java @@ -0,0 +1,26 @@ +package org.example.utils; + +import java.util.Random; + +public class Gene { + private final int number; + private final Random randomGenerator; + + public Gene(Random randomGenerator){ + this.randomGenerator = randomGenerator; + + public Gene(Random randomGenerator, int number){ + this(randomGenerator); + this.number = number; + } + + public static Gene next(Gene gene){ + int nextNumber = (gene.getNumber() + 1) % 7; + return this(randomGenerator, nextNumber) + } + + public int getNumber(){ + return number; + } + +} diff --git a/src/main/java/org/example/utils/MapDirection.java b/src/main/java/org/example/utils/MapDirection.java new file mode 100644 index 0000000..47f888d --- /dev/null +++ b/src/main/java/org/example/utils/MapDirection.java @@ -0,0 +1,82 @@ +package org.example.utils; + +import java.util.Random; + +public enum MapDirection { + NORTH, + SOUTH, + EAST, + WEST, + NORTHEAST, + NORTHWEST, + SOUTHEAST, + SOUTHWEST; + + public String toString() { + return switch(this) { + case NORTH -> "north"; + case SOUTH -> "south"; + case EAST -> "east"; + case WEST -> "west"; + case NORTHEAST -> "north-east"; + case NORTHWEST -> "north-west"; + case SOUTHEAST -> "south-east"; + case SOUTHWEST -> "south-west"; + }; + } + + public Vector2d toUnitVector(){ + return switch (this) { + case NORTH -> new Vector2d(0,1); + case SOUTH -> new Vector2d(0,-1); + case EAST -> new Vector2d(1,0); + case WEST -> new Vector2d(-1,0); + case NORTHEAST -> new Vector2d(1,1); + case NORTHWEST -> new Vector2d(-1,1); + case SOUTHEAST -> new Vector2d(1,-1); + case SOUTHWEST -> new Vector2d(-1,-1); + }; + } + + public MapDirection randomDirection(){ + Random random = new Random(); + return switch (random.nextInt(8)){ + case 0 -> MapDirection.NORTH; + case 1 -> MapDirection.NORTHEAST; + case 2 -> MapDirection.EAST; + case 3 -> MapDirection.SOUTHEAST; + case 4 -> MapDirection.SOUTH; + case 5 -> MapDirection.SOUTHWEST; + case 6 -> MapDirection.WEST; + case 7 -> MapDirection.NORTHWEST; + + default -> throw new IllegalStateException("Unexpected value: " + random.nextInt(8)); + }; + } + + public MapDirection previous(){ + return switch (this) { + case NORTH -> NORTHWEST; + case SOUTH -> SOUTHEAST; + case EAST -> NORTHEAST; + case WEST -> SOUTHWEST; + case NORTHWEST -> WEST; + case NORTHEAST -> NORTH; + case SOUTHWEST -> SOUTH; + case SOUTHEAST -> EAST; + }; + } + + public MapDirection next(){ + return switch (this) { + case NORTH -> NORTHEAST; + case SOUTH -> SOUTHWEST; + case EAST -> SOUTHEAST; + case WEST -> NORTHWEST; + case NORTHWEST -> NORTH; + case NORTHEAST -> EAST; + case SOUTHWEST -> WEST; + case SOUTHEAST -> SOUTH; + }; + } +} diff --git a/src/main/java/org/example/utils/MutationOption.java b/src/main/java/org/example/utils/MutationOption.java new file mode 100644 index 0000000..07fef1b --- /dev/null +++ b/src/main/java/org/example/utils/MutationOption.java @@ -0,0 +1,6 @@ +package org.example.utils; + +public enum MutationOption { + RANDOM, + SLIGHT_CORRECTION, +} diff --git a/src/main/java/org/example/utils/Vector2d.java b/src/main/java/org/example/utils/Vector2d.java new file mode 100644 index 0000000..56426a3 --- /dev/null +++ b/src/main/java/org/example/utils/Vector2d.java @@ -0,0 +1,62 @@ +package org.example.utils; + +import java.util.Objects; + +public class Vector2d { + + public int x; + public int y; + + public Vector2d(int x, int y) { + this.x = x; + this.y = y; + } + + public String toString() { + return "(" + this.x + "," + this.y + ")"; + } + + public boolean precedes(Vector2d other) { + return this.x <= other.x && this.y <= other.y; + } + + public boolean follows(Vector2d other) { + return this.x >= other.x & this.y >= other.y; + } + + public Vector2d upperRight(Vector2d other) { + return new Vector2d(Math.max(this.x, other.x), Math.max(this.y, other.y)); + } + + public Vector2d lowerLeft(Vector2d other) { + return new Vector2d(Math.min(this.x, other.x), Math.min(this.y, other.y)); + } + + public Vector2d add(Vector2d other) { + return new Vector2d(this.x + other.x, this.y + other.y); + } + + public Vector2d subtract(Vector2d other) { + return new Vector2d(this.x - other.x, this.y - other.y); + } + + public Vector2d opposite() { + return new Vector2d(-this.x, -this.y); + } + + @Override + public boolean equals(Object other) { + if (this == other) + return true; + if (other == null || getClass() != other.getClass()) + return false; + Vector2d that = (Vector2d) other; + + return this.x == that.x && this.y == that.y; + } + + @Override + public int hashCode() { + return Objects.hash(this.x, this.y); + } +} \ No newline at end of file From d25f1f20ac101fe6977280fe70777a0131e25a8e Mon Sep 17 00:00:00 2001 From: jkbstepien Date: Fri, 23 Dec 2022 16:46:53 +0100 Subject: [PATCH 02/25] Added: class structure + builder for WorldMap. --- src/main/java/org/example/Main.java | 14 ++ .../org/example/map/AbstractWorldMap.java | 8 -- src/main/java/org/example/map/MapBuilder.java | 135 ++++++++++++++++++ .../example/map/MapPreferencesToObjects.java | 4 - src/main/java/org/example/map/WorldMap.java | 51 +++++++ src/main/java/org/example/map/WorldMap1.java | 4 - src/main/java/org/example/map/WorldMap2.java | 5 - .../example/map/objects/GenesFullRandom.java | 8 -- .../map/objects/GenesSlightCorrection.java | 8 -- .../map/objects/{ => animal}/Animal.java | 20 ++- .../animal/behavior/AnimalBehaviorCrazy.java | 10 ++ .../AnimalBehaviorPredestination.java | 10 ++ .../animal/behavior/IAnimalBehavior.java | 10 ++ .../map/objects/{ => animal/genes}/Genes.java | 53 +++++-- .../objects/animal/genes/GenesFactory.java | 46 ++++++ .../objects/animal/genes/GenesFullRandom.java | 20 +++ .../animal/genes/GenesSlightCorrection.java | 20 +++ .../example/map/objects/plants/IPlants.java | 8 ++ .../map/objects/{ => plants}/Plant.java | 2 +- .../map/objects/plants/PlantsEquator.java | 7 + .../objects/plants/PlantsToxicCorpses.java | 7 + .../java/org/example/map/options/IEdge.java | 7 + .../org/example/map/options/IMutation.java | 7 - src/main/java/org/example/utils/Gene.java | 26 ---- 24 files changed, 396 insertions(+), 94 deletions(-) delete mode 100644 src/main/java/org/example/map/AbstractWorldMap.java delete mode 100644 src/main/java/org/example/map/MapPreferencesToObjects.java create mode 100644 src/main/java/org/example/map/WorldMap.java delete mode 100644 src/main/java/org/example/map/WorldMap1.java delete mode 100644 src/main/java/org/example/map/WorldMap2.java delete mode 100644 src/main/java/org/example/map/objects/GenesFullRandom.java delete mode 100644 src/main/java/org/example/map/objects/GenesSlightCorrection.java rename src/main/java/org/example/map/objects/{ => animal}/Animal.java (65%) create mode 100644 src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorCrazy.java create mode 100644 src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorPredestination.java create mode 100644 src/main/java/org/example/map/objects/animal/behavior/IAnimalBehavior.java rename src/main/java/org/example/map/objects/{ => animal/genes}/Genes.java (57%) create mode 100644 src/main/java/org/example/map/objects/animal/genes/GenesFactory.java create mode 100644 src/main/java/org/example/map/objects/animal/genes/GenesFullRandom.java create mode 100644 src/main/java/org/example/map/objects/animal/genes/GenesSlightCorrection.java create mode 100644 src/main/java/org/example/map/objects/plants/IPlants.java rename src/main/java/org/example/map/objects/{ => plants}/Plant.java (87%) create mode 100644 src/main/java/org/example/map/objects/plants/PlantsEquator.java create mode 100644 src/main/java/org/example/map/objects/plants/PlantsToxicCorpses.java create mode 100644 src/main/java/org/example/map/options/IEdge.java delete mode 100644 src/main/java/org/example/map/options/IMutation.java delete mode 100644 src/main/java/org/example/utils/Gene.java diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java index 407f157..5c9a573 100644 --- a/src/main/java/org/example/Main.java +++ b/src/main/java/org/example/Main.java @@ -1,7 +1,21 @@ package org.example; +import org.example.map.MapBuilder; + public class Main { public static void main(String[] args) { System.out.println("Hello world!"); + +// Example +// WorldMap map = MapBuilder.builder() +// .setWidth(100) +// .setAnimalEnergy(100) +// .setAnimalBreedingCost(100) +// .build(); +// +// MapBuilder builder = new MapBuilder(); +// int w = getWidthFromFront(); +// builder.setWidth(w); + } } \ No newline at end of file diff --git a/src/main/java/org/example/map/AbstractWorldMap.java b/src/main/java/org/example/map/AbstractWorldMap.java deleted file mode 100644 index 027f0bf..0000000 --- a/src/main/java/org/example/map/AbstractWorldMap.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.map; - -public class AbstractWorldMap { - - public void AbstractWorldMap() { - - } -} diff --git a/src/main/java/org/example/map/MapBuilder.java b/src/main/java/org/example/map/MapBuilder.java index 9f14ebf..d502cf1 100644 --- a/src/main/java/org/example/map/MapBuilder.java +++ b/src/main/java/org/example/map/MapBuilder.java @@ -1,5 +1,140 @@ package org.example.map; +import org.example.map.objects.animal.genes.GenesFactory; +import org.example.map.options.IEdge; +import org.example.map.objects.plants.IPlants; + public class MapBuilder { + // Map parameters + private int width; + private int height; + private IEdge iEdge; + + // Plants parameters + private int numberOfPlantsAtStart; + private int plantEnergy; + private int plantsSeededEachDay; + private IPlants iPlants; + + // Animals parameters + private int NumberOfAnimalsAtStart; + private int animalEnergy; + private int animalEnergyBreedingThreshold; + private int animalBreedingCost; + private int animalMinMutations; + private int animalMaxMutations; + private int genesLength; + private boolean isCrazyBehavior; + private boolean isFullRandom; + + public static MapBuilder builder() { + return new MapBuilder(); + } + + public MapBuilder withWidth(int width) { + this.width = width; + return this; + } + + public MapBuilder withHeight(int height) { + this.height = height; + return this; + } + + public MapBuilder withiEdge(IEdge iEdge) { + this.iEdge = iEdge; + return this; + } + + public MapBuilder withNumberOfPlantsAtStart(int numberOfPlantsAtStart) { + this.numberOfPlantsAtStart = numberOfPlantsAtStart; + return this; + } + + public MapBuilder withPlantEnergy(int plantEnergy) { + this.plantEnergy = plantEnergy; + return this; + } + + public MapBuilder withPlantsSeededEachDay(int plantsSeededEachDay) { + this.plantsSeededEachDay = plantsSeededEachDay; + return this; + } + + public MapBuilder withIPlants(IPlants iPlants) { + this.iPlants = iPlants; + return this; + } + + public MapBuilder withNumberOfAnimalsAtStart(int numberOfAnimalsAtStart) { + NumberOfAnimalsAtStart = numberOfAnimalsAtStart; + return this; + } + + public MapBuilder withAnimalEnergy(int animalEnergy) { + this.animalEnergy = animalEnergy; + return this; + } + + public MapBuilder withAnimalEnergyBreedingThreshold(int animalEnergyBreedingThreshold) { + this.animalEnergyBreedingThreshold = animalEnergyBreedingThreshold; + return this; + } + + public MapBuilder withAnimalBreedingCost(int animalBreedingCost) { + this.animalBreedingCost = animalBreedingCost; + return this; + } + + public MapBuilder withAnimalMinMutations(int animalMinMutations) { + this.animalMinMutations = animalMinMutations; + return this; + } + + public MapBuilder withAnimalMaxMutations(int animalMaxMutations) { + this.animalMaxMutations = animalMaxMutations; + return this; + } + + public MapBuilder withGenesLength(int genesLength) { + this.genesLength = genesLength; + return this; + } + + public MapBuilder withCrazyBehavior(boolean isCrazyBehavior) { + this.isCrazyBehavior = isCrazyBehavior; + return this; + } + + public MapBuilder withFullRandom(boolean isFullRandom) { + this.isFullRandom = isFullRandom; + return this; + } + + + public WorldMap build() { + // TODO: add other gene parameters to Factory. + GenesFactory genesFactory = new GenesFactory(isFullRandom, + isCrazyBehavior, + genesLength, + animalMinMutations, + animalMaxMutations); + + return new WorldMap(width, + height, + iEdge, + numberOfPlantsAtStart, + plantEnergy, + plantsSeededEachDay, + iPlants, + NumberOfAnimalsAtStart, + animalEnergy, + animalEnergyBreedingThreshold, + animalBreedingCost, + genesFactory + ); + } } + + diff --git a/src/main/java/org/example/map/MapPreferencesToObjects.java b/src/main/java/org/example/map/MapPreferencesToObjects.java deleted file mode 100644 index bf28be1..0000000 --- a/src/main/java/org/example/map/MapPreferencesToObjects.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.example.map; - -public class MapPreferencesToObjects { -} diff --git a/src/main/java/org/example/map/WorldMap.java b/src/main/java/org/example/map/WorldMap.java new file mode 100644 index 0000000..3aa3908 --- /dev/null +++ b/src/main/java/org/example/map/WorldMap.java @@ -0,0 +1,51 @@ +package org.example.map; + +import org.example.map.objects.animal.genes.GenesFactory; +import org.example.map.options.IEdge; +import org.example.map.objects.plants.IPlants; + +public class WorldMap { + // Map parameters + private final int width; + private final int height; + private final IEdge iEdge; + + // Plants parameters + private final int numberOfPlantsAtStart; + private final int plantEnergy; + private final int plantsSeededEachDay; + private final IPlants iPlants; + + // Animals parameters + private final int numberOfAnimalsAtStart; + private final int animalEnergy; + private final int animalEnergyBreedingThreshold; + private final int animalBreedingCost; + private final GenesFactory genesFactory; + + public WorldMap(int width, + int height, + IEdge iEdge, + int numberOfPlantsAtStart, + int plantEnergy, + int plantsSeededEachDay, + IPlants iPlants, + int numberOfAnimalsAtStart, + int animalEnergy, + int animalEnergyBreedingThreshold, + int animalBreedingCost, + GenesFactory genesFactory) { + this.width = width; + this.height = height; + this.iEdge = iEdge; + this.numberOfPlantsAtStart = numberOfPlantsAtStart; + this.plantEnergy = plantEnergy; + this.plantsSeededEachDay = plantsSeededEachDay; + this.iPlants = iPlants; + this.numberOfAnimalsAtStart = numberOfAnimalsAtStart; + this.animalEnergy = animalEnergy; + this.animalEnergyBreedingThreshold = animalEnergyBreedingThreshold; + this.animalBreedingCost = animalBreedingCost; + this.genesFactory = genesFactory; + } +} diff --git a/src/main/java/org/example/map/WorldMap1.java b/src/main/java/org/example/map/WorldMap1.java deleted file mode 100644 index c3030d1..0000000 --- a/src/main/java/org/example/map/WorldMap1.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.example.map; - -public class WorldMap1 extends AbstractWorldMap { -} diff --git a/src/main/java/org/example/map/WorldMap2.java b/src/main/java/org/example/map/WorldMap2.java deleted file mode 100644 index 15fdcc1..0000000 --- a/src/main/java/org/example/map/WorldMap2.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.example.map; - -public class WorldMap2 extends AbstractWorldMap { - -} diff --git a/src/main/java/org/example/map/objects/GenesFullRandom.java b/src/main/java/org/example/map/objects/GenesFullRandom.java deleted file mode 100644 index fd163d9..0000000 --- a/src/main/java/org/example/map/objects/GenesFullRandom.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.map.objects; - -public class GenesFullRandom extends Genes{ - @Override - protected void mutate() { - - } -} diff --git a/src/main/java/org/example/map/objects/GenesSlightCorrection.java b/src/main/java/org/example/map/objects/GenesSlightCorrection.java deleted file mode 100644 index baa8dcb..0000000 --- a/src/main/java/org/example/map/objects/GenesSlightCorrection.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.map.objects; - -public class GenesSlightCorrection extends Genes{ - @Override - protected void mutate() { - - } -} diff --git a/src/main/java/org/example/map/objects/Animal.java b/src/main/java/org/example/map/objects/animal/Animal.java similarity index 65% rename from src/main/java/org/example/map/objects/Animal.java rename to src/main/java/org/example/map/objects/animal/Animal.java index 1902f31..13ce4dd 100644 --- a/src/main/java/org/example/map/objects/Animal.java +++ b/src/main/java/org/example/map/objects/animal/Animal.java @@ -1,28 +1,22 @@ -package org.example.map.objects; +package org.example.map.objects.animal; +import org.example.map.objects.animal.genes.Genes; import org.example.map.options.IMapElement; import org.example.utils.MapDirection; -import org.example.utils.MutationOption; import org.example.utils.Vector2d; public class Animal implements IMapElement { private Vector2d position; private MapDirection direction; - private Genes genotype; // TODO: correction variant - private int numberOfMutations; - private MutationOption mutationOption; + private Genes genotype; private int energy; - public Animal(Vector2d position, int energy, int numberOfMutations, MutationOption mutationOption) { + public Animal(Vector2d position, int energy, Genes genotype) { // Basic parameters. this.position = position; this.direction = MapDirection.NORTH.randomDirection(); this.energy = energy; - - // Obtaining genotype basing on mutation type. - this.numberOfMutations = numberOfMutations; - this.mutationOption = mutationOption; - this.genotype = new Genes(this.numberOfMutations, this.mutationOption); + this.genotype = genotype; } @Override @@ -51,4 +45,8 @@ public MapDirection getDirection() { public int getEnergy() { return energy; } + + public Genes getGenotype() { + return genotype; + } } diff --git a/src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorCrazy.java b/src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorCrazy.java new file mode 100644 index 0000000..623efba --- /dev/null +++ b/src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorCrazy.java @@ -0,0 +1,10 @@ +package org.example.map.objects.animal.behavior; + +import java.util.List; + +public class AnimalBehaviorCrazy implements IAnimalBehavior { + @Override + public int getGene(List genes, int current) { + return 0; + } +} diff --git a/src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorPredestination.java b/src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorPredestination.java new file mode 100644 index 0000000..5ed8595 --- /dev/null +++ b/src/main/java/org/example/map/objects/animal/behavior/AnimalBehaviorPredestination.java @@ -0,0 +1,10 @@ +package org.example.map.objects.animal.behavior; + +import java.util.List; + +public class AnimalBehaviorPredestination implements IAnimalBehavior { + @Override + public int getGene(List genes, int current) { + return genes.get(current); + } +} diff --git a/src/main/java/org/example/map/objects/animal/behavior/IAnimalBehavior.java b/src/main/java/org/example/map/objects/animal/behavior/IAnimalBehavior.java new file mode 100644 index 0000000..981e18d --- /dev/null +++ b/src/main/java/org/example/map/objects/animal/behavior/IAnimalBehavior.java @@ -0,0 +1,10 @@ +package org.example.map.objects.animal.behavior; + +import java.util.List; + +public interface IAnimalBehavior { + // Deal with animal move variants: + // Full predestination or Crazy. + // Returns animal gene to use and does not change current gene. + int getGene(List genes, int current); +} diff --git a/src/main/java/org/example/map/objects/Genes.java b/src/main/java/org/example/map/objects/animal/genes/Genes.java similarity index 57% rename from src/main/java/org/example/map/objects/Genes.java rename to src/main/java/org/example/map/objects/animal/genes/Genes.java index 46f5d60..bda3789 100644 --- a/src/main/java/org/example/map/objects/Genes.java +++ b/src/main/java/org/example/map/objects/animal/genes/Genes.java @@ -1,14 +1,17 @@ -package org.example.map.objects; +package org.example.map.objects.animal.genes; -import org.example.map.options.IMutation; -import org.example.utils.MutationOption; +import org.example.map.objects.animal.Animal; +import org.example.map.objects.animal.behavior.IAnimalBehavior; import java.util.*; public abstract class Genes { - private final Random randomGenerator; - private final List genotype; + private final Random randomGenerator = new Random(); + private List genotype; + private int currentGene; + private final IAnimalBehavior makeMove; + private final int genesLength; private List randomGenotype(){ List newGenotype = new ArrayList<>(); @@ -34,19 +37,40 @@ private List inheritedGenotype(Genes father, Genes mother, int percenta } - public Genes(Random randomGenerator){ + public Genes(IAnimalBehavior makeMove, + int genesLength, + int minMutations, + int maxMutations) { // Constructor creates genotypes for first animals ever placed on map + this.makeMove = makeMove; + this.genesLength = genesLength; + genotype = randomGenotype(); Collections.sort(genotype); - mutate(); + + mutate(minMutations, maxMutations); } - public Genes(Random randomGenerator, Genes father, Genes mother, int percentageFatherEnergy, int percentageMotherEnergy) { + public Genes(IAnimalBehavior makeMove, + Animal father, + Animal mother, + int minMutations, + int maxMutations) { // Constructor creates genotypes for descendants of first animals. - this(randomGenerator); - genotype = inheritedGenotype(father, mother, percentageFatherEnergy, percentageMotherEnergy); - mutate(); + this.genesLength = father.getGenotype().getGenesLength(); + this.makeMove = makeMove; + + genotype = inheritedGenotype(father.getGenotype(), + mother.getGenotype(), + percentageFatherEnergy, + percentageMotherEnergy); + // TODO: calculate percentageFatherEnergy and percentageMotherEnergy + mutate(minMutations, maxMutations); + } + + private int getGenesLength() { + return genesLength; } public String toString() { @@ -59,6 +83,11 @@ public int getRandomGene() { return genotype.get(randomGenerator.nextInt(32)); } + public Integer getMoveDirection() { + // + currentGene++; + return makeMove.getGene(genotype, currentGene); + } @Override public int hashCode() { return Objects.hash(genotype); @@ -76,5 +105,5 @@ public List getGenotype(){ return genotype; } - protected abstract void mutate(); + protected abstract void mutate(int minMutations, int maxMutations); } diff --git a/src/main/java/org/example/map/objects/animal/genes/GenesFactory.java b/src/main/java/org/example/map/objects/animal/genes/GenesFactory.java new file mode 100644 index 0000000..5334955 --- /dev/null +++ b/src/main/java/org/example/map/objects/animal/genes/GenesFactory.java @@ -0,0 +1,46 @@ +package org.example.map.objects.animal.genes; + +import org.example.map.objects.animal.Animal; +import org.example.map.objects.animal.behavior.AnimalBehaviorCrazy; +import org.example.map.objects.animal.behavior.AnimalBehaviorPredestination; +import org.example.map.objects.animal.behavior.IAnimalBehavior; + +public class GenesFactory { + private boolean isFullRandom; + private IAnimalBehavior makeMove; + private int genesLength; + private int animalMinMutations; + private int animalMaxMutations; + + public GenesFactory(boolean isFullRandom, + boolean isCrazyBehavior, + int genesLength, + int animalMinMutations, + int animalMaxMutations) { + this.isFullRandom = isFullRandom; + if (isCrazyBehavior) { + makeMove = new AnimalBehaviorCrazy(); + } else { + makeMove = new AnimalBehaviorPredestination(); + } + this.genesLength = genesLength; + this.animalMinMutations = animalMinMutations; + this.animalMaxMutations = animalMaxMutations; + } + + public Genes createGenes() { + if (isFullRandom) { + return new GenesFullRandom(makeMove, genesLength, animalMinMutations, animalMaxMutations); + } else { + return new GenesSlightCorrection(makeMove, genesLength, animalMinMutations, animalMaxMutations); + } + } + + public Genes createGenes(Animal parent1, Animal parent2) { + if (isFullRandom) { + return new GenesFullRandom(makeMove, parent1, parent2, animalMinMutations, animalMaxMutations); + } else { + return new GenesSlightCorrection(makeMove, parent1, parent2, animalMinMutations, animalMaxMutations); + } + } +} diff --git a/src/main/java/org/example/map/objects/animal/genes/GenesFullRandom.java b/src/main/java/org/example/map/objects/animal/genes/GenesFullRandom.java new file mode 100644 index 0000000..17f3c25 --- /dev/null +++ b/src/main/java/org/example/map/objects/animal/genes/GenesFullRandom.java @@ -0,0 +1,20 @@ +package org.example.map.objects.animal.genes; + +import org.example.map.objects.animal.Animal; +import org.example.map.objects.animal.behavior.IAnimalBehavior; + +public class GenesFullRandom extends Genes{ + + public GenesFullRandom(IAnimalBehavior makeMove, int genesLength, int minMutations, int maxMutations) { + super(makeMove, genesLength, minMutations, maxMutations); + } + + public GenesFullRandom(IAnimalBehavior makeMove, Animal father, Animal mother, int percentageFatherEnergy, int percentageMotherEnergy) { + super(makeMove, father, mother, percentageFatherEnergy, percentageMotherEnergy); + } + + @Override + protected void mutate(int minMutations, int maxMutations) { + + } +} diff --git a/src/main/java/org/example/map/objects/animal/genes/GenesSlightCorrection.java b/src/main/java/org/example/map/objects/animal/genes/GenesSlightCorrection.java new file mode 100644 index 0000000..e8c23f7 --- /dev/null +++ b/src/main/java/org/example/map/objects/animal/genes/GenesSlightCorrection.java @@ -0,0 +1,20 @@ +package org.example.map.objects.animal.genes; + +import org.example.map.objects.animal.Animal; +import org.example.map.objects.animal.behavior.IAnimalBehavior; + +public class GenesSlightCorrection extends Genes{ + + public GenesSlightCorrection(IAnimalBehavior makeMove, int genesLength, int minMutations, int maxMutations) { + super(makeMove, genesLength, minMutations, maxMutations); + } + + public GenesSlightCorrection(IAnimalBehavior makeMove, Animal father, Animal mother, int percentageFatherEnergy, int percentageMotherEnergy) { + super(makeMove, father, mother, percentageFatherEnergy, percentageMotherEnergy); + } + + @Override + protected void mutate(int minMutations, int maxMutations) { + + } +} diff --git a/src/main/java/org/example/map/objects/plants/IPlants.java b/src/main/java/org/example/map/objects/plants/IPlants.java new file mode 100644 index 0000000..217ef42 --- /dev/null +++ b/src/main/java/org/example/map/objects/plants/IPlants.java @@ -0,0 +1,8 @@ +package org.example.map.objects.plants; + +public interface IPlants { + // Deals with plants seeding variants: + // Forested equators or toxic corpses. + // Returns position of new plant to grow on. + void grow(); +} diff --git a/src/main/java/org/example/map/objects/Plant.java b/src/main/java/org/example/map/objects/plants/Plant.java similarity index 87% rename from src/main/java/org/example/map/objects/Plant.java rename to src/main/java/org/example/map/objects/plants/Plant.java index a560809..f52a221 100644 --- a/src/main/java/org/example/map/objects/Plant.java +++ b/src/main/java/org/example/map/objects/plants/Plant.java @@ -1,4 +1,4 @@ -package org.example.map.objects; +package org.example.map.objects.plants; import org.example.utils.Vector2d; diff --git a/src/main/java/org/example/map/objects/plants/PlantsEquator.java b/src/main/java/org/example/map/objects/plants/PlantsEquator.java new file mode 100644 index 0000000..b87a094 --- /dev/null +++ b/src/main/java/org/example/map/objects/plants/PlantsEquator.java @@ -0,0 +1,7 @@ +package org.example.map.objects.plants; + +public class PlantsEquator implements IPlants { + @Override + public void grow() { + } +} diff --git a/src/main/java/org/example/map/objects/plants/PlantsToxicCorpses.java b/src/main/java/org/example/map/objects/plants/PlantsToxicCorpses.java new file mode 100644 index 0000000..9820238 --- /dev/null +++ b/src/main/java/org/example/map/objects/plants/PlantsToxicCorpses.java @@ -0,0 +1,7 @@ +package org.example.map.objects.plants; + +public class PlantsToxicCorpses implements IPlants { + @Override + public void grow() { + } +} diff --git a/src/main/java/org/example/map/options/IEdge.java b/src/main/java/org/example/map/options/IEdge.java new file mode 100644 index 0000000..0455ac6 --- /dev/null +++ b/src/main/java/org/example/map/options/IEdge.java @@ -0,0 +1,7 @@ +package org.example.map.options; + +public interface IEdge { + // Deal with map variants: Earth, HellPortal. + // Return animal position after move. + int handleEdge(); +} diff --git a/src/main/java/org/example/map/options/IMutation.java b/src/main/java/org/example/map/options/IMutation.java deleted file mode 100644 index 427f440..0000000 --- a/src/main/java/org/example/map/options/IMutation.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example.map.options; - -public interface IMutation { - - public void mutate(); - -} diff --git a/src/main/java/org/example/utils/Gene.java b/src/main/java/org/example/utils/Gene.java deleted file mode 100644 index a6e9049..0000000 --- a/src/main/java/org/example/utils/Gene.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.example.utils; - -import java.util.Random; - -public class Gene { - private final int number; - private final Random randomGenerator; - - public Gene(Random randomGenerator){ - this.randomGenerator = randomGenerator; - - public Gene(Random randomGenerator, int number){ - this(randomGenerator); - this.number = number; - } - - public static Gene next(Gene gene){ - int nextNumber = (gene.getNumber() + 1) % 7; - return this(randomGenerator, nextNumber) - } - - public int getNumber(){ - return number; - } - -} From faddf6bc27978663b8274d5d600a95e53e80a294 Mon Sep 17 00:00:00 2001 From: MagrosThornrime Date: Sat, 31 Dec 2022 08:57:28 +0100 Subject: [PATCH 03/25] implemented Genes + started implementing WorldMap --- .gradle/7.4/checksums/checksums.lock | Bin 0 -> 17 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../7.4/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/7.4/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/7.4/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/7.4/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/vcs-1/gc.properties | 0 .idea/compiler.xml | 6 + .idea/gradle.xml | 17 +++ .idea/jarRepositories.xml | 20 +++ .idea/misc.xml | 8 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++ .idea/vcs.xml | 6 + .idea/workspace.xml | 132 ++++++++++++++++++ src/main/java/org/example/map/MapBuilder.java | 2 + src/main/java/org/example/map/WorldMap.java | 56 +++++++- .../example/map/objects/animal/Animal.java | 3 + .../map/objects/animal/IAnimalObserver.java | 9 ++ .../animal/behavior/AnimalBehaviorCrazy.java | 12 +- .../AnimalBehaviorPredestination.java | 6 +- .../animal/behavior/IAnimalBehavior.java | 6 +- .../map/objects/animal/genes/GeneChoice.java | 25 ++++ .../map/objects/animal/genes/Genes.java | 96 ++++++++----- .../objects/animal/genes/GenesFactory.java | 49 +++++-- .../objects/animal/genes/GenesFullRandom.java | 23 ++- .../animal/genes/GenesSlightCorrection.java | 21 ++- .../example/map/objects/plants/ByDeaths.java | 26 ++++ .../map/objects/plants/IPlantObserver.java | 8 ++ .../example/map/objects/plants/IPlants.java | 4 +- .../map/objects/plants/PlantsEquator.java | 109 ++++++++++++++- .../objects/plants/PlantsToxicCorpses.java | 45 +++++- src/main/java/org/example/utils/Vector2d.java | 9 ++ 35 files changed, 746 insertions(+), 78 deletions(-) create mode 100644 .gradle/7.4/checksums/checksums.lock create mode 100644 .gradle/7.4/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/7.4/dependencies-accessors/gc.properties create mode 100644 .gradle/7.4/executionHistory/executionHistory.lock create mode 100644 .gradle/7.4/fileChanges/last-build.bin create mode 100644 .gradle/7.4/fileHashes/fileHashes.lock create mode 100644 .gradle/7.4/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 src/main/java/org/example/map/objects/animal/IAnimalObserver.java create mode 100644 src/main/java/org/example/map/objects/animal/genes/GeneChoice.java create mode 100644 src/main/java/org/example/map/objects/plants/ByDeaths.java create mode 100644 src/main/java/org/example/map/objects/plants/IPlantObserver.java diff --git a/.gradle/7.4/checksums/checksums.lock b/.gradle/7.4/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..38b6d4f6e721621297f3bab4977c4d13845c956c GIT binary patch literal 17 TcmZR6&-vAi<3ztN0~7!NF(L!g literal 0 HcmV?d00001 diff --git a/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..647920875c21b7c03cdd878991bf86c60b376036 GIT binary patch literal 17 TcmZQhU#HG53d_U=J3=qHw06UrloB#j- literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..29eda84 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sat Dec 24 20:53:23 CET 2022 +gradle.version=7.4 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..611e7c8 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e955f68 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..adf7fe9 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - { - "keyToString": { - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "WebServerToolWindowFactoryState": "false", - "last_opened_file_path": "/files/Intellij/IdeaProjects/EvolutionSimulator", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "reference.settingsdialog.project.gradle", - "vue.rearranger.settings.migration": "true" - } -} - - - - - - - - - - - - - - 1671638057512 - - - - - - - - - \ No newline at end of file From 5a4a5f99a3966149b4fafd4ba6ffc1176f8ba852 Mon Sep 17 00:00:00 2001 From: jkbstepien Date: Sun, 4 Jun 2023 10:21:56 +0200 Subject: [PATCH 25/25] cleanup --- .../java/main/org/example/gui/App.class | Bin 4502 -> 4415 bytes .../org/example/gui/NumberTextField$1.class | Bin 1005 -> 0 bytes .../org/example/gui/NumberTextField$2.class | Bin 1474 -> 0 bytes .../org/example/gui/NumberTextField$3.class | Bin 1586 -> 0 bytes .../org/example/gui/NumberTextField.class | Bin 3246 -> 0 bytes .../java/main/org/example/map/EdgeEarth.class | Bin 1208 -> 1044 bytes .../main/org/example/map/MapBuilder.class | Bin 3317 -> 0 bytes .../java/main/org/example/map/WorldMap.class | Bin 16342 -> 15388 bytes .../example/map/objects/animal/Animal.class | Bin 5625 -> 5511 bytes .../map/objects/animal/genes/GeneChoice.class | Bin 1244 -> 1244 bytes .../map/objects/animal/genes/Genes.class | Bin 5847 -> 5748 bytes .../animal/genes/GenesSlightCorrection.class | Bin 1427 -> 1427 bytes .../example/map/objects/plants/Plant.class | Bin 2025 -> 2025 bytes .../map/objects/plants/PlantsEquator.class | Bin 3604 -> 3721 bytes .../objects/plants/PlantsToxicCorpses.class | Bin 5661 -> 5661 bytes .../ByCorrespondingValuesComparator.class | Bin 1384 -> 0 bytes .../main/org/example/utils/GetFromFile.class | Bin 925 -> 925 bytes .../main/org/example/utils/MapDirection.class | Bin 4103 -> 3639 bytes .../org/example/utils/MutationOption.class | Bin 1086 -> 0 bytes .../main/org/example/utils/Preferences.class | Bin 5006 -> 5664 bytes .../main/org/example/utils/Vector2d.class | Bin 2765 -> 2411 bytes .../compileJava/previous-compilation-data.bin | Bin 36918 -> 36480 bytes .../java/org/example/gui/NumberTextField.java | 112 -------------- src/main/java/org/example/map/MapBuilder.java | 142 ------------------ .../java/org/example/utils/MapDirection.java | 26 ---- .../org/example/utils/MutationOption.java | 7 - 26 files changed, 287 deletions(-) delete mode 100644 build/classes/java/main/org/example/gui/NumberTextField$1.class delete mode 100644 build/classes/java/main/org/example/gui/NumberTextField$2.class delete mode 100644 build/classes/java/main/org/example/gui/NumberTextField$3.class delete mode 100644 build/classes/java/main/org/example/gui/NumberTextField.class delete mode 100644 build/classes/java/main/org/example/map/MapBuilder.class delete mode 100644 build/classes/java/main/org/example/utils/ByCorrespondingValuesComparator.class delete mode 100644 build/classes/java/main/org/example/utils/MutationOption.class delete mode 100644 src/main/java/org/example/gui/NumberTextField.java delete mode 100644 src/main/java/org/example/map/MapBuilder.java delete mode 100644 src/main/java/org/example/utils/MutationOption.java diff --git a/build/classes/java/main/org/example/gui/App.class b/build/classes/java/main/org/example/gui/App.class index b4dcd4c3f671ae10dcc596cb29aae6dddcb230ca..fa145824bdaa54cb0225b179197cc24af29bf05d 100644 GIT binary patch delta 555 zcmZ9H%TE(g6vlrueN1OMb{bZiXj4IAtQa+-(F9i}LJ_*rttO-Cf>2vy>yj9kzE(HE zn27j(1YcM|MFmtu1^xrq>|DDt#&1gE!p*(k{mwn#`JK^@xpr^q&&(`vkd;aAXUg=r zyUefD;mo?Djqud)V0h+Oc(PJ9^KQwEyB%hW*Ohth@q$T*mp;d7niJl_)+vj&-des< z%h!iapR0t8p;|R>1xa3eyy30GjL$pXH;d`GWzCwBziIcpN1Bg54|$YjEJ&~r8DD&E zFlONwtJU(^LzS>zFV`KuS#+8U>CU9Xl0{B3*Ie~~*zN=|;==DT%fZg`kYh6=@-E5C z;pproppW$w^&U{QpLUM0of4N-?IxjGlADaHE1->A+{V@)mpj~*r);ipRd=NBaUY8Z z(hhd$FydzIXa$)Uh0iB-BvdV!>)9RRaq<7-*&}bC+-@@L)$IM6b%1U3w0QcI>nbCn zi0OydqKGyu{G%u^$~6s)yokqE${Ke}S*g}8@rbcsW9$Jz{wD44Sb-C2vU$Q&-5d3O brkGbuOMPHY@N4R`)S`ZPs($4=%WU`ySvPI1 delta 642 zcmZ9H*=rL~6vlruO)|-3Ohze6#gx$2t)`8|DvHaC)EZ3#rQ)05D6vH2M4DJcC_cM^ zFi>A?-S@iGxK?ee)~$7W_b(89_E9}|C_c!Ad%pXfGvEBqM8jaCIsJQV9N5UWQS)cm zTN2sg{R*$Fozqis_8#bR4()LE6!Qi*G!ou$I1w_qrDR(u;T?_SYVT^;`<;F#U3A>u zbWf$P;P!eyBCWBi$wM9)Jhs@y6K}COwe*?Byv|axQc9K!2M-sWN}=Q?wRni+;UT)5mm@G%_IW32_?; z%iV!aCv(}#LNe0N%EUIB*iH*MPRc|(LFt7U=Dd8_M1%`m6eYQw;0;n`j0D5nER~$@p;@nvtlW)RdO7DF!(!|5BcU)a5k$kZPH*zgED+QK^gM{XjCGGA8O3Z+JJW-iw-+2~)Z=eC8{4e*q+jfx`d* diff --git a/build/classes/java/main/org/example/gui/NumberTextField$1.class b/build/classes/java/main/org/example/gui/NumberTextField$1.class deleted file mode 100644 index a6cfbe1ffb0718d610a42900dd79a86f91be13b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmaizT~E_c7{~u-8*5i8Oh6D65vjTtV5_cA;YZgot3|KanVKWpj`4xA4t~~d1?^5(*f*naE z<2pmORPI_>!K#6xjfYykw*b$uKIUO08fwrA!V!<#YCMSztTQ~;p1w?7aV1pjHu|v) zR8y}l%J-3tO>B|xAy)%mFzl8(_vvfpu7Pca?Kwe$I!$he3{GibA85VJk1%|mBXKbrqEQ|4NoqO#6|N!S-HsgvBeGf8iCL8%%|)%Sx)D({nshrz%` zS-0NSQ;`;!s$iapC_W7$8W_8+ln76J9z`O;b84pv>Ni-is7IKlI!n(ocIfm8t?H!6 zkhLn+?_iZ5Fuu|*gQxV)lLk1(F1>^n>?^z` Uo1-76gi3Oa%>V!Z diff --git a/build/classes/java/main/org/example/gui/NumberTextField$2.class b/build/classes/java/main/org/example/gui/NumberTextField$2.class deleted file mode 100644 index 03b99005387a81cbce44ae4f22a1c98d9a13f84c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474 zcma)6TT|0O6#lj?q=e9xi+C52s=WX~ypA9<*pUHk;Q^)(zHO7W1VhqEQbd1>|H2u? z86O;<{ZWo*lYoVZ(`II~yJx@s&bMdJ+24PD`~>gXx9Bf#^HjB#)!@<7g7ncZJ?}J`Zk;RAtRl_JWhQa|q;=0Y9w!YIk z5Jo^`tCnL0YYgd9xv3(Dyn=#;aZE6b|AW7DU0ZO6L2E^$CbzpH-1Sz)6fP;4)^J%m zndu{nVY0(LU#vUkhU*>jV9V)r1C`=%Rl_x0XHblNk|<1uMyW0}ygSxgqYRF^>vlauY*;cwrY_X=qRdK4rB{w&yT0YL8zR_u zO%0D^Nolf1H@Rcl!lM+*ZVNxybbTscZOfsIt=Zi7g^$}*L|HK004o&agFVcv0DhB)S(LrWN~ zu4(LcJ9XjiiDQ4u6jn34$}sA;O)tAb&XpnFr6l4=Xh`Z9gU*mX;78oBxZN_|*AGO) zCs^6EO@Eysn#w)4MPS^9S3eDRbA ztCNXIR-LZf5L>1!k;%RbWm%Rb)zTZgVL2Y1t{vgGou-bL^1{&N<*?1|rX^geq4=)w z{B6gh)26?*sbn`T?s>w)9G#^&sK~(5X?c^;@fkx!7XpB7Qpwd6d`b6v)^_jv6p{SkU%F-z^r?@VmQ3aL9 z8~A_;d{p2=vota4p0V;WzlQXmTw{PFx=luE4ufG8}hwsA(p-Mru ziW)p3a3Gyc>E^Prn6XVgmACZq{Nk*coidl*QOmTG0*^S}8-eclg0W=GE$g$U;pFs8 zHk~oE?rnWycEL=zSA*?91hoh&h^VN8D$unZC4s7x=?XMQdpsk$Z8)g_ctF7pevvTx zqT$Z#LssgdnXncOTbgQAu@g-M$Vq_R(T(~&(_z%3S;cO&2vlDmxi%rt;>%S4()kct zRkWdW^NqUFoe&;V(T&FiRO$R>!%5m^Hplct<>ww~3VJ0zB|3u2 zWQ@DX4AG_s=R{30@~))o3tcf))zj4K4_9%M^zldae>Do)8v zhgmzHcM(?VjEX1lq=2$y*m-k;AZ^hr0WT^`pkP3t^C2AWIu=1c&dIP@&8}$tA@T!$ zCNHQM#1M-|?{F+{(FR zLzdlMiqmg*uNeC9JR8$2N(J#gqv9GS1$Ow8qUgIobjxtpQ-@JLyNxJML@*_ztVLY1 zXGXLt9a;1w0G!VqZmdeoaQz5pBDHl36^?=?wGwsb;8 z5^U6(jFHW84RYa6r2w{kQ2E@Yr4;5BSSl8zUuBm3a0P1Jw689CZc9QgR?Ms-y4TBT z6&cy7><^nGcF?vJur#e+2;Km=DjghIPM8_VPU*X=B9A2oH5bgDba43s+`Sd%A`M#Ga<$}!x0mRUIOwem*luCL|U%?Imw_Gy@f@>9haiZigXqdB36(@C0Z zh+B^7i%%J|Hs3VG(+R_#HnNu72QRDLd5iO{^Px@6a(WyVxUfxH{!b{?(OA#4fQSj~ zi^jH^aZ+TL$Du(d>7NBLCzB^rYb<|l@>R>|$ULc@O0t-$a+!c>WRhdvnwImCbJkqu znNsG%dQuRue$q7(H^z)ikh92SI-gCLqn6BSbCBcWiGM`0i_>7-%(-KxybLhCYRutO z7`BaE&di~cTb-xwO+er^@BizF@KAmOZ}QDsd~=Gc;995s0#ShSJL-S( z1mEUUssZh|!>8(t;T^oo-A;Kr@Qs8Rq_Gg!u!QI>py3`jAxHqpT%dzv;eZFy;tK{K zRKa^_A&ihyir*xh?(KmZ30LXMp)y};0vJEA_o>FSlTQh9nqboRTJ2}-TEU)5m%5=) z_6{ZdxM~9|iBXIzhAPk9dad^X_O75)E1+u)Xa_$78e{7vNMBie^`-dgOY!mA5V)41 zp49BnRuI)z(KoY#BljV+zWdOn35_{Cv1X^8Wsq5^#vU}_D4JQq>xi0U+rYxEhi-qyXAr$g+mLOj7?0vvszBru1- W7nOc|$6Y&j{aoemlE3h)_xlgYVEFq0 diff --git a/build/classes/java/main/org/example/map/EdgeEarth.class b/build/classes/java/main/org/example/map/EdgeEarth.class index 0edae4118a39fbdbeabb6ab77b994b2c6726730e..4f428a6da31d9cc1ddcd531c026cfbd7143132a3 100644 GIT binary patch delta 515 zcmYk2%St0r5Qe|gN$gxsu9|c-@vbqpm(kHtHzF=0C`v$7Tq-7;WEfkVozD<5JKf|3 zL_tS!U>39V5qyAof>{n?ohTwrSDpH+&j0^)?n6I<;m7BP-@r19jqsiuIISLd6@@B= z2olr8(Ta}BVfCoug-MdK>C|+QZanQr9I`gunjUm>RSmBt$!mJ)Q24!*Z#6UDuNfe% zh#VbyoAu+WSFP7VI1Fiq4Ym3nmTFWJpr8m8OQrE`n_}})4K)+i-^SP8=09ukYz&JO z5wuuM8B>xioq2s zl1d2LGOB$tLPq9nnon;!e}us3lqY_YSf9Khb56`8_l9T-EpSf$zAM271+!Zue&Ou; z%*-7lZTy0?!A#qK@ZPu*S|7%1K^#J-tk)&4lV&GJMvOXQILi{hk^itj`F(*h fGt7$H02_Q}P8OIKvIzeFI5tku$x8E!Ko$!xf&4|t delta 646 zcmX|8%Wl(96rAfgaqQeWZfHnioDd3>)CupFcVHcfqS8v0K&((r6A3j{a8+0Zv15Z& znH_BU2SsWq0*M7nzJ!lJh&e7|;q#a|=Xl0`pZ{VzKmUCF4xo#>yUyb&`}uGu8r_ec z#R@^<8o`o{JY0<;w1Ts}wH1w41{?iY;AxE#jwxh!2J3NOLG=VJYaACe*N8!|qsw;`VZ&oJ z&5I?}7_X997$2R&0v6fIf=E$mC1Q-U5;>W)5UYqL_ zd^8!`2yg>++~bFTh)!y%d8FsRr&Uheq}nVV;8yDCHg6SR{zk>K(8yP+WbY6&(ESUk C(pNwL diff --git a/build/classes/java/main/org/example/map/MapBuilder.class b/build/classes/java/main/org/example/map/MapBuilder.class deleted file mode 100644 index 673996ca9bdec4b1b62866e73ecd47b8697dff45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3317 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 T0e>3qqYaiA3exqo3DW)xC%>Et delta 5573 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 A=Kufz diff --git a/build/classes/java/main/org/example/map/objects/animal/Animal.class b/build/classes/java/main/org/example/map/objects/animal/Animal.class index b004f0fcc9d873b3d7c78e6c7f1e3ff818373c06..fdc01fae7c9bfca1b14ca272f8b4e4231b7164fa 100644 GIT binary patch delta 316 zcmYk0yGjFL5QWdgl_dXeVs!r%f)Fjlfa@iN*jWjRg*HAwut=K3MchIK1qDUHa$dns z@PgP_2%?o3jjs3m^&xD;FieRXa;Qo4SdPxJ`FQC!jD1jVUhZMk?{LZf}@|i5aZPQx>SQ*Rdf=IOagN z&@5+b96I5I)0v(}3=0*u9wA}k_+@`w8Mb5yr#R!h(>J*EuQUC}83-g5!Z|KP4WTo* Z6c-V9CG&tMx$1<-h$0ceGhXqIg9;CF#x7Afg8a5d}f;t=jYt zdPpfH6a=-A-cNhK`vq;>L{mw~@XgHm&dixJ?aTXw>{n(RKqEeqLQ1fecJ(T1Pp~}} z3aSYu5$ad@mau2N7I1@G1MWn$;hxW%cO8!mT4rJlVvDKV40Bp zZx1V2C1i#PS>hPQKF`?#rBN6#fC|LmLmV|2Y~8{!L+n;r0sRA(B2fKkX8<9Vr^ z9dd_U?VKQ`$zOeulmM}y&v3*QxvFfch|~Xb$9z$)^~}J6*&=V&0{`Rxq~ProXZ%xc uZk;RA@f7BCIH!vmT;P(bj_&($MV*nl9K8oT5wg*QpDId>c*ZN<;rIs8TwtdF diff --git a/build/classes/java/main/org/example/map/objects/animal/genes/GeneChoice.class b/build/classes/java/main/org/example/map/objects/animal/genes/GeneChoice.class index f5a3cb9f18811865cbef32f55b7d3c2060ff99ae..2c3d2948bd7388793b1236bdbc327253dd71ad16 100644 GIT binary patch delta 71 zcmcb^d53euI%Zh`1{MY$27U%!1}O$X26+Y{1~mp@1`{A{#UMKQH1jq|2?kjPNd^s| Xya|IegB^nmgAb4nVvwIai^T~5i;)Ur delta 71 zcmcb^d53euI%Ziu1{MY`27U%^1}PvZ&mh2{#vsUG0;H`NgeRY7-X77rK~a1FTyQ~@x*)i3f58~z1Mz-+^5M=*&fI(MId^8ZCKwUph=VhjYm>29Fr3&L30H+QZXpolxB_=w2CRYKxyYV zh(qGHTu30Wyp0^?hP~syvame$h##H3I%Hub&;^I$gkoU zgO`}|d+Rl^%dF&S=*9`X?j(ccswnd7z-f*%=n;L&vaB5Ra-2gIgRw50@CQQ4;Lw9A9&oj?zsKFe^dwdWn?qi<>x45OR427bKJFW48 z%1ER>xlhG+h9x>AIxSun7lW2UW*wTd%*d=qFk6-*y3Xysh0PRE3Uvet18yTKJT|8( zK(cpZ5o*PDo5M5;PBUN_6H!~ft7(8no`F7E6#{`hxJ0X-0xZB4T&10%OWd_BEo<`( zqpcsZVZbvE<2GtkQA{y{jtuBLhBQwmBszznq5(Mw!- uV;)YXqMQANPm*vR7t+=y(`uh%igtZGFR1h_-r*xY6QcjCFZhNZ$o&U@pQl0q delta 769 zcmZ8fNla5=5dQwYrS$cGH9#vAD7b(@mJkzSL==b#F(jH0jU*&os#G-AB3%$yKsG7j z!XG?%agP^bG-wGPu(%+gA})x#qMr5Qi5TL%dNCem-n?19`DXt4l{cHOO)lIS0k9t5 zZ)%0g8V$+ta|BSy5VzYGta5up9t+|S;%EeCul^J_2 z&hb?18x1vh%kd8HMU)q_kK#Aak-soxi8Ai81u{3)*Y64KGvg~my5SOjy?`}}OL`Vt zG&ru$D9x3`^E_>)91>YTYR)ZGkmw}l2;zsa%7iGABWM_)un8APtFhGWxJWktTZYTH zLVpY+=p$`F)vBkMFf0Rj82csMCR4zv|NQE4dg}hg51;{N`03dL za3LtJ+mo!LxJOJ~u;IR#wihIH-JrC82W%4Yj?%PnwZV7@C)Uc+YQ>?rE}_UNM{tT( zBD{{0@>b|{1u1C5ao4fW}iPV=*3Lj5w83|3?@T zKOF^C;}nw!sSFdCB-Yo6kPg!VT+ECxn@6!MqaSBuqdktXeS)X-H6CG#N@p;O5BNkL MMAKVxg*)nt%m&;p8SGpIA@OfF{+Wi*(4mR$w_ D2VoMO delta 105 zcmaFK|B`=06f3I`12=>4zBn E01G=3u>b%7 diff --git a/build/classes/java/main/org/example/map/objects/plants/PlantsEquator.class b/build/classes/java/main/org/example/map/objects/plants/PlantsEquator.class index 2ba4d97975addddf7437419db98dfcaa9950ccc5..065e04c4a4a71cd7c3d5ec0dc47f1d44d16b703a 100644 GIT binary patch delta 1773 zcma)++fy557{;G(H(`^oi6wGqLlm@#B%#vM#)6evsz6hrpa`W!4ry30Elp?=uvBfT z_0)QH9WT6arZYO;I8GTmIOvRe?H}NH__SYFi}XLkD_w9LJLaTE@6sNMs6J(3XfK zZa{TSfV1%tzNZRV=7yEUQXB%T(iF>D{bsg#k=r%AIk&uSPF=rXUmo6KL8M%S>w z!{(Y=XZqCI=pdfaQH^J%*x>o(O0r`ynOW! z+Dta%WL>6tFlm0Hc2-U4n8u9xhuTw>)Nzhs#MM|m2SdZWjs<=XySn$Lb(}{~pekov z%&r(-Xjs&75mf?WRYO*wRa*8ZM(C)J*KkQ-pB(x2FV}=(PHHjVlAP&F7L1H}U5j;O zutbp{?ne^@ay%skd49KU`*x#>b3yZWt*Kh)ng_9$&w{CW`oyw139Gy z^6iF-{n8s;oH>NcSmj$rS1fHAy~J6?8he?MidPux^kJ{cGrG!n7hIcA#U?!BE}HLB z+4foF-Y&$rssQ-#8$l8^ZvN>R^RF>dvCL;Dbn~Y7z^F7B<%$q?}%szPrqj?_e>yj&AAMR%@jX-~ctfxQBZ}sKGm%;xmrJc+?^^+bX33 zchQ~9gvzM1GEro&JJbQbgm(1SYU6DZ0k(WhrL)mpq z&?(z`2i2Cc>JFkkJBt>}s=PPUmKBeb+NO1daKNE&bVe_*rgIK4$XyG3i+fi^_iDbhy%A5Gv5yeVns zE&bl&^S7DR?Dho4=xm&gHc?T(K&gHKyoI;vT%J5r@m8cFa053vCC_S}5ZTS)*g8@} zvQ+IGctOEwhAmE5EH}7)U8Z>I)4Vb>XvC~Vx0^X!qKEMg-X+3~2E2#&2@&|91T`IK z+=8~>!3EOlZz14>d%i%8!}rsQ`K7;hQvMR^sRzvQX^=dR2-5r;U8rynFFA;p9PD=- V$V&L2ZlY0x=J(Ojha6Gx(Z8|l3TFTS delta 1603 zcma)6TW?fV6#n);XXec1^gt)j(wV8&I$%3fKuRZyIu)r!2iwY}6^DyZb&x8|6lO%I z%7FKJ!G~>3G=an?UNnJ7YAOl(>ft#7Y&=DWX1 z$Nu>1*Bbx|`1)$BQ%uu$)AeGdPKUl?e^Ezlb1{Nv)wi-YyxqlfcwXI*X|Y4ymIX1Ux~zdn5fd)r zcu|d8>F_QWyRk=At?l6{7cbHMy459KR=2Fd@IDv&aX_`%h43pb4$<6cr@U#r>fkjO zuj7C~Mol;wbS>;(x(AU+FCzXGj7M;6Vsfsf@%dzt`RKEfGT4oUIPlHNl!PYXU>a^E}Sz zUOdeA3AG_I+BnI*r14mVC|2|7z$1LG$0}?_7iv5o=DCZ9Q0E$gg-3Pvuz50sw{eQA zw%#%MXzMgjrP(_}%fcLOm%001v$Wo&y%P2kvX)pvMBG8o9YXuXy~p6kk)zuQKy-3n zQ_ZV%bV|wCV^Iq_>0zu;XQP`Am62s)IedlzlWdmWNvy&9hMI9fiVi-&S?&pzc@7Pe zqD~_M`6u#1XmR5vO|s$w)3&${skzwZ##LI7mWXw)ru`( z=Q6Ell;6gY8R6ZGwp5mEk&AfkI8R8Mz(ulghy%7(vPnbMAlu%5*fRHFE0S#o*~b1K zn_w$`7_jXjzn0TWeTN9kD_!C1;JxKEfL%;k#WnwIc}wkd61)D#vhQYt|tP*DmPuC!B_K}v^_K^hr`4bQhs@s9WUjxYzI?F8nd!=~r^BItYW zp6yy~?hHiG^m={n^U(7N??Aa2axFzB!^|DtZ=^AcoQ`}3b0{!mC%zKBB}mO`c^DOw z*r=R#=~!Tx9VgTBT+6^biWywQC5Dtk4y8@y^;E|dhH5;U9`Bo;DnVd!*Y0u0w1g`H z^ND;LREKLBT*nOty{obl46n&JTIOHj`ye@az+_$A2Ig{aAJ7Bms zA>~ZdLj1)^#KZn?)E6g&{b!~!E#r;t2cc>(Lw!Q--^YP;rUTKXk&lAc{xGJo>JIN# zqq5D=KJAWmaNOl{r6(I_?0N&gD<0djFDw7Jmg{n`utZa>f#D`S1$o11U84VlhGisZ zKZO$QSIF~t_bjcT=p@Cbki{xl#o=kJp-dLVMd%gUOO~N$ zdBj(x9bGPZOEyke60=nO1ikhZSq;aSKf(oR*JHML|ACHaO2)K;om2FS!|)M(2{qK! w_Y!W?PRla~S06P_CS^xk5 diff --git a/build/classes/java/main/org/example/utils/GetFromFile.class b/build/classes/java/main/org/example/utils/GetFromFile.class index 8f8752f4dfb9f5ebb0a2544f469b5d33b0326223..92de4be6e19cf21170aa8c2e18ab9e4fe116d3b5 100644 GIT binary patch delta 13 VcmbQsK9_yNNhU_2$)}hu0{|h$1qlEE delta 13 VcmbQsK9_yNNhU_7$)}hu0{|g*1o;2} diff --git a/build/classes/java/main/org/example/utils/MapDirection.class b/build/classes/java/main/org/example/utils/MapDirection.class index 5c461782ca5713bc196de9cad1439d1dd2cddc44..2015e41719901f79d66d02ab2257bdfa66d53881 100644 GIT binary patch delta 150 zcmZoy*e=6$>ff$?3=9mm4D&Z~y=I-v&eqE}iHl(}!xVOgsXPqf4AUkrVmrb(V{$sX zI^*og{p?ySa~T=rCZA)In|zx+hLLNt1&1-qWKBNn$;)_rCU4+NWbB?S#J|U~hoKi} wEE7W?LqCvaVPIr1V3+`8aR6Bpfp|K@OdwAPsKNk9GYD`n%wm|sFpohJ0NnZ{X8-^I delta 363 zcmW;GJ4-_`6bJBs?7dC7q*^M71-Uq=g}M}+90YN2sBckPwN?i^C}_n;aSDZmxCYTLXXP0xYp}3;oJ)NdPDm9Q)Y#FY6-PDt+fUTi#mfQ zi->`55i_W_2pdE#0tU)L8U!soy{WPe1a`EmMy6Rz$YMfrLbf6#A@u$sn-Izeemj67 zV*(yy3Z3XdH+s4HFpPd=Fn}BeF@qt@@ns$<{i5QPX}g?OYEF}6NXAIUSunvYOEO84 yBbg#elWdDU-4%Xo-$#jqs!+xO&q|*p4tWdlrn%2?$t=o>Bu_*_xWWzY5c>l@&r%iu diff --git a/build/classes/java/main/org/example/utils/MutationOption.class b/build/classes/java/main/org/example/utils/MutationOption.class deleted file mode 100644 index f707ac3361f9be40c16bd0f621bfba339735e156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcma)4?{Csz5Pn`-DAaEJ7;X-yZm=n3ZitzF0hbYEO2QzaNV53B6s*{#lm*(wKTBES z7L8_~{iBTcb~R&}3ARb!-re)uJ$LW@`u*)EfERcwA;7RY9QE_YCw*{i8F|++t#SUq zb#%uZ+RbDBjetQ^5JZR})G9Y#HV+um^;xtc=Y>tZ zCDS&YU53T!R6et&cESkC)O0G02tU^pq>s^aH&;Ox7ojqBGM19!Pt&To2c_KfXXzK$?nz%U+S`6o-Nzx;l*|&Aa9T85* zsvWxdQqS_|u`@;FQ!C9@vRh=3wV^xe8T%&hXyN)!Zu5)WE6^B|w93NXGG9-CPFgo0 zmg0*=ks#UY$PjLWtTdhcktdM9V*Ucr&tx$?q;JTJ34~w5BOkwmfajGHEO(BD3owok zT*GI{qgg_yh2c=)3>` diff --git a/build/classes/java/main/org/example/utils/Preferences.class b/build/classes/java/main/org/example/utils/Preferences.class index 090bd235891c9ec51a462dc939ff6ff3632f8429..28616989a8261c584b94a88a8dbf29bb7857442c 100644 GIT binary patch literal 5664 zcmb_gX^!$9{f|0iDj6lONGjF<22-NrW&ul>iTNFf9 zG(r{Vw(R+YaZ_I?uI9CxQ&-Ij{BtLR{k z#saU5=M8)Q7EA6>(Z%zR$a!bVFfvAFTu*0D>T>;26+77h#q?CN%wsBcu}pi(+VQ-( zpyz_-_Nds)EUGS-%J%lD=;MX%;KB);%+g+_v$o-6tz3q!XetJnv(@7)@r+rH+|ZDU z{ek64Ge5cL>aJ1Z5G=T(#o}NnrQ{+1qL7Fzn2&Z z@A$_{cFy4fyFNua`q*y;7dMGPg^p>qIcC`f$8e&U#svi*5ZG5v?2CD4u~4vV*T|eJ z7`8mr@tbL*z^B_v_i|RnGx(suwgvr~F=pk{x_ilVDJXfz<-8Z@4er^$DE)yj_)}3_ z!n3@O53dVTNn|DhowjJuEy_larl_)CdQJg_zhiyK_>PV3L)WOMm$+B~q zNxcw70S=pT1wKm$TcJ>9wLAnTk>b53DP=cu_<8T2dCE&1W_>X41Mf(Zy{^Lz70=-& z<-Ti`uED`-fd~}WWR>G)RnPOy`l!IJhsvjz{o{O_J|S@EVeEnATDxNcBOJqWX8UQy zp{O>=F`Aw2pAiUo7rc4G%o}HAO`q21a`FMN(t2)2w@n`VlOZ>2Qqu3NIExL>O_IvV zq~T_*%z53`7Yx_1Nhs=CrNbBK>g%u25ljsdS7j0N%a_2x4ZIJnd88!nza%Ms6c>!V zSF{Bx11xi`dM43hC11n!3M#k1FjGiDM2nE-$3UIeCm6=QlXH)Xm;GJ+ooJm!^*eLXig>-L=*e4dk6B6> zBNM?-1bVmxIh$}%eBOv+2|rWta}~e9n{-9W@v#^4uDM_&Jg@wa3T&AxMOonP|1(S+ zpp%A^w#@>S_F$;Sa=POLC;T!Ij9o>ny+f*~aDHqf_?5taB&tk$C^9MUO0opiywLi< zFe#JV17}{p5&$OstGXtAyaMPYy|V4g2L~mvwg%{Y*3vwKIDaY#+)7gcu$Bw}wB$Na zM&mLFYbF##)I<~`Y9rc4)JfD$)I+qJsF$dpXpksDG)y!?bcCu~Do?Oj9){s4__M&? za<){7f9aAa_$$5ho3qk2_HGoR(g-~(K#YJreIrn>l~KQJ3F^z1u)J&uvCEbax@-xF z%a+i$Yzbn^mJqdU2`|f*fU#@|0n3)4u51a~%9bE3wQ+(2VZ1=zya6iy;{7nh<+`u z7BQ&Bn~F$i@vTJ+Yw_kHMznaWh$DB&N*z8)zYXL8(1e%h_m`e^d~V}jvd2*h%O1z6LH0OOitKT$BC^NP+9G=#uc+*C#2RIfW5!XMLVH;+D~+V=n&Ciq9hT4 zEPRfBU!;g!Bva(PxV?&Fm$kQXglL3lm}rnFv5Y4ssO>&mHyRqchvRRO0{UZJb#I)$ z!#2Ab?);m_14FH+?;-UX;`O7UB{UDUPRe0JXfzZLd4f-}91;KRAmUIDt>PTpR*0IG z@$?dUS1}!!nOQ>HDlYL%_X;ip%lOc{lQfDQ4b_c?J3?i@j*z~(e-vKMQ9BrZXZuss zc6EeWKO#M8uOAIBAx7i5l4s#~m_2)%<%sx?#vtRfTe;>r?^u44Z3D$L9E^~<=% z9d}zZVmgno)RTS1V4H0)6(Kez^j&TpsZlYeI{()uKza``KGFLU3 zF}-xWgZLPR@CqI1>qy`&42w1#6umekCNLtNrTln_q%_V>aof-5E^!?%ECRf_jTce%SbWD@_&cT8Z9SvJrRw}Uyp1C6(Zlw8`~fRi#UJqw_`ktXl6x0_!QasF EKi>4}Gynhq delta 1978 zcma)6-*XdH6#j0q+Z)#;EeVZN+Dx%b+cZ?R#j1<}9j(>IrUfie3y5r+HKn9Yng&D> zqJlqx0$xS&CyH9FJm}z_3aG(3hLj>o-t0=*11PZ(LfCz&#PtneO@RvH7lky4p=<^)#&uBQ03mg}{cn3oKamU~6z3V?~y-fLrp;>5J zGvzoZI=m${3m2xuKi=v39QCORj8-3}X}yLuw2mN;BjTj*DmyBg{Jp{Faf~oi087IU zg%E#=6aMvuz#~7Q`!Yf$#D}9lg45+IqOX4z!4d|_UhU|oP)%UxB7AcRgTp249(KEn z7?KZ?t0W~`NzyC1m75}-9+*XI3HzMkej8uJGXo_Y6gR4)g^}+mJ2zxqO(1L0f(G1! z2sR;x4)oz(4516J<9^Ix%VNzBkpo+Z^8#KZUry1}alAw;RVjU-djo#K37jMk`Y>bT z=AhfS0wHRlEFi{F*t&pfj+Y-?zy^+2$;}i_Ti&6Q?$T)?YhYILkITvlU&Y+ufyCP(S@tCMbaByXrBhn+hcu^sv?7;3$pLmO@E&EW0b+~k;5 zdu3M6Np(7s^)m8GZgx4cHt0XVuX3Sy>y*AXgvYQIt zA`KVb#u+hLn|k;x?V_Z34gs3lcX0{t;{#mAhxiB|;}d*}&u|5w;|pBHm-q@_6J8_y KEWX8esQVAarziyg diff --git a/build/classes/java/main/org/example/utils/Vector2d.class b/build/classes/java/main/org/example/utils/Vector2d.class index 06551de37932981ca760199ac59f6f14580654fb..de0cce6c8a588ac4333eb7f750c105a91d39793a 100644 GIT binary patch delta 1006 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

iG@7%w#xQ>;&>FJL3kL+(#KE5V(_2yqFG9wt8 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 XcwFHhOt8`3r-`R}RHa_@9Ap0v*?&qI literal 36918 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 diff --git a/src/main/java/org/example/gui/NumberTextField.java b/src/main/java/org/example/gui/NumberTextField.java deleted file mode 100644 index 0b6c4f7..0000000 --- a/src/main/java/org/example/gui/NumberTextField.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.example.gui; - -import java.math.BigDecimal; -import java.text.NumberFormat; -import java.text.ParseException; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; -import javafx.event.ActionEvent; -import javafx.event.EventHandler; -import javafx.scene.control.TextField; - -/** - * Textfield implementation that accepts formatted number and stores them in a - * BigDecimal property The user input is formatted when the focus is lost or the - * user hits RETURN. - * - * @author Thomas Bolz - */ -public class NumberTextField extends TextField { - private final NumberFormat nf; - private ObjectProperty number = new SimpleObjectProperty<>(); - - public final BigDecimal getNumber() { - return number.get(); - } - - public final void setNumber(BigDecimal value) { - number.set(value); - } - - public ObjectProperty numberProperty() { - return number; - } - - public NumberTextField() { - this(BigDecimal.ZERO); - } - - public NumberTextField(BigDecimal value) { - this(value, NumberFormat.getInstance()); - initHandlers(); - } - - public NumberTextField(BigDecimal value, NumberFormat nf) { - super(); - this.nf = nf; - initHandlers(); - setNumber(value); - } - - public NumberTextField(int value) { - this(BigDecimal.valueOf(value)); - } - - public NumberTextField(int value, NumberFormat nf) { - this(BigDecimal.valueOf(value), nf); - } - - private void initHandlers() { - - // try to parse when focus is lost or RETURN is hit - setOnAction(new EventHandler() { - - @Override - public void handle(ActionEvent arg0) { - parseAndFormatInput(); - } - }); - - focusedProperty().addListener(new ChangeListener() { - - @Override - public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { - if (!newValue.booleanValue()) { - parseAndFormatInput(); - } - } - }); - - // Set text in field if BigDecimal property is changed from outside. - numberProperty().addListener(new ChangeListener() { - - @Override - public void changed(ObservableValue obserable, BigDecimal oldValue, BigDecimal newValue) { - setText(nf.format(newValue)); - } - }); - } - - /** - * Tries to parse the user input to a number according to the provided - * NumberFormat - */ - private void parseAndFormatInput() { - try { - String input = getText(); - if (input == null || input.length() == 0) { - return; - } - Number parsedNumber = nf.parse(input); - BigDecimal newValue = new BigDecimal(parsedNumber.toString()); - setNumber(newValue); - selectAll(); - } catch (ParseException ex) { - // If parsing fails keep old number - setText(nf.format(number.get())); - } - } -} - diff --git a/src/main/java/org/example/map/MapBuilder.java b/src/main/java/org/example/map/MapBuilder.java deleted file mode 100644 index f71d98f..0000000 --- a/src/main/java/org/example/map/MapBuilder.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.example.map; - -import org.example.map.objects.animal.genes.GenesFactory; -import org.example.map.options.IEdge; -import org.example.map.objects.plants.IPlants; - -public class MapBuilder { - // TODO default values (useful when some methods are not used) - - // Map parameters - private int width; - private int height; - private IEdge iEdge; - - // Plants parameters - private int numberOfPlantsAtStart; - private int plantEnergy; - private int plantsSeededEachDay; - private IPlants iPlants; - - // Animals parameters - private int numberOfAnimalsAtStart; - private int animalEnergy; - private int animalEnergyBreedingThreshold; - private int animalBreedingCost; - private int animalMinMutations; - private int animalMaxMutations; - private int genesLength; - private boolean isCrazyBehavior; - private boolean isFullRandom; - - public static MapBuilder builder() { - return new MapBuilder(); - } - - public MapBuilder withWidth(int width) { - this.width = width; - return this; - } - - public MapBuilder withHeight(int height) { - this.height = height; - return this; - } - - public MapBuilder withiEdge(IEdge iEdge) { - this.iEdge = iEdge; - return this; - } - - public MapBuilder withNumberOfPlantsAtStart(int numberOfPlantsAtStart) { - this.numberOfPlantsAtStart = numberOfPlantsAtStart; - return this; - } - - public MapBuilder withPlantEnergy(int plantEnergy) { - this.plantEnergy = plantEnergy; - return this; - } - - public MapBuilder withPlantsSeededEachDay(int plantsSeededEachDay) { - this.plantsSeededEachDay = plantsSeededEachDay; - return this; - } - - public MapBuilder withIPlants(IPlants iPlants) { - this.iPlants = iPlants; - return this; - } - - public MapBuilder withNumberOfAnimalsAtStart(int numberOfAnimalsAtStart) { - this.numberOfAnimalsAtStart = numberOfAnimalsAtStart; - return this; - } - - public MapBuilder withAnimalEnergy(int animalEnergy) { - this.animalEnergy = animalEnergy; - return this; - } - - public MapBuilder withAnimalEnergyBreedingThreshold(int animalEnergyBreedingThreshold) { - this.animalEnergyBreedingThreshold = animalEnergyBreedingThreshold; - return this; - } - - public MapBuilder withAnimalBreedingCost(int animalBreedingCost) { - this.animalBreedingCost = animalBreedingCost; - return this; - } - - public MapBuilder withAnimalMinMutations(int animalMinMutations) { - this.animalMinMutations = animalMinMutations; - return this; - } - - public MapBuilder withAnimalMaxMutations(int animalMaxMutations) { - this.animalMaxMutations = animalMaxMutations; - return this; - } - - public MapBuilder withGenesLength(int genesLength) { - this.genesLength = genesLength; - return this; - } - - public MapBuilder withCrazyBehavior(boolean isCrazyBehavior) { - this.isCrazyBehavior = isCrazyBehavior; - return this; - } - - public MapBuilder withFullRandom(boolean isFullRandom) { - this.isFullRandom = isFullRandom; - return this; - } - - - public WorldMap build() { - // TODO: add other gene parameters to Factory. - GenesFactory genesFactory = new GenesFactory(isFullRandom, - isCrazyBehavior, - genesLength, - animalMinMutations, - animalMaxMutations); - - return new WorldMap(width, - height, - iEdge, - numberOfPlantsAtStart, - plantEnergy, - plantsSeededEachDay, - iPlants, - numberOfAnimalsAtStart, - animalEnergy, - animalEnergyBreedingThreshold, - animalBreedingCost, - genesFactory - ); - } - -} - - diff --git a/src/main/java/org/example/utils/MapDirection.java b/src/main/java/org/example/utils/MapDirection.java index 247f798..2dd248c 100644 --- a/src/main/java/org/example/utils/MapDirection.java +++ b/src/main/java/org/example/utils/MapDirection.java @@ -57,32 +57,6 @@ public MapDirection randomDirection(){ return MapDirection.fromInt(random.nextInt(8)); } - public MapDirection previous(){ - return switch (this) { - case NORTH -> NORTHWEST; - case SOUTH -> SOUTHEAST; - case EAST -> NORTHEAST; - case WEST -> SOUTHWEST; - case NORTHWEST -> WEST; - case NORTHEAST -> NORTH; - case SOUTHWEST -> SOUTH; - case SOUTHEAST -> EAST; - }; - } - - public MapDirection next(){ - return switch (this) { - case NORTH -> NORTHEAST; - case SOUTH -> SOUTHWEST; - case EAST -> SOUTHEAST; - case WEST -> NORTHWEST; - case NORTHWEST -> NORTH; - case NORTHEAST -> EAST; - case SOUTHWEST -> WEST; - case SOUTHEAST -> SOUTH; - }; - } - public MapDirection opposite(){ return switch (this) { case NORTH -> SOUTH; diff --git a/src/main/java/org/example/utils/MutationOption.java b/src/main/java/org/example/utils/MutationOption.java deleted file mode 100644 index 52715bf..0000000 --- a/src/main/java/org/example/utils/MutationOption.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.example.utils; - -public enum MutationOption { - // TODO do we need this? - RANDOM, - SLIGHT_CORRECTION, -}