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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

public record FileMenager(String filename) {

public FileMenager(String filename){
this.filename = filename;
try (PrintWriter output = new PrintWriter(new FileWriter(filename))) {
output.println("AllAnimals, AllPlants, FreeSpots, MostPopularGenotype, AverageEnergyAlive, AverageEnergyDead");
} catch (IOException e) {
e.printStackTrace();
}
}

public void dayStats(Object[] statistics){
String data = Arrays.toString(statistics);
data = data.substring(0, data.length() - 1);

StringBuilder stringBuilder = new StringBuilder(); //takie cuś do łączenia stringów

for (int i = 0; i < data.length(); i++ ){
char curr = data.charAt(i);
if (curr != ' '){
stringBuilder.append(curr);
}
}

try (PrintWriter output = new PrintWriter(new FileWriter(filename, true))){
output.println(stringBuilder);
}
catch (IOException exception){
exception.printStackTrace();
}

}


}
24 changes: 11 additions & 13 deletions oolab/src/main/java/agh/ics/oop/GlobMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,20 @@ public void moveOnMap(Animal animal, SimulationVar var, Map map){

//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);


changeAnimalPosition(animal, var, map); //zmiana pozycji
}
else{
animal.diedDate = animal.age;
//dodajemy zwierzaka do listy zmarłych zwierząt
map.setDiedAnimals(map.getDiedAnimals() + 1);
map.addToDiedList(animal);
}



}


protected void changeAnimalPosition(Animal animal, SimulationVar var){
protected void changeAnimalPosition(Animal animal, SimulationVar var, Map map){
Direction[] genes = animal.genes;
int currGeneIdx = animal.activeGeneIx;
int mapHeight = var.getMapHeight();
Expand All @@ -41,24 +37,26 @@ protected void changeAnimalPosition(Animal animal, SimulationVar var){
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;
Vector2d vector = new Vector2d(0, posAfterMovement.y);
posAfterMovement = vector;

}
else{
posAfterMovement.x = mapWidth - 1;
Vector2d vector = new Vector2d(mapWidth - 1, posAfterMovement.y);
posAfterMovement = vector;
}
}

map.setAnimalsOnField(animal.getPosition(), posAfterMovement);
animal.changePosition(posAfterMovement);

}

}
13 changes: 5 additions & 8 deletions oolab/src/main/java/agh/ics/oop/HellMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,20 @@ public void moveOnMap(Animal animal, SimulationVar var, Map map){

//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);


changeAnimalPosition(animal, var, map); //zmiana pozycji
}
else{
animal.diedDate = animal.age;
//dodajemy zwierzaka do listy zmarłych zwierząt
map.setDiedAnimals(map.getDiedAnimals() + 1);
map.addToDiedList(animal);
}



}


protected void changeAnimalPosition(Animal animal, SimulationVar var){
protected void changeAnimalPosition(Animal animal, SimulationVar var, Map map){
Direction[] genes = animal.genes;
int currGeneIdx = animal.activeGeneIx;
int mapHeight = var.getMapHeight();
Expand All @@ -46,6 +42,7 @@ protected void changeAnimalPosition(Animal animal, SimulationVar var){
if (animal.energy - var.getMinEnergyForCopulation() >= 0) {
animal.energy -= var.getMinEnergyForCopulation();
Random generator = new Random();
map.setAnimalsOnField(animal.getPosition(), posAfterMovement);
animal.changePosition(new Vector2d(generator.nextInt(mapWidth), generator.nextInt(mapHeight)));
}

Expand Down
29 changes: 0 additions & 29 deletions oolab/src/main/java/agh/ics/oop/IMapType.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,4 @@
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);
// tu trzeba zmienić ten fragment bo zmieniliśmy tę metodę
//map.placeAnimalOnMap(winner.getPosition(), baby);
}

}
}
52 changes: 47 additions & 5 deletions oolab/src/main/java/agh/ics/oop/Map.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;

