Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions oolab/src/main/java/agh/ics/oop/AbstractMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
78 changes: 69 additions & 9 deletions oolab/src/main/java/agh/ics/oop/Animal.java
Original file line number Diff line number Diff line change
@@ -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;i<genomeLength;i++){
genes[i]=Direction.numberToDirection(generator.nextInt(8));
}
activeGeneIx=generator.nextInt(genomeLength);
}
//konstruktor dla dzieciów
public Animal(IMutationModel mutationModel, Animal mommy, Animal daddy){
//wpisać konstruktor
mutationModel.mutate(this, mommy, daddy);
Random generator = new Random();
orientation=Direction.numberToDirection(generator.nextInt(8));
position=mommy.getPosition();
genes= new Direction[mommy.genes.length];
activeGeneIx=generator.nextInt(mommy.genes.length);
int fromMommy=mommy.genesToSucceed(daddy);
if (generator.nextBoolean()){
try {
createGenome(mommy, daddy, fromMommy);
}
catch (IllegalArgumentException exception){
exception.printStackTrace();
}
}
else{
try {
createGenome(daddy,mommy,genes.length-fromMommy);
}
catch (IllegalArgumentException exception){
exception.printStackTrace();
}
}
mutationModel.mutate(this);
}

private void createGenome(Animal parent1, Animal parent2, int intersection) throws IllegalArgumentException{
if (intersection<=genes.length) {
for (int i = 0; i < intersection; i++) {
genes[i] = parent1.genes[i];
}
for (int i = intersection; i < genes.length; i++) {
genes[i] = parent2.genes[i];
}
}
else{throw new IllegalArgumentException("wrong genome intersection point");}
}
@Override
public String getImageName() {
return null;
Expand All @@ -29,4 +73,20 @@ public String getImageName() {
public void changePosition(Vector2d newPosition){
this.position=newPosition;
}
public Vector2d getPosition() {
return position;
}

public int getEnergy() {
return energy;
}

public boolean isStronger(Animal other){
if (energy>other.getEnergy()){return true;}
return false;
}

public int genesToSucceed(Animal other){
return round(energy/(other.getEnergy()+energy)*genes.length);
}
}
27 changes: 11 additions & 16 deletions oolab/src/main/java/agh/ics/oop/Direction.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public enum Direction {
WESTSOUTH,
WEST,
WESTNORTH;

public Vector2d toUnitVector(){
return switch(this){
case NORTH -> new Vector2d(0,1);
Expand All @@ -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;
Expand All @@ -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);
}
}
5 changes: 5 additions & 0 deletions oolab/src/main/java/agh/ics/oop/Grass.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion oolab/src/main/java/agh/ics/oop/IMutationModel.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package agh.ics.oop;

public interface IMutationModel {
void mutate(Animal child, Animal mommy, Animal daddy);
void mutate(Animal child);
}
33 changes: 11 additions & 22 deletions oolab/src/main/java/agh/ics/oop/LittleAdjustment.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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;
}

}
Expand Down
33 changes: 12 additions & 21 deletions oolab/src/main/java/agh/ics/oop/TotalRandom.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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;
}
}

Expand Down
3 changes: 3 additions & 0 deletions oolab/src/main/java/agh/ics/oop/Vector2d.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down