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
45 changes: 29 additions & 16 deletions oolab/src/main/java/agh/ics/oop/Direction.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,50 @@

public enum Direction {
NORTH,
EASTNORTH,
NORTHEAST,
EAST,
EASTSOUTH,
SOUTHEAST,
SOUTH,
WESTSOUTH,
SOUTHWEST,
WEST,
WESTNORTH;
NORTHWEST;

public Vector2d toUnitVector(){
return switch(this){
case NORTH -> new Vector2d(0,1);
case EASTNORTH -> new Vector2d(1,1);
case NORTHEAST -> new Vector2d(1,1);
case EAST -> new Vector2d(1,0);
case EASTSOUTH -> new Vector2d(1,-1);
case SOUTHEAST -> new Vector2d(1,-1);
case SOUTH -> new Vector2d(0,-1);
case WESTSOUTH -> new Vector2d(-1,-1);
case SOUTHWEST -> new Vector2d(-1,-1);
case WEST -> new Vector2d(-1,0);
case WESTNORTH -> new Vector2d(-1,1);
case NORTHWEST -> new Vector2d(-1,1);
default -> null;
};
}

public int toNumber(){
return switch(this){
case NORTH -> 0;
case EASTNORTH -> 1;
case NORTHEAST -> 1;
case EAST -> 2;
case EASTSOUTH -> 3;
case SOUTHEAST -> 3;
case SOUTH -> 4;
case WESTSOUTH -> 5;
case SOUTHWEST -> 5;
case WEST -> 6;
case WESTNORTH -> 7;
case NORTHWEST -> 7;
};
}
public static Direction numberToDirection(int n){
return switch(n%8){
case 0 -> NORTH;
case 1 -> EASTNORTH;
case 1 -> NORTHEAST;
case 2 -> EAST;
case 3 -> EASTSOUTH;
case 3 -> SOUTHEAST;
case 4 -> SOUTH;
case 5 -> WESTSOUTH;
case 5 -> SOUTHWEST;
case 6 -> WEST;
case 7 -> WESTNORTH;
case 7 -> NORTHWEST;
default -> NORTH;
};
}
Expand All @@ -59,4 +59,17 @@ public Direction add(Direction d){
int sumInt=this.toNumber()+d.toNumber();
return numberToDirection(sumInt);
}

public Direction opposite(Direction direction){
return switch(direction){
case NORTH -> SOUTH;
case NORTHEAST -> SOUTHWEST;
case EAST -> WEST;
case SOUTHEAST -> NORTHWEST;
case SOUTH -> NORTH;
case SOUTHWEST -> NORTHEAST;
case WEST -> EAST;
case NORTHWEST -> SOUTHEAST;
};
}
}
58 changes: 58 additions & 0 deletions oolab/src/main/java/agh/ics/oop/GlobMap.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,64 @@
package agh.ics.oop;

import java.util.ArrayList;
import java.util.Comparator;

public class GlobMap implements IMapType{


@Override
public void moveOnMap(Animal animal, SimulationVar var, Map map){

var.getBehaviorModel().geneBehaviour(animal);

//jeśli zwierzę może się poruszyć
if (animal.energy - 1 >= 0){
changeAnimalPosition(animal, var); //zmiana pozycji
animalDinnerAndBreeding(animal, var, map);//obiad i dzieci
animal.age += 1;
var.getGardener().seedGrass(var, map);


}
else{
animal.diedDate = animal.age;
//dodajemy zwierzaka do listy zmarłych zwierząt
}



}


protected void changeAnimalPosition(Animal animal, SimulationVar var){
Direction[] genes = animal.genes;
int currGeneIdx = animal.activeGeneIx;
int mapHeight = var.getMapHeight();
int mapWidth = var.getMapHeight();

//o ten wektor się poruszamy
Vector2d vectorToMove = genes[currGeneIdx].toUnitVector();
Vector2d posAfterMovement = animal.position.add(vectorToMove);


// jeśli zwierzątko będzie na samym krańcu mapy, a będzie miało iść na skos, to jednocześnie wyjdzie na równik
// i na biegun, więc nie wiem, co wtedy mamy robić - napisałam wersję z odwrotnym kierunkiem
// wtedy można usunąć te warunki i po prostu sprawdzac tylko ten z y
if (posAfterMovement.y < 0 || posAfterMovement.y >= mapHeight){
animal.orientation = animal.orientation.opposite(animal.orientation);
posAfterMovement = animal.position;
}
//czy równik
else if (posAfterMovement.x >= mapWidth || posAfterMovement.x < 0){
if (posAfterMovement.x >= mapWidth){
posAfterMovement.x = 0;
}
else{
posAfterMovement.x = mapWidth - 1;
}
}

animal.changePosition(posAfterMovement);
}

}
50 changes: 50 additions & 0 deletions oolab/src/main/java/agh/ics/oop/HellMap.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,55 @@
package agh.ics.oop;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;

public class HellMap implements IMapType {


@Override
public void moveOnMap(Animal animal, SimulationVar var, Map map){

var.getBehaviorModel().geneBehaviour(animal);

//jeśli zwierzę może się poruszyć
if (animal.energy - 1 >= 0){
changeAnimalPosition(animal, var); //zmiana pozycji
animalDinnerAndBreeding(animal, var, map);//obiad i dzieci
animal.age += 1;
var.getGardener().seedGrass(var, map);


}
else{
animal.diedDate = animal.age;
//dodajemy zwierzaka do listy zmarłych zwierząt
}



}


protected void changeAnimalPosition(Animal animal, SimulationVar var){
Direction[] genes = animal.genes;
int currGeneIdx = animal.activeGeneIx;
int mapHeight = var.getMapHeight();
int mapWidth = var.getMapHeight();

//o ten wektor się poruszamy
Vector2d vectorToMove = genes[currGeneIdx].toUnitVector();
Vector2d posAfterMovement = animal.position.add(vectorToMove);


if (posAfterMovement.y < 0 || posAfterMovement.y >= mapHeight || posAfterMovement.x >= mapWidth || posAfterMovement.x < 0) {
if (animal.energy - var.getMinEnergyForCopulation() >= 0) {
animal.energy -= var.getMinEnergyForCopulation();
Random generator = new Random();
animal.changePosition(new Vector2d(generator.nextInt(mapWidth), generator.nextInt(mapHeight)));
}

}
}
}

20 changes: 20 additions & 0 deletions oolab/src/main/java/agh/ics/oop/HijinksBehavior.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,24 @@
package agh.ics.oop;

import java.util.Random;

public class HijinksBehavior implements IBehaviorModel{

@Override
public void geneBehaviour(Animal animal){
//losujemy liczbę od 0 do 9
//w zależności od tego albo porusza się normalnie, albo losujemy
Random generator = new Random();
if (generator.nextInt(10) < 2){
animal.activeGeneIx = generator.nextInt(animal.genes.length);
}
else{
if (animal.activeGeneIx + 1 >= animal.genes.length){
animal.activeGeneIx = 0;
}
else{
animal.activeGeneIx += 1;
}
}
}
}
3 changes: 2 additions & 1 deletion oolab/src/main/java/agh/ics/oop/IBehaviorModel.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package agh.ics.oop;

public interface IBehaviorModel {

public interface IBehaviorModel {
void geneBehaviour(Animal animal);
}
33 changes: 33 additions & 0 deletions oolab/src/main/java/agh/ics/oop/IMapType.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,37 @@
package agh.ics.oop;

import java.util.ArrayList;
import java.util.Comparator;

public interface IMapType {
void moveOnMap(Animal animal, SimulationVar var, Map map);

default void animalDinnerAndBreeding(Animal animal, SimulationVar var, Map map) {

ArrayList<Animal> possibleMatch = new ArrayList<>();
possibleMatch.add(animal);
//allAnimals = listaZeZwierzaczkami
//for (animall : allAnimals){
// if (animal.position == animall.position){
// possibleMatch.add(animall);
// }
//}

if (possibleMatch.size() != 1) {
possibleMatch.sort(Comparator.<Animal>comparingInt(el -> -el.energy).thenComparingInt(el -> -el.age).thenComparingInt(el -> -el.children));
}
Animal winner = possibleMatch.get(0);

if (map.isGrassThere(winner.position)) {
winner.energy += var.getGrassEnergyProfit();
}

winner.energy += var.getGrassEnergyProfit();
Animal secondWinner = possibleMatch.get(1);
if (winner.energy >= var.getMinEnergyForCopulation() && secondWinner.energy >= var.getMinEnergyForCopulation()) {
Animal baby = new Animal(var, winner, secondWinner);
map.placeAnimal(winner.position, baby);
}

}
}
9 changes: 9 additions & 0 deletions oolab/src/main/java/agh/ics/oop/PredestinationBehavior.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
package agh.ics.oop;

public class PredestinationBehavior implements IBehaviorModel{
@Override
public void geneBehaviour(Animal animal){
if (animal.activeGeneIx + 1 >= animal.genes.length){
animal.activeGeneIx = 0;
}
else{
animal.activeGeneIx += 1;
}
}
}
4 changes: 2 additions & 2 deletions oolab/src/main/java/agh/ics/oop/Vector2d.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import java.util.Objects;

public class Vector2d{
public final int x;
public final int y;
public int x;
public int y;

public Vector2d (int x, int y){
this.x=x;
Expand Down