From 4ac8b18bf0bcf162606d5bc24ebd4b34c814920b Mon Sep 17 00:00:00 2001 From: Aleksandra Smela Date: Sat, 17 Dec 2022 14:30:40 +0100 Subject: [PATCH] class Animal implementation --- .../main/java/agh/ics/oop/AbstractMap.java | 8 ++ oolab/src/main/java/agh/ics/oop/Animal.java | 78 ++++++++++++++++--- .../src/main/java/agh/ics/oop/Direction.java | 27 +++---- oolab/src/main/java/agh/ics/oop/Grass.java | 5 ++ .../main/java/agh/ics/oop/IMutationModel.java | 2 +- .../java/agh/ics/oop/LittleAdjustment.java | 33 +++----- .../main/java/agh/ics/oop/TotalRandom.java | 33 +++----- oolab/src/main/java/agh/ics/oop/Vector2d.java | 3 + 8 files changed, 120 insertions(+), 69 deletions(-) diff --git a/oolab/src/main/java/agh/ics/oop/AbstractMap.java b/oolab/src/main/java/agh/ics/oop/AbstractMap.java index 4921367..cd10cd9 100644 --- a/oolab/src/main/java/agh/ics/oop/AbstractMap.java +++ b/oolab/src/main/java/agh/ics/oop/AbstractMap.java @@ -26,4 +26,12 @@ protected boolean isGrassThere(Vector2d spot){ } protected void placeAnimal(Vector2d spot, Animal animal){} + + public int getHeight() { + return height; + } + + public int getWidth() { + return width; + } } diff --git a/oolab/src/main/java/agh/ics/oop/Animal.java b/oolab/src/main/java/agh/ics/oop/Animal.java index e0c17f4..e0b7cf5 100644 --- a/oolab/src/main/java/agh/ics/oop/Animal.java +++ b/oolab/src/main/java/agh/ics/oop/Animal.java @@ -1,26 +1,70 @@ package agh.ics.oop; +import java.util.Random; + +import static java.lang.Math.round; + public class Animal implements IMapElement{ protected Direction orientation; protected Vector2d position; protected int energy; - protected Direction[] genes; + public Direction[] genes; protected int activeGeneIx; - protected int grassEaten; - protected int diedDate; - protected int age; - protected int children; + protected int grassEaten=0; + protected int diedDate=0; + protected int age=0; + protected int children=0; //konstruktor dla Adama i Ewy - public Animal(IMutationModel mutationModel) { - //tu trzeba wszystko losować + public Animal(AbstractMap map, int startEnergy, int genomeLength) { + Random generator = new Random(); + orientation=Direction.numberToDirection(generator.nextInt(8)); + position=new Vector2d(generator.nextInt(map.getWidth()), generator.nextInt(map.getHeight())); + energy=startEnergy; + genes= new Direction[genomeLength]; + for (int i=0;iother.getEnergy()){return true;} + return false; + } + + public int genesToSucceed(Animal other){ + return round(energy/(other.getEnergy()+energy)*genes.length); + } } diff --git a/oolab/src/main/java/agh/ics/oop/Direction.java b/oolab/src/main/java/agh/ics/oop/Direction.java index 57dc42b..ead20a9 100644 --- a/oolab/src/main/java/agh/ics/oop/Direction.java +++ b/oolab/src/main/java/agh/ics/oop/Direction.java @@ -9,6 +9,7 @@ public enum Direction { WESTSOUTH, WEST, WESTNORTH; + public Vector2d toUnitVector(){ return switch(this){ case NORTH -> new Vector2d(0,1); @@ -35,10 +36,8 @@ public int toNumber(){ case WESTNORTH -> 7; }; } - - public Direction add(Direction d){ - int sumInt=this.toNumber()+d.toNumber(); - return switch(sumInt%8){ + public static Direction numberToDirection(int n){ + return switch(n%8){ case 0 -> NORTH; case 1 -> EASTNORTH; case 2 -> EAST; @@ -47,21 +46,17 @@ public Direction add(Direction d){ case 5 -> WESTSOUTH; case 6 -> WEST; case 7 -> WESTNORTH; - default -> this; + default -> NORTH; }; } + public Direction add(int n){ int sumInt=this.toNumber()+n; - return switch(sumInt%8){ - case 0 -> NORTH; - case 1 -> EASTNORTH; - case 2 -> EAST; - case 3 -> EASTSOUTH; - case 4 -> SOUTH; - case 5 -> WESTSOUTH; - case 6 -> WEST; - case 7 -> WESTNORTH; - default -> this; - }; + return numberToDirection(sumInt); + } + + public Direction add(Direction d){ + int sumInt=this.toNumber()+d.toNumber(); + return numberToDirection(sumInt); } } diff --git a/oolab/src/main/java/agh/ics/oop/Grass.java b/oolab/src/main/java/agh/ics/oop/Grass.java index e1dacd8..f1f14cf 100644 --- a/oolab/src/main/java/agh/ics/oop/Grass.java +++ b/oolab/src/main/java/agh/ics/oop/Grass.java @@ -2,6 +2,11 @@ public class Grass implements IMapElement{ private Vector2d position; + + public Grass(Vector2d position) { + this.position = position; + } + @Override public String getImageName() { return null; diff --git a/oolab/src/main/java/agh/ics/oop/IMutationModel.java b/oolab/src/main/java/agh/ics/oop/IMutationModel.java index 291b5c1..1392610 100644 --- a/oolab/src/main/java/agh/ics/oop/IMutationModel.java +++ b/oolab/src/main/java/agh/ics/oop/IMutationModel.java @@ -1,5 +1,5 @@ package agh.ics.oop; public interface IMutationModel { - void mutate(Animal child, Animal mommy, Animal daddy); + void mutate(Animal child); } diff --git a/oolab/src/main/java/agh/ics/oop/LittleAdjustment.java b/oolab/src/main/java/agh/ics/oop/LittleAdjustment.java index 5ba60e4..2bfeefc 100644 --- a/oolab/src/main/java/agh/ics/oop/LittleAdjustment.java +++ b/oolab/src/main/java/agh/ics/oop/LittleAdjustment.java @@ -1,35 +1,24 @@ package agh.ics.oop; +import java.util.ArrayList; +import java.util.List; import java.util.Random; public class LittleAdjustment implements IMutationModel{ @Override - public void mutate(Animal child, Animal mommy, Animal daddy) { - - for (int i = 0 ; i < child.genes.length; i++){ - Random generator = new Random(); - int newGene = child.genes[i].toNumber(); - + public void mutate(Animal child) { + Random generator = new Random(); + int mutationsNumber=generator.nextInt(child.genes.length); + List toMutate= new ArrayList<>(); + for (int i = 0; i < child.genes.length; i++){toMutate.add(i);} + for (int i = 0; i < mutationsNumber; i++){ + int ix= generator.nextInt(toMutate.size()); if (generator.nextBoolean()){ - newGene = (newGene + 1)%8; + child.genes[toMutate.remove(ix)]=child.genes[toMutate.remove(ix)].add(1); } else{ - newGene = (newGene - 1)%8; + child.genes[toMutate.remove(ix)]=child.genes[toMutate.remove(ix)].add(-1); } - - Direction geneToInsert = switch(newGene){ - case 0 -> Direction.NORTH; - case 1 -> Direction.EASTNORTH; - case 2 -> Direction.EAST; - case 3 -> Direction.EASTSOUTH; - case 4 -> Direction.SOUTH; - case 5 -> Direction.WESTSOUTH; - case 6 -> Direction.WEST; - case 7 -> Direction.WESTNORTH; - default -> null; - }; - - child.genes[i] = geneToInsert; } } diff --git a/oolab/src/main/java/agh/ics/oop/TotalRandom.java b/oolab/src/main/java/agh/ics/oop/TotalRandom.java index 2a9e88a..0e17bd6 100644 --- a/oolab/src/main/java/agh/ics/oop/TotalRandom.java +++ b/oolab/src/main/java/agh/ics/oop/TotalRandom.java @@ -1,29 +1,20 @@ package agh.ics.oop; +import java.util.ArrayList; +import java.util.List; import java.util.Random; + public class TotalRandom implements IMutationModel{ @Override - public void mutate(Animal child, Animal mommy, Animal daddy) { - - for (int i = 0; i < child.genes.length; i++){ - Random generator = new Random(); - - int newGene = generator.nextInt(8); - - Direction geneToInsert = switch(newGene){ - case 0 -> Direction.NORTH; - case 1 -> Direction.EASTNORTH; - case 2 -> Direction.EAST; - case 3 -> Direction.EASTSOUTH; - case 4 -> Direction.SOUTH; - case 5 -> Direction.WESTSOUTH; - case 6 -> Direction.WEST; - case 7 -> Direction.WESTNORTH; - default -> null; - }; - - child.genes[i] = geneToInsert; - + public void mutate(Animal child) { + Random generator = new Random(); + int mutationsNumber=generator.nextInt(child.genes.length); + List toMutate= new ArrayList<>(); + for (int i = 0; i < child.genes.length; i++){toMutate.add(i);} + for (int i = 0; i < mutationsNumber; i++){ + Direction geneToInsert = Direction.numberToDirection(generator.nextInt(8)); + int ix= generator.nextInt(toMutate.size()); + child.genes[toMutate.remove(ix)] = geneToInsert; } } diff --git a/oolab/src/main/java/agh/ics/oop/Vector2d.java b/oolab/src/main/java/agh/ics/oop/Vector2d.java index ada6c59..6740949 100644 --- a/oolab/src/main/java/agh/ics/oop/Vector2d.java +++ b/oolab/src/main/java/agh/ics/oop/Vector2d.java @@ -11,6 +11,9 @@ public Vector2d (int x, int y){ this.y=y; } + public Vector2d(Vector2d position) { + } + public String toString() { return "(%d, %d)".formatted(x, y);