public class Map {
private HashMap<Vector2d,Grass> grassOnField = new HashMap<>();
private ArrayList<Animal> animalsOnField=new ArrayList<>();
private int diedAnimals = 0;
private ArrayList<Animal> animalsOnField=new ArrayList<>(); //wszystkie zwierzątka na mapie
private HashMap<Vector2d,Integer> numberOfAnimalsOnField = new HashMap<>(); //pamietac zeby przy move zmieniac wartosc w tej hashmapie
private ArrayList<Animal> diedAnimalsOnMap = new ArrayList<>();
private int height;
private int width;
private IMapType map;
private int howManyGrasses = 0;

//Big Bang
public Map(SimulationVar var) {
height=var.getMapHeight();
width= var.getMapWidth();
map = var.getMapType();
for (int i=0;i<var.getAnimalsAtStart();i++){
Animal newAnimal= new Animal(var);
placeAnimalOnMap(newAnimal);
Expand All @@ -32,16 +38,52 @@ public void addGrass(Grass newGrass){
grassOnField.put(newGrass.getPosition(), newGrass);
}

protected ArrayList<Animal> animalsOnSpot(Vector2d spot){
protected void setAnimalsOnField(Vector2d oldSpot, Vector2d newSpot){
numberOfAnimalsOnField.put(oldSpot, numberOfAnimalsOnField.get(oldSpot) - 1); //usuwamy ze starego miejsca
numberOfAnimalsOnField.put(newSpot, numberOfAnimalsOnField.get(newSpot) + 1); //dodajemy do nowego miejsca
}

return null;
protected void removeAnimal(Animal animal){
animalsOnField.remove(animal); //usunięcie z listy zwierząt
numberOfAnimalsOnField.put(animal.getPosition(), numberOfAnimalsOnField.get(animal.getPosition()) - 1); //dekrementowanie liczby zwierząt na tym polu
}
protected int howManyAnimalsOnSpot(Vector2d spot){
return 0;
protected int howManyAnimalsOnSpot(Vector2d spot){ //zwraca liczbę zwierzątek na danych polu
return numberOfAnimalsOnField.get(spot);

}

protected ArrayList<Animal> getAnimalsOnField(){
return this.animalsOnField;
}
protected boolean isGrassThere(Vector2d spot){
return grassOnField.containsKey(spot);
}

protected int getDiedAnimals(){
return diedAnimals;
}

protected void setDiedAnimals(int n){
diedAnimals = n;
}

protected HashMap<Vector2d, Integer> getAnimalsOnEachSpot(){
return numberOfAnimalsOnField;
}

protected ArrayList<Animal> getDiedAnimalsOnMap(){
return diedAnimalsOnMap;
}

protected void addToDiedList(Animal animal){
diedAnimalsOnMap.add(animal);
}

protected void removeGrass(Grass grass){
grassOnField.remove(grassOnField.get(grass).getPosition(), grass);
}




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

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Vector;

public class SimulationEngine implements ISimulationEngine{
SimulationVar variables;
private Map map;
private int howManyDays = 0;
private Statistics stats;



public SimulationEngine(Map map, SimulationVar variables){
this.map = map;
this.variables = variables;
}

public void dayRitual(IMapType mapType, Map map){
howManyDays += 1;
//korowód
int diedToday = 0;
for (Animal animal: map.getAnimalsOnField()){
if (animal.diedDate != 0){
diedToday += 1;
map.removeAnimal(animal);
}
}
map.setDiedAnimals(map.getDiedAnimals() + diedToday); //łączna liczba zmarłych zwierzątek


//poruszamy wszystkie zwierzątka
for (Animal animal:map.getAnimalsOnField()){
mapType.moveOnMap(animal, variables, map);
}

ArrayList<Animal> animals = map.getAnimalsOnField();
animals.sort(Comparator.<Animal>comparingInt(el -> el.position.x).thenComparingInt(el -> el.position.y));
Vector2d lastVector = new Vector2d(10^9, 10^9);

//jedzonko i rozmnażanie
for (Animal animal: map.getAnimalsOnField()){
if (animal.getPosition() != lastVector){ //jeśli wektor zwierzątka nie jest identyczny do ostatniego -> aby nie sprawdzac kilka razy tej samej pozycji zwierząt
lastVector = animal.getPosition();
if (map.howManyAnimalsOnSpot(animal.getPosition())!= 1){ //jeśli jest wiecej niż 1 zwierze na danym polu

int howManyOnThisSpot = map.howManyAnimalsOnSpot(animal.getPosition());
ArrayList<Animal> possibleMatch = new ArrayList<>();
for(int i = 0; i < howManyOnThisSpot; i++){
possibleMatch.add(animals.get(i));
}
possibleMatch.sort(Comparator.<Animal>comparingInt(el -> -el.energy).thenComparingInt(el -> -el.age).thenComparingInt(el -> -el.children));

Animal winner = possibleMatch.get(0); //wygrał trawkę

if (map.isGrassThere(winner.position)) {
winner.energy += variables.getGrassEnergyProfit();
winner.grassEaten += 1;
map.removeGrass(new Grass(winner.position));
}

Animal secondWinner = possibleMatch.get(1); //ma szansę na dzieciątko z winnerem
if (winner.energy >= variables.getMinEnergyForCopulation() && secondWinner.energy >= variables.getMinEnergyForCopulation()) {
Animal baby = new Animal(variables, winner, secondWinner); //nowe bobo
map.placeAnimalOnMap(baby); //umieszczamy na mapie

}
}
}

}

//zasianie roślin
variables.getGardener().seedGrass(variables, map);


}

protected int getDays(){
return howManyDays;
}

@Override
public void run() {
Object[] statistics = new Object[]{
stats.getAmountOfAnimals(map),
stats.getAmountOfGrass(variables, this),
stats.freeSpots(map, variables),
stats.theMostCommonGenotype(map),
stats.averageEnergyAlive(map),
stats.averageEnergyDead(map)

};

}
}
Loading