From 43403661b86d241f8911e28fcabd47241c25d154 Mon Sep 17 00:00:00 2001 From: maxog Date: Wed, 29 Jan 2025 00:27:20 +0200 Subject: [PATCH 01/17] Abstract class animal --- .idea/encodings.xml | 7 +++++++ pom.xml | 2 +- src/main/java/Animal.java | 40 +++++++++++++++++++++++++++++++++++++++ src/main/java/Main.java | 5 +++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .idea/encodings.xml create mode 100644 src/main/java/Animal.java create mode 100644 src/main/java/Main.java diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f9dd416..e33e7b6 100644 --- a/pom.xml +++ b/pom.xml @@ -13,5 +13,5 @@ 22 UTF-8 - + \ No newline at end of file diff --git a/src/main/java/Animal.java b/src/main/java/Animal.java new file mode 100644 index 0000000..717c558 --- /dev/null +++ b/src/main/java/Animal.java @@ -0,0 +1,40 @@ +public abstract class Animal { + // Параметри тварини + protected double weight; + protected int maxNumberInLocation; + protected int movementSpeed; + protected double foodNeeded; + + protected int satiety; + protected boolean isAlive = true; + + protected Animal(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { + this.weight = weight; + this.maxNumberInLocation = maxNumberInLocation; + this.movementSpeed = movementSpeed; + this.foodNeeded = foodNeeded; + } + + public abstract void move(); + + public abstract void multiply(); + + public abstract boolean eat(); + + public double getWeight() { + return weight; + } + + public int getMaxNumberInLocation() { + return maxNumberInLocation; + } + + public boolean isAlive() { + return isAlive; + } + + public void setAlive(boolean alive) { + this.isAlive = alive; + } + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000..f5858db --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,5 @@ +public class Main { + public static void main(String[] args) { + + } +} \ No newline at end of file From 098095ce04ad3b16f048f5a171e797f8727885fb Mon Sep 17 00:00:00 2001 From: maxog Date: Wed, 29 Jan 2025 01:26:59 +0200 Subject: [PATCH 02/17] =?UTF-8?q?=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=96=D0=B2=20=D1=82=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Animal.java | 21 ++++++++++----------- src/main/java/Bear.java | 5 +++++ src/main/java/Boa.java | 5 +++++ src/main/java/Boar.java | 5 +++++ src/main/java/Buffalo.java | 5 +++++ src/main/java/Caterpillar.java | 5 +++++ src/main/java/Deer.java | 5 +++++ src/main/java/Duck.java | 5 +++++ src/main/java/Eagle.java | 5 +++++ src/main/java/Fox.java | 5 +++++ src/main/java/Goat.java | 5 +++++ src/main/java/Herbivore.java | 20 ++++++++++++++++++++ src/main/java/Horse.java | 5 +++++ src/main/java/Mouse.java | 5 +++++ src/main/java/Plant.java | 22 ++++++++++++++++++++++ src/main/java/Predator.java | 20 ++++++++++++++++++++ src/main/java/Rabbit.java | 5 +++++ src/main/java/Sheep.java | 5 +++++ src/main/java/Wolf.java | 5 +++++ 19 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 src/main/java/Bear.java create mode 100644 src/main/java/Boa.java create mode 100644 src/main/java/Boar.java create mode 100644 src/main/java/Buffalo.java create mode 100644 src/main/java/Caterpillar.java create mode 100644 src/main/java/Deer.java create mode 100644 src/main/java/Duck.java create mode 100644 src/main/java/Eagle.java create mode 100644 src/main/java/Fox.java create mode 100644 src/main/java/Goat.java create mode 100644 src/main/java/Herbivore.java create mode 100644 src/main/java/Horse.java create mode 100644 src/main/java/Mouse.java create mode 100644 src/main/java/Plant.java create mode 100644 src/main/java/Predator.java create mode 100644 src/main/java/Rabbit.java create mode 100644 src/main/java/Sheep.java create mode 100644 src/main/java/Wolf.java diff --git a/src/main/java/Animal.java b/src/main/java/Animal.java index 717c558..67d7280 100644 --- a/src/main/java/Animal.java +++ b/src/main/java/Animal.java @@ -1,14 +1,14 @@ public abstract class Animal { - // Параметри тварини - protected double weight; - protected int maxNumberInLocation; - protected int movementSpeed; - protected double foodNeeded; - protected int satiety; - protected boolean isAlive = true; + private final double weight; + private final int maxNumberInLocation; + private final int movementSpeed; + private final double foodNeeded; - protected Animal(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { + private int satiety; + private boolean isAlive = true; + + public Animal(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { this.weight = weight; this.maxNumberInLocation = maxNumberInLocation; this.movementSpeed = movementSpeed; @@ -33,8 +33,7 @@ public boolean isAlive() { return isAlive; } - public void setAlive(boolean alive) { - this.isAlive = alive; + public void setAlive(boolean alive){ + this.isAlive=alive; } - } diff --git a/src/main/java/Bear.java b/src/main/java/Bear.java new file mode 100644 index 0000000..ca39b6c --- /dev/null +++ b/src/main/java/Bear.java @@ -0,0 +1,5 @@ +public class Bear extends Predator{ + public Bear(){ + super(500,5,2,80); + } +} diff --git a/src/main/java/Boa.java b/src/main/java/Boa.java new file mode 100644 index 0000000..8220a71 --- /dev/null +++ b/src/main/java/Boa.java @@ -0,0 +1,5 @@ +public class Boa extends Predator{ + public Boa() { + super(15.0, 30, 1, 3); + } +} diff --git a/src/main/java/Boar.java b/src/main/java/Boar.java new file mode 100644 index 0000000..ff0e52d --- /dev/null +++ b/src/main/java/Boar.java @@ -0,0 +1,5 @@ +public class Boar extends Herbivore{ + public Boar(){ + super(400, 50, 2, 50); + } +} diff --git a/src/main/java/Buffalo.java b/src/main/java/Buffalo.java new file mode 100644 index 0000000..dcb0d83 --- /dev/null +++ b/src/main/java/Buffalo.java @@ -0,0 +1,5 @@ +public class Buffalo extends Herbivore{ + public Buffalo(){ + super(700, 10, 3, 100); + } +} diff --git a/src/main/java/Caterpillar.java b/src/main/java/Caterpillar.java new file mode 100644 index 0000000..7efdeb2 --- /dev/null +++ b/src/main/java/Caterpillar.java @@ -0,0 +1,5 @@ +public class Caterpillar extends Herbivore{ + public Caterpillar(){ + super(0.01, 1000, 0, 0); + } +} diff --git a/src/main/java/Deer.java b/src/main/java/Deer.java new file mode 100644 index 0000000..d9ff006 --- /dev/null +++ b/src/main/java/Deer.java @@ -0,0 +1,5 @@ +public class Deer extends Herbivore{ + public Deer(){ + super(300, 20, 4, 50); + } +} diff --git a/src/main/java/Duck.java b/src/main/java/Duck.java new file mode 100644 index 0000000..467e750 --- /dev/null +++ b/src/main/java/Duck.java @@ -0,0 +1,5 @@ +public class Duck extends Herbivore{ + public Duck(){ + super(1, 200, 4, 0.15); + } +} diff --git a/src/main/java/Eagle.java b/src/main/java/Eagle.java new file mode 100644 index 0000000..1f80461 --- /dev/null +++ b/src/main/java/Eagle.java @@ -0,0 +1,5 @@ +public class Eagle extends Predator{ + public Eagle(){ + super(6, 20, 3, 1); + } +} diff --git a/src/main/java/Fox.java b/src/main/java/Fox.java new file mode 100644 index 0000000..06e8442 --- /dev/null +++ b/src/main/java/Fox.java @@ -0,0 +1,5 @@ +public class Fox extends Predator{ + public Fox() { + super(8, 30, 2, 2); + } +} diff --git a/src/main/java/Goat.java b/src/main/java/Goat.java new file mode 100644 index 0000000..67ed440 --- /dev/null +++ b/src/main/java/Goat.java @@ -0,0 +1,5 @@ +public class Goat extends Herbivore{ + public Goat(){ + super(60, 140, 3, 10); + } +} diff --git a/src/main/java/Herbivore.java b/src/main/java/Herbivore.java new file mode 100644 index 0000000..57ff11b --- /dev/null +++ b/src/main/java/Herbivore.java @@ -0,0 +1,20 @@ +public class Herbivore extends Animal{ + public Herbivore(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { + super(weight, maxNumberInLocation, movementSpeed, foodNeeded); + } + + @Override + public void move() { + + } + + @Override + public void multiply() { + + } + + @Override + public boolean eat() { + return false; + } +} diff --git a/src/main/java/Horse.java b/src/main/java/Horse.java new file mode 100644 index 0000000..ffbdaf0 --- /dev/null +++ b/src/main/java/Horse.java @@ -0,0 +1,5 @@ +public class Horse extends Herbivore{ + public Horse(){ + super(400, 20, 4, 60); + } +} diff --git a/src/main/java/Mouse.java b/src/main/java/Mouse.java new file mode 100644 index 0000000..aee9dbf --- /dev/null +++ b/src/main/java/Mouse.java @@ -0,0 +1,5 @@ +public class Mouse extends Herbivore{ + public Mouse(){ + super(0.05, 500, 1, 0.01); + } +} diff --git a/src/main/java/Plant.java b/src/main/java/Plant.java new file mode 100644 index 0000000..b7e9165 --- /dev/null +++ b/src/main/java/Plant.java @@ -0,0 +1,22 @@ +public class Plant { + private static double weight=1; + private static final int maxNumberInLocation=200; + + private boolean isAlive; + + public double getWeight() { + return weight; + } + + public int getMaxNumberInLocation() { + return maxNumberInLocation; + } + + public boolean isAlive() { + return isAlive; + } + + public void setAlive(boolean alive) { + isAlive = alive; + } +} diff --git a/src/main/java/Predator.java b/src/main/java/Predator.java new file mode 100644 index 0000000..487c155 --- /dev/null +++ b/src/main/java/Predator.java @@ -0,0 +1,20 @@ +public class Predator extends Animal { + + public Predator(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { + super(weight, maxNumberInLocation, movementSpeed, foodNeeded); + } + + @Override + public void move() { + } + + @Override + public void multiply() { + + } + + @Override + public boolean eat() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/Rabbit.java b/src/main/java/Rabbit.java new file mode 100644 index 0000000..d37896f --- /dev/null +++ b/src/main/java/Rabbit.java @@ -0,0 +1,5 @@ +public class Rabbit extends Herbivore{ + public Rabbit(){ + super(2, 150, 2, 0.45); + } +} diff --git a/src/main/java/Sheep.java b/src/main/java/Sheep.java new file mode 100644 index 0000000..b7172ca --- /dev/null +++ b/src/main/java/Sheep.java @@ -0,0 +1,5 @@ +public class Sheep extends Herbivore{ + public Sheep(){ + super(70, 140, 3, 15); + } +} diff --git a/src/main/java/Wolf.java b/src/main/java/Wolf.java new file mode 100644 index 0000000..413c48b --- /dev/null +++ b/src/main/java/Wolf.java @@ -0,0 +1,5 @@ +public class Wolf extends Predator { + public Wolf() { + super(50.0, 30, 3, 8.0); + } +} From e93bff068a20ea10a8d65ac6507d8e2f1d44eef0 Mon Sep 17 00:00:00 2001 From: maxog Date: Wed, 29 Jan 2025 02:01:02 +0200 Subject: [PATCH 03/17] =?UTF-8?q?=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BC=D0=B0=D0=B9=D0=B1=D1=83=D1=82=D0=BD?= =?UTF-8?q?=D1=8C=D0=BE=D1=97=20=D1=80=D0=B5=D0=B0=D0=BB=D1=96=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D1=96=D1=97=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D1=96=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Island.java | 23 ++++++++++++++++++ src/main/java/Location.java | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/Island.java create mode 100644 src/main/java/Location.java diff --git a/src/main/java/Island.java b/src/main/java/Island.java new file mode 100644 index 0000000..4361b10 --- /dev/null +++ b/src/main/java/Island.java @@ -0,0 +1,23 @@ +import java.util.ArrayList; +import java.util.List; + +public class Island { + private final List> map = new ArrayList<>(); + + private static final int WIDTH = 100; + private static final int HEIGHT = 20; + + public Island() { + for (int x = 0; x < WIDTH; x++) { + List column = new ArrayList<>(); + for (int y = 0; y < HEIGHT; y++) { + column.add(new Location(x, y)); + } + map.add(column); + } + } + + public Location getLocation(int x, int y) { + return map.get(x).get(y); + } +} diff --git a/src/main/java/Location.java b/src/main/java/Location.java new file mode 100644 index 0000000..03278b2 --- /dev/null +++ b/src/main/java/Location.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.List; + +public class Location { + private final int x; + private final int y; + + private final List animals = new ArrayList<>(); + private final List plants = new ArrayList<>(); + + public Location(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public List getAnimals() { + return animals; + } + + public List getPlants() { + return plants; + } + + public void addAnimal(Animal animal) { + animals.add(animal); + } + + public void removeAnimal(Animal animal) { + animals.remove(animal); + } + + public void addPlant(Plant plant) { + plants.add(plant); + } + + public void removePlant(Plant plant) { + plants.remove(plant); + } +} From 90e287412b8bdbbb7a9af12443dd862b490f65b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9E=D0=B3=D0=BB?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D1=8F?= Date: Wed, 29 Jan 2025 19:23:22 +0200 Subject: [PATCH 04/17] Multiply feature --- src/main/java/Animal.java | 39 --------- src/main/java/Bear.java | 5 -- src/main/java/Boa.java | 5 -- src/main/java/Boar.java | 5 -- src/main/java/Buffalo.java | 5 -- src/main/java/Caterpillar.java | 5 -- src/main/java/Deer.java | 5 -- src/main/java/Duck.java | 5 -- src/main/java/Eagle.java | 5 -- src/main/java/Fox.java | 5 -- src/main/java/Goat.java | 5 -- src/main/java/Herbivore.java | 20 ----- src/main/java/Horse.java | 5 -- src/main/java/Mouse.java | 5 -- src/main/java/Predator.java | 20 ----- src/main/java/Rabbit.java | 5 -- src/main/java/Sheep.java | 5 -- src/main/java/Wolf.java | 5 -- src/main/java/entities/Animal.java | 105 +++++++++++++++++++++++ src/main/java/entities/Bear.java | 13 +++ src/main/java/entities/Boa.java | 13 +++ src/main/java/entities/Boar.java | 13 +++ src/main/java/entities/Buffalo.java | 13 +++ src/main/java/entities/Caterpillar.java | 13 +++ src/main/java/entities/Deer.java | 13 +++ src/main/java/entities/Duck.java | 13 +++ src/main/java/entities/Eagle.java | 13 +++ src/main/java/entities/Fox.java | 13 +++ src/main/java/entities/Goat.java | 13 +++ src/main/java/entities/Herbivore.java | 25 ++++++ src/main/java/entities/Horse.java | 13 +++ src/main/java/entities/Mouse.java | 13 +++ src/main/java/{ => entities}/Plant.java | 9 ++ src/main/java/entities/Predator.java | 25 ++++++ src/main/java/entities/Rabbit.java | 13 +++ src/main/java/entities/Sheep.java | 13 +++ src/main/java/entities/Wolf.java | 13 +++ src/main/java/{ => island}/Island.java | 10 +++ src/main/java/{ => island}/Location.java | 5 ++ 39 files changed, 374 insertions(+), 154 deletions(-) delete mode 100644 src/main/java/Animal.java delete mode 100644 src/main/java/Bear.java delete mode 100644 src/main/java/Boa.java delete mode 100644 src/main/java/Boar.java delete mode 100644 src/main/java/Buffalo.java delete mode 100644 src/main/java/Caterpillar.java delete mode 100644 src/main/java/Deer.java delete mode 100644 src/main/java/Duck.java delete mode 100644 src/main/java/Eagle.java delete mode 100644 src/main/java/Fox.java delete mode 100644 src/main/java/Goat.java delete mode 100644 src/main/java/Herbivore.java delete mode 100644 src/main/java/Horse.java delete mode 100644 src/main/java/Mouse.java delete mode 100644 src/main/java/Predator.java delete mode 100644 src/main/java/Rabbit.java delete mode 100644 src/main/java/Sheep.java delete mode 100644 src/main/java/Wolf.java create mode 100644 src/main/java/entities/Animal.java create mode 100644 src/main/java/entities/Bear.java create mode 100644 src/main/java/entities/Boa.java create mode 100644 src/main/java/entities/Boar.java create mode 100644 src/main/java/entities/Buffalo.java create mode 100644 src/main/java/entities/Caterpillar.java create mode 100644 src/main/java/entities/Deer.java create mode 100644 src/main/java/entities/Duck.java create mode 100644 src/main/java/entities/Eagle.java create mode 100644 src/main/java/entities/Fox.java create mode 100644 src/main/java/entities/Goat.java create mode 100644 src/main/java/entities/Herbivore.java create mode 100644 src/main/java/entities/Horse.java create mode 100644 src/main/java/entities/Mouse.java rename src/main/java/{ => entities}/Plant.java (74%) create mode 100644 src/main/java/entities/Predator.java create mode 100644 src/main/java/entities/Rabbit.java create mode 100644 src/main/java/entities/Sheep.java create mode 100644 src/main/java/entities/Wolf.java rename src/main/java/{ => island}/Island.java (81%) rename src/main/java/{ => island}/Location.java (93%) diff --git a/src/main/java/Animal.java b/src/main/java/Animal.java deleted file mode 100644 index 67d7280..0000000 --- a/src/main/java/Animal.java +++ /dev/null @@ -1,39 +0,0 @@ -public abstract class Animal { - - private final double weight; - private final int maxNumberInLocation; - private final int movementSpeed; - private final double foodNeeded; - - private int satiety; - private boolean isAlive = true; - - public Animal(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { - this.weight = weight; - this.maxNumberInLocation = maxNumberInLocation; - this.movementSpeed = movementSpeed; - this.foodNeeded = foodNeeded; - } - - public abstract void move(); - - public abstract void multiply(); - - public abstract boolean eat(); - - public double getWeight() { - return weight; - } - - public int getMaxNumberInLocation() { - return maxNumberInLocation; - } - - public boolean isAlive() { - return isAlive; - } - - public void setAlive(boolean alive){ - this.isAlive=alive; - } -} diff --git a/src/main/java/Bear.java b/src/main/java/Bear.java deleted file mode 100644 index ca39b6c..0000000 --- a/src/main/java/Bear.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Bear extends Predator{ - public Bear(){ - super(500,5,2,80); - } -} diff --git a/src/main/java/Boa.java b/src/main/java/Boa.java deleted file mode 100644 index 8220a71..0000000 --- a/src/main/java/Boa.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Boa extends Predator{ - public Boa() { - super(15.0, 30, 1, 3); - } -} diff --git a/src/main/java/Boar.java b/src/main/java/Boar.java deleted file mode 100644 index ff0e52d..0000000 --- a/src/main/java/Boar.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Boar extends Herbivore{ - public Boar(){ - super(400, 50, 2, 50); - } -} diff --git a/src/main/java/Buffalo.java b/src/main/java/Buffalo.java deleted file mode 100644 index dcb0d83..0000000 --- a/src/main/java/Buffalo.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Buffalo extends Herbivore{ - public Buffalo(){ - super(700, 10, 3, 100); - } -} diff --git a/src/main/java/Caterpillar.java b/src/main/java/Caterpillar.java deleted file mode 100644 index 7efdeb2..0000000 --- a/src/main/java/Caterpillar.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Caterpillar extends Herbivore{ - public Caterpillar(){ - super(0.01, 1000, 0, 0); - } -} diff --git a/src/main/java/Deer.java b/src/main/java/Deer.java deleted file mode 100644 index d9ff006..0000000 --- a/src/main/java/Deer.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Deer extends Herbivore{ - public Deer(){ - super(300, 20, 4, 50); - } -} diff --git a/src/main/java/Duck.java b/src/main/java/Duck.java deleted file mode 100644 index 467e750..0000000 --- a/src/main/java/Duck.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Duck extends Herbivore{ - public Duck(){ - super(1, 200, 4, 0.15); - } -} diff --git a/src/main/java/Eagle.java b/src/main/java/Eagle.java deleted file mode 100644 index 1f80461..0000000 --- a/src/main/java/Eagle.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Eagle extends Predator{ - public Eagle(){ - super(6, 20, 3, 1); - } -} diff --git a/src/main/java/Fox.java b/src/main/java/Fox.java deleted file mode 100644 index 06e8442..0000000 --- a/src/main/java/Fox.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Fox extends Predator{ - public Fox() { - super(8, 30, 2, 2); - } -} diff --git a/src/main/java/Goat.java b/src/main/java/Goat.java deleted file mode 100644 index 67ed440..0000000 --- a/src/main/java/Goat.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Goat extends Herbivore{ - public Goat(){ - super(60, 140, 3, 10); - } -} diff --git a/src/main/java/Herbivore.java b/src/main/java/Herbivore.java deleted file mode 100644 index 57ff11b..0000000 --- a/src/main/java/Herbivore.java +++ /dev/null @@ -1,20 +0,0 @@ -public class Herbivore extends Animal{ - public Herbivore(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { - super(weight, maxNumberInLocation, movementSpeed, foodNeeded); - } - - @Override - public void move() { - - } - - @Override - public void multiply() { - - } - - @Override - public boolean eat() { - return false; - } -} diff --git a/src/main/java/Horse.java b/src/main/java/Horse.java deleted file mode 100644 index ffbdaf0..0000000 --- a/src/main/java/Horse.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Horse extends Herbivore{ - public Horse(){ - super(400, 20, 4, 60); - } -} diff --git a/src/main/java/Mouse.java b/src/main/java/Mouse.java deleted file mode 100644 index aee9dbf..0000000 --- a/src/main/java/Mouse.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Mouse extends Herbivore{ - public Mouse(){ - super(0.05, 500, 1, 0.01); - } -} diff --git a/src/main/java/Predator.java b/src/main/java/Predator.java deleted file mode 100644 index 487c155..0000000 --- a/src/main/java/Predator.java +++ /dev/null @@ -1,20 +0,0 @@ -public class Predator extends Animal { - - public Predator(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded) { - super(weight, maxNumberInLocation, movementSpeed, foodNeeded); - } - - @Override - public void move() { - } - - @Override - public void multiply() { - - } - - @Override - public boolean eat() { - return false; - } -} \ No newline at end of file diff --git a/src/main/java/Rabbit.java b/src/main/java/Rabbit.java deleted file mode 100644 index d37896f..0000000 --- a/src/main/java/Rabbit.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Rabbit extends Herbivore{ - public Rabbit(){ - super(2, 150, 2, 0.45); - } -} diff --git a/src/main/java/Sheep.java b/src/main/java/Sheep.java deleted file mode 100644 index b7172ca..0000000 --- a/src/main/java/Sheep.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Sheep extends Herbivore{ - public Sheep(){ - super(70, 140, 3, 15); - } -} diff --git a/src/main/java/Wolf.java b/src/main/java/Wolf.java deleted file mode 100644 index 413c48b..0000000 --- a/src/main/java/Wolf.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Wolf extends Predator { - public Wolf() { - super(50.0, 30, 3, 8.0); - } -} diff --git a/src/main/java/entities/Animal.java b/src/main/java/entities/Animal.java new file mode 100644 index 0000000..90ca358 --- /dev/null +++ b/src/main/java/entities/Animal.java @@ -0,0 +1,105 @@ +package entities; + +import island.Island; +import island.Location; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.spi.AbstractResourceBundleProvider; + +public abstract class Animal { + + private final double weight; + private final int maxNumberInLocation; + private final int movementSpeed; + + private boolean isAlive = true; + private Location location; + + protected Animal(double weight, int maxNumberInLocation, int movementSpeed, Location location) { + this.weight = weight; + this.maxNumberInLocation = maxNumberInLocation; + this.movementSpeed = movementSpeed; + this.location=location; + location.addAnimal(this); + } + + public void move(Island island){ + if (!this.isAlive || this.movementSpeed==0){ + return; + } + + int direction = ThreadLocalRandom.current().nextInt(4); + + int steps = ThreadLocalRandom.current().nextInt(1, this.movementSpeed+1); + + int x = this.location.getX(); + int y = this.location.getY(); + + int newX = x; + int newY = y; + + switch (direction){ + case 0 -> newY=Math.max(y-steps, 0); //UP + case 1 -> newY=Math.min(y+steps, island.getHEIGHT() - 1); //DOWN + case 2 -> newX=Math.max(x-steps, 0); //LEFT + case 3 -> newX=Math.min(x+steps, island.getWIDTH() - 1); //RIGHT + default -> { + newX=x; + newY=y; + } + } + + this.location.removeAnimal(this); + + Location newLocation = island.getLocation(newX, newY); + newLocation.addAnimal(this); + + this.location=newLocation; + } + + public void multiply(){ + long sameSpecies = 0; + long potentialParents = 0; + + for(Animal animal : this.location.getAnimals()){ + if (animal.getClass().equals(this.getClass())){ + sameSpecies++; + if (animal.isAlive() && animal.isFull()){ + potentialParents++; + } + } + } + + if (potentialParents>=2 || sameSpecies=100; + } +} diff --git a/src/main/java/entities/Horse.java b/src/main/java/entities/Horse.java new file mode 100644 index 0000000..67d524f --- /dev/null +++ b/src/main/java/entities/Horse.java @@ -0,0 +1,13 @@ +package entities; + +import island.Location; + +public class Horse extends Herbivore { + public Horse(Location location){ + super(400, 20, 4, 60, location); + } + + public void reproduce() { + new Horse(this.getLocation()); + } +} diff --git a/src/main/java/entities/Mouse.java b/src/main/java/entities/Mouse.java new file mode 100644 index 0000000..c64f69c --- /dev/null +++ b/src/main/java/entities/Mouse.java @@ -0,0 +1,13 @@ +package entities; + +import island.Location; + +public class Mouse extends Herbivore { + public Mouse(Location location){ + super(0.05, 500, 1, 0.01, location); + } + + public void reproduce() { + new Mouse(this.getLocation()); + } +} diff --git a/src/main/java/Plant.java b/src/main/java/entities/Plant.java similarity index 74% rename from src/main/java/Plant.java rename to src/main/java/entities/Plant.java index b7e9165..916c5c5 100644 --- a/src/main/java/Plant.java +++ b/src/main/java/entities/Plant.java @@ -1,8 +1,17 @@ +package entities; + +import island.Location; + public class Plant { private static double weight=1; private static final int maxNumberInLocation=200; private boolean isAlive; + Location location; + + public Plant(Location location){ + this.location=location; + } public double getWeight() { return weight; diff --git a/src/main/java/entities/Predator.java b/src/main/java/entities/Predator.java new file mode 100644 index 0000000..b327e3d --- /dev/null +++ b/src/main/java/entities/Predator.java @@ -0,0 +1,25 @@ +package entities; + +import island.Location; + +public abstract class Predator extends Animal { + + private final double foodNeeded; + private int satiety; + + protected Predator(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded, Location location) { + super(weight, maxNumberInLocation, movementSpeed, location); + this.foodNeeded=foodNeeded; + } + + public abstract void reproduce(); + + @Override + public boolean eat() { + return true; + } + + public boolean isFull(){ + return satiety>=100; + } +} \ No newline at end of file diff --git a/src/main/java/entities/Rabbit.java b/src/main/java/entities/Rabbit.java new file mode 100644 index 0000000..dd03ed7 --- /dev/null +++ b/src/main/java/entities/Rabbit.java @@ -0,0 +1,13 @@ +package entities; + +import island.Location; + +public class Rabbit extends Herbivore { + public Rabbit(Location location){ + super(2, 150, 2, 0.45, location); + } + + public void reproduce() { + new Rabbit(this.getLocation()); + } +} diff --git a/src/main/java/entities/Sheep.java b/src/main/java/entities/Sheep.java new file mode 100644 index 0000000..65eff34 --- /dev/null +++ b/src/main/java/entities/Sheep.java @@ -0,0 +1,13 @@ +package entities; + +import island.Location; + +public class Sheep extends Herbivore { + public Sheep(Location location){ + super(70, 140, 3, 15, location); + } + + public void reproduce() { + new Sheep(this.getLocation()); + } +} diff --git a/src/main/java/entities/Wolf.java b/src/main/java/entities/Wolf.java new file mode 100644 index 0000000..20c8538 --- /dev/null +++ b/src/main/java/entities/Wolf.java @@ -0,0 +1,13 @@ +package entities; + +import island.Location; + +public class Wolf extends Predator { + public Wolf(Location location) { + super(50.0, 30, 3, 8.0, location); + } + + public void reproduce() { + new Wolf(this.getLocation()); + } +} diff --git a/src/main/java/Island.java b/src/main/java/island/Island.java similarity index 81% rename from src/main/java/Island.java rename to src/main/java/island/Island.java index 4361b10..1abdb11 100644 --- a/src/main/java/Island.java +++ b/src/main/java/island/Island.java @@ -1,3 +1,5 @@ +package island; + import java.util.ArrayList; import java.util.List; @@ -20,4 +22,12 @@ public Island() { public Location getLocation(int x, int y) { return map.get(x).get(y); } + + public int getHEIGHT() { + return HEIGHT; + } + + public int getWIDTH() { + return WIDTH; + } } diff --git a/src/main/java/Location.java b/src/main/java/island/Location.java similarity index 93% rename from src/main/java/Location.java rename to src/main/java/island/Location.java index 03278b2..51cdcd1 100644 --- a/src/main/java/Location.java +++ b/src/main/java/island/Location.java @@ -1,3 +1,8 @@ +package island; + +import entities.Animal; +import entities.Plant; + import java.util.ArrayList; import java.util.List; From a6d2ccfb44f875d49c82ce18b179d8b7177458ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9E=D0=B3=D0=BB?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D1=8F?= Date: Wed, 29 Jan 2025 19:56:51 +0200 Subject: [PATCH 05/17] Structure + eating chances --- .../{ => com/island_simulation}/Main.java | 2 + .../island_simulation}/entities/Animal.java | 9 +- .../island_simulation}/entities/Bear.java | 4 +- .../island_simulation}/entities/Boa.java | 4 +- .../island_simulation}/entities/Boar.java | 4 +- .../island_simulation}/entities/Buffalo.java | 4 +- .../entities/Caterpillar.java | 4 +- .../island_simulation}/entities/Deer.java | 4 +- .../island_simulation}/entities/Duck.java | 4 +- .../island_simulation}/entities/Eagle.java | 4 +- .../island_simulation}/entities/Fox.java | 4 +- .../island_simulation}/entities/Goat.java | 4 +- .../entities/Herbivore.java | 5 +- .../island_simulation}/entities/Horse.java | 4 +- .../island_simulation}/entities/Mouse.java | 4 +- .../island_simulation}/entities/Plant.java | 4 +- .../island_simulation}/entities/Predator.java | 5 +- .../island_simulation}/entities/Rabbit.java | 4 +- .../island_simulation}/entities/Sheep.java | 4 +- .../island_simulation}/entities/Wolf.java | 4 +- .../island_config/AnimalType.java | 20 +++ .../island_config/EatingChances.java | 122 ++++++++++++++++++ .../island_config}/Island.java | 2 +- .../island_config}/Location.java | 6 +- 24 files changed, 189 insertions(+), 46 deletions(-) rename src/main/java/{ => com/island_simulation}/Main.java (69%) rename src/main/java/{ => com/island_simulation}/entities/Animal.java (93%) rename src/main/java/{ => com/island_simulation}/entities/Bear.java (67%) rename src/main/java/{ => com/island_simulation}/entities/Boa.java (67%) rename src/main/java/{ => com/island_simulation}/entities/Boar.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Buffalo.java (69%) rename src/main/java/{ => com/island_simulation}/entities/Caterpillar.java (70%) rename src/main/java/{ => com/island_simulation}/entities/Deer.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Duck.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Eagle.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Fox.java (67%) rename src/main/java/{ => com/island_simulation}/entities/Goat.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Herbivore.java (83%) rename src/main/java/{ => com/island_simulation}/entities/Horse.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Mouse.java (69%) rename src/main/java/{ => com/island_simulation}/entities/Plant.java (85%) rename src/main/java/{ => com/island_simulation}/entities/Predator.java (82%) rename src/main/java/{ => com/island_simulation}/entities/Rabbit.java (69%) rename src/main/java/{ => com/island_simulation}/entities/Sheep.java (68%) rename src/main/java/{ => com/island_simulation}/entities/Wolf.java (68%) create mode 100644 src/main/java/com/island_simulation/island_config/AnimalType.java create mode 100644 src/main/java/com/island_simulation/island_config/EatingChances.java rename src/main/java/{island => com/island_simulation/island_config}/Island.java (94%) rename src/main/java/{island => com/island_simulation/island_config}/Location.java (86%) diff --git a/src/main/java/Main.java b/src/main/java/com/island_simulation/Main.java similarity index 69% rename from src/main/java/Main.java rename to src/main/java/com/island_simulation/Main.java index f5858db..5919b06 100644 --- a/src/main/java/Main.java +++ b/src/main/java/com/island_simulation/Main.java @@ -1,3 +1,5 @@ +package com.island_simulation; + public class Main { public static void main(String[] args) { diff --git a/src/main/java/entities/Animal.java b/src/main/java/com/island_simulation/entities/Animal.java similarity index 93% rename from src/main/java/entities/Animal.java rename to src/main/java/com/island_simulation/entities/Animal.java index 90ca358..c918dc4 100644 --- a/src/main/java/entities/Animal.java +++ b/src/main/java/com/island_simulation/entities/Animal.java @@ -1,12 +1,9 @@ -package entities; +package com.island_simulation.entities; -import island.Island; -import island.Location; +import com.island_simulation.island_config.Island; +import com.island_simulation.island_config.Location; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.ThreadLocalRandom; -import java.util.spi.AbstractResourceBundleProvider; public abstract class Animal { diff --git a/src/main/java/entities/Bear.java b/src/main/java/com/island_simulation/entities/Bear.java similarity index 67% rename from src/main/java/entities/Bear.java rename to src/main/java/com/island_simulation/entities/Bear.java index 9b4fadc..328b70d 100644 --- a/src/main/java/entities/Bear.java +++ b/src/main/java/com/island_simulation/entities/Bear.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Bear extends Predator { public Bear(Location location){ diff --git a/src/main/java/entities/Boa.java b/src/main/java/com/island_simulation/entities/Boa.java similarity index 67% rename from src/main/java/entities/Boa.java rename to src/main/java/com/island_simulation/entities/Boa.java index 42c6175..813c448 100644 --- a/src/main/java/entities/Boa.java +++ b/src/main/java/com/island_simulation/entities/Boa.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Boa extends Predator { public Boa(Location location) { diff --git a/src/main/java/entities/Boar.java b/src/main/java/com/island_simulation/entities/Boar.java similarity index 68% rename from src/main/java/entities/Boar.java rename to src/main/java/com/island_simulation/entities/Boar.java index 81ea0c6..9af1149 100644 --- a/src/main/java/entities/Boar.java +++ b/src/main/java/com/island_simulation/entities/Boar.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Boar extends Herbivore { public Boar(Location location){ diff --git a/src/main/java/entities/Buffalo.java b/src/main/java/com/island_simulation/entities/Buffalo.java similarity index 69% rename from src/main/java/entities/Buffalo.java rename to src/main/java/com/island_simulation/entities/Buffalo.java index 20b1c76..4ae0aad 100644 --- a/src/main/java/entities/Buffalo.java +++ b/src/main/java/com/island_simulation/entities/Buffalo.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Buffalo extends Herbivore { public Buffalo(Location location){ diff --git a/src/main/java/entities/Caterpillar.java b/src/main/java/com/island_simulation/entities/Caterpillar.java similarity index 70% rename from src/main/java/entities/Caterpillar.java rename to src/main/java/com/island_simulation/entities/Caterpillar.java index 89d7c7b..37e81f6 100644 --- a/src/main/java/entities/Caterpillar.java +++ b/src/main/java/com/island_simulation/entities/Caterpillar.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Caterpillar extends Herbivore { public Caterpillar(Location location){ diff --git a/src/main/java/entities/Deer.java b/src/main/java/com/island_simulation/entities/Deer.java similarity index 68% rename from src/main/java/entities/Deer.java rename to src/main/java/com/island_simulation/entities/Deer.java index f61ed6b..064af1e 100644 --- a/src/main/java/entities/Deer.java +++ b/src/main/java/com/island_simulation/entities/Deer.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Deer extends Herbivore { public Deer(Location location){ diff --git a/src/main/java/entities/Duck.java b/src/main/java/com/island_simulation/entities/Duck.java similarity index 68% rename from src/main/java/entities/Duck.java rename to src/main/java/com/island_simulation/entities/Duck.java index d60d55f..5947de4 100644 --- a/src/main/java/entities/Duck.java +++ b/src/main/java/com/island_simulation/entities/Duck.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Duck extends Herbivore { public Duck(Location location){ diff --git a/src/main/java/entities/Eagle.java b/src/main/java/com/island_simulation/entities/Eagle.java similarity index 68% rename from src/main/java/entities/Eagle.java rename to src/main/java/com/island_simulation/entities/Eagle.java index 7756300..da3ccd4 100644 --- a/src/main/java/entities/Eagle.java +++ b/src/main/java/com/island_simulation/entities/Eagle.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Eagle extends Predator { public Eagle(Location location){ diff --git a/src/main/java/entities/Fox.java b/src/main/java/com/island_simulation/entities/Fox.java similarity index 67% rename from src/main/java/entities/Fox.java rename to src/main/java/com/island_simulation/entities/Fox.java index 63440a1..f0eb57d 100644 --- a/src/main/java/entities/Fox.java +++ b/src/main/java/com/island_simulation/entities/Fox.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Fox extends Predator { public Fox(Location location) { diff --git a/src/main/java/entities/Goat.java b/src/main/java/com/island_simulation/entities/Goat.java similarity index 68% rename from src/main/java/entities/Goat.java rename to src/main/java/com/island_simulation/entities/Goat.java index 8bb3e12..7d95712 100644 --- a/src/main/java/entities/Goat.java +++ b/src/main/java/com/island_simulation/entities/Goat.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Goat extends Herbivore { public Goat(Location location){ diff --git a/src/main/java/entities/Herbivore.java b/src/main/java/com/island_simulation/entities/Herbivore.java similarity index 83% rename from src/main/java/entities/Herbivore.java rename to src/main/java/com/island_simulation/entities/Herbivore.java index 4ec5223..9d2f76e 100644 --- a/src/main/java/entities/Herbivore.java +++ b/src/main/java/com/island_simulation/entities/Herbivore.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public abstract class Herbivore extends Animal { @@ -19,6 +19,7 @@ public boolean eat() { return false; } + @Override public boolean isFull(){ return satiety>=100; } diff --git a/src/main/java/entities/Horse.java b/src/main/java/com/island_simulation/entities/Horse.java similarity index 68% rename from src/main/java/entities/Horse.java rename to src/main/java/com/island_simulation/entities/Horse.java index 67d524f..37b1bd8 100644 --- a/src/main/java/entities/Horse.java +++ b/src/main/java/com/island_simulation/entities/Horse.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Horse extends Herbivore { public Horse(Location location){ diff --git a/src/main/java/entities/Mouse.java b/src/main/java/com/island_simulation/entities/Mouse.java similarity index 69% rename from src/main/java/entities/Mouse.java rename to src/main/java/com/island_simulation/entities/Mouse.java index c64f69c..602b300 100644 --- a/src/main/java/entities/Mouse.java +++ b/src/main/java/com/island_simulation/entities/Mouse.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Mouse extends Herbivore { public Mouse(Location location){ diff --git a/src/main/java/entities/Plant.java b/src/main/java/com/island_simulation/entities/Plant.java similarity index 85% rename from src/main/java/entities/Plant.java rename to src/main/java/com/island_simulation/entities/Plant.java index 916c5c5..0c0930e 100644 --- a/src/main/java/entities/Plant.java +++ b/src/main/java/com/island_simulation/entities/Plant.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Plant { private static double weight=1; diff --git a/src/main/java/entities/Predator.java b/src/main/java/com/island_simulation/entities/Predator.java similarity index 82% rename from src/main/java/entities/Predator.java rename to src/main/java/com/island_simulation/entities/Predator.java index b327e3d..8401aff 100644 --- a/src/main/java/entities/Predator.java +++ b/src/main/java/com/island_simulation/entities/Predator.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public abstract class Predator extends Animal { @@ -19,6 +19,7 @@ public boolean eat() { return true; } + @Override public boolean isFull(){ return satiety>=100; } diff --git a/src/main/java/entities/Rabbit.java b/src/main/java/com/island_simulation/entities/Rabbit.java similarity index 69% rename from src/main/java/entities/Rabbit.java rename to src/main/java/com/island_simulation/entities/Rabbit.java index dd03ed7..c6dab30 100644 --- a/src/main/java/entities/Rabbit.java +++ b/src/main/java/com/island_simulation/entities/Rabbit.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Rabbit extends Herbivore { public Rabbit(Location location){ diff --git a/src/main/java/entities/Sheep.java b/src/main/java/com/island_simulation/entities/Sheep.java similarity index 68% rename from src/main/java/entities/Sheep.java rename to src/main/java/com/island_simulation/entities/Sheep.java index 65eff34..ad656eb 100644 --- a/src/main/java/entities/Sheep.java +++ b/src/main/java/com/island_simulation/entities/Sheep.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Sheep extends Herbivore { public Sheep(Location location){ diff --git a/src/main/java/entities/Wolf.java b/src/main/java/com/island_simulation/entities/Wolf.java similarity index 68% rename from src/main/java/entities/Wolf.java rename to src/main/java/com/island_simulation/entities/Wolf.java index 20c8538..c612ab7 100644 --- a/src/main/java/entities/Wolf.java +++ b/src/main/java/com/island_simulation/entities/Wolf.java @@ -1,6 +1,6 @@ -package entities; +package com.island_simulation.entities; -import island.Location; +import com.island_simulation.island_config.Location; public class Wolf extends Predator { public Wolf(Location location) { diff --git a/src/main/java/com/island_simulation/island_config/AnimalType.java b/src/main/java/com/island_simulation/island_config/AnimalType.java new file mode 100644 index 0000000..9bf8fb4 --- /dev/null +++ b/src/main/java/com/island_simulation/island_config/AnimalType.java @@ -0,0 +1,20 @@ +package com.island_simulation.island_config; + +public enum AnimalType { + BEAR, + BOA, + BOAR, + BUFFALO, + CATERPILLAR, + DEER, + DUCK, + EAGLE, + FOX, + GOAT, + HORSE, + MOUSE, + RABBIT, + SHEEP, + WOLF, + PLANT +} \ No newline at end of file diff --git a/src/main/java/com/island_simulation/island_config/EatingChances.java b/src/main/java/com/island_simulation/island_config/EatingChances.java new file mode 100644 index 0000000..8f886aa --- /dev/null +++ b/src/main/java/com/island_simulation/island_config/EatingChances.java @@ -0,0 +1,122 @@ +package com.island_simulation.island_config; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class EatingChances { + public static final Map> CHANCE_MAP = new HashMap<>(); + + static { + // === Вовк (WOLF) === + Map wolfMap = new HashMap<>(); + wolfMap.put(AnimalType.HORSE, 10); + wolfMap.put(AnimalType.DEER, 15); + wolfMap.put(AnimalType.RABBIT, 60); + wolfMap.put(AnimalType.MOUSE, 80); + wolfMap.put(AnimalType.GOAT, 60); + wolfMap.put(AnimalType.SHEEP, 70); + wolfMap.put(AnimalType.BOAR, 15); + wolfMap.put(AnimalType.BUFFALO, 10); + wolfMap.put(AnimalType.DUCK, 40); + CHANCE_MAP.put(AnimalType.WOLF, wolfMap); + + // === Удав (BOA) === + Map boaMap = new HashMap<>(); + boaMap.put(AnimalType.FOX, 15); + boaMap.put(AnimalType.RABBIT, 20); + boaMap.put(AnimalType.MOUSE, 40); + boaMap.put(AnimalType.DUCK, 10); + CHANCE_MAP.put(AnimalType.BOA, boaMap); + + // === Лисиця (FOX) === + Map foxMap = new HashMap<>(); + foxMap.put(AnimalType.RABBIT, 70); + foxMap.put(AnimalType.MOUSE, 90); + foxMap.put(AnimalType.DUCK, 60); + foxMap.put(AnimalType.CATERPILLAR, 40); + CHANCE_MAP.put(AnimalType.FOX, foxMap); + + // === Ведмідь (BEAR) === + Map bearMap = new HashMap<>(); + bearMap.put(AnimalType.BOA, 80); + bearMap.put(AnimalType.HORSE, 40); + bearMap.put(AnimalType.DEER, 80); + bearMap.put(AnimalType.RABBIT, 80); + bearMap.put(AnimalType.MOUSE, 90); + bearMap.put(AnimalType.GOAT, 70); + bearMap.put(AnimalType.SHEEP, 70); + bearMap.put(AnimalType.BOAR, 50); + bearMap.put(AnimalType.BUFFALO, 20); + bearMap.put(AnimalType.DUCK, 10); + CHANCE_MAP.put(AnimalType.BEAR, bearMap); + + // === Орел (EAGLE) === + Map eagleMap = new HashMap<>(); + eagleMap.put(AnimalType.FOX, 10); + eagleMap.put(AnimalType.RABBIT, 90); + eagleMap.put(AnimalType.MOUSE, 90); + eagleMap.put(AnimalType.DUCK, 80); + CHANCE_MAP.put(AnimalType.EAGLE, eagleMap); + + // === Кінь (HORSE) === + Map horseMap = new HashMap<>(); + horseMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.HORSE, horseMap); + + // === Олень (DEER) === + Map deerMap = new HashMap<>(); + deerMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.DEER, deerMap); + + // === Кролик (RABBIT) === + Map rabbitMap = new HashMap<>(); + rabbitMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.RABBIT, rabbitMap); + + // === Миша (MOUSE) === + Map mouseMap = new HashMap<>(); + mouseMap.put(AnimalType.CATERPILLAR, 90); + mouseMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.MOUSE, mouseMap); + + // === Коза (GOAT) === + Map goatMap = new HashMap<>(); + goatMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.GOAT, goatMap); + + // === Вівця (SHEEP) === + Map sheepMap = new HashMap<>(); + sheepMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.SHEEP, sheepMap); + + // === Кабан (BOAR) === + Map boarMap = new HashMap<>(); + boarMap.put(AnimalType.MOUSE, 50); + boarMap.put(AnimalType.CATERPILLAR, 90); + boarMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.BOAR, boarMap); + + // === Буйвол (BUFFALO) === + Map buffaloMap = new HashMap<>(); + buffaloMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.BUFFALO, buffaloMap); + + // === Качка (DUCK) === + Map duckMap = new HashMap<>(); + duckMap.put(AnimalType.CATERPILLAR, 90); + duckMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.DUCK, duckMap); + + // === Гусінь (CATERPILLAR) === + Map caterpillarMap = new HashMap<>(); + caterpillarMap.put(AnimalType.PLANT, 100); + CHANCE_MAP.put(AnimalType.CATERPILLAR, caterpillarMap); + } + + public static int getChance(AnimalType predator, AnimalType prey) { + return CHANCE_MAP + .getOrDefault(predator, Collections.emptyMap()) + .getOrDefault(prey, 0); + } +} diff --git a/src/main/java/island/Island.java b/src/main/java/com/island_simulation/island_config/Island.java similarity index 94% rename from src/main/java/island/Island.java rename to src/main/java/com/island_simulation/island_config/Island.java index 1abdb11..70fad77 100644 --- a/src/main/java/island/Island.java +++ b/src/main/java/com/island_simulation/island_config/Island.java @@ -1,4 +1,4 @@ -package island; +package com.island_simulation.island_config; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/island/Location.java b/src/main/java/com/island_simulation/island_config/Location.java similarity index 86% rename from src/main/java/island/Location.java rename to src/main/java/com/island_simulation/island_config/Location.java index 51cdcd1..5e5a768 100644 --- a/src/main/java/island/Location.java +++ b/src/main/java/com/island_simulation/island_config/Location.java @@ -1,7 +1,7 @@ -package island; +package com.island_simulation.island_config; -import entities.Animal; -import entities.Plant; +import com.island_simulation.entities.Animal; +import com.island_simulation.entities.Plant; import java.util.ArrayList; import java.util.List; From 11cbee67f931c29cc0d51dd3b6e57ff9407145f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9E=D0=B3=D0=BB?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D1=8F?= Date: Wed, 29 Jan 2025 20:03:41 +0200 Subject: [PATCH 06/17] Structure update + multiply fix --- .../java/com/{island_simulation => island}/Main.java | 2 +- .../island_config => island/config}/AnimalType.java | 2 +- .../config}/EatingChances.java | 2 +- .../island_config => island/config}/Island.java | 2 +- .../island_config => island/config}/Location.java | 6 +++--- .../entities/Animal.java | 11 +++++++---- .../{island_simulation => island}/entities/Bear.java | 4 ++-- .../{island_simulation => island}/entities/Boa.java | 4 ++-- .../{island_simulation => island}/entities/Boar.java | 4 ++-- .../entities/Buffalo.java | 4 ++-- .../entities/Caterpillar.java | 4 ++-- .../{island_simulation => island}/entities/Deer.java | 4 ++-- .../{island_simulation => island}/entities/Duck.java | 4 ++-- .../{island_simulation => island}/entities/Eagle.java | 4 ++-- .../{island_simulation => island}/entities/Fox.java | 4 ++-- .../{island_simulation => island}/entities/Goat.java | 4 ++-- .../entities/Herbivore.java | 4 ++-- .../{island_simulation => island}/entities/Horse.java | 4 ++-- .../{island_simulation => island}/entities/Mouse.java | 4 ++-- .../{island_simulation => island}/entities/Plant.java | 4 ++-- .../entities/Predator.java | 4 ++-- .../entities/Rabbit.java | 4 ++-- .../{island_simulation => island}/entities/Sheep.java | 4 ++-- .../{island_simulation => island}/entities/Wolf.java | 4 ++-- 24 files changed, 50 insertions(+), 47 deletions(-) rename src/main/java/com/{island_simulation => island}/Main.java (70%) rename src/main/java/com/{island_simulation/island_config => island/config}/AnimalType.java (81%) rename src/main/java/com/{island_simulation/island_config => island/config}/EatingChances.java (99%) rename src/main/java/com/{island_simulation/island_config => island/config}/Island.java (94%) rename src/main/java/com/{island_simulation/island_config => island/config}/Location.java (86%) rename src/main/java/com/{island_simulation => island}/entities/Animal.java (93%) rename src/main/java/com/{island_simulation => island}/entities/Bear.java (67%) rename src/main/java/com/{island_simulation => island}/entities/Boa.java (67%) rename src/main/java/com/{island_simulation => island}/entities/Boar.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Buffalo.java (69%) rename src/main/java/com/{island_simulation => island}/entities/Caterpillar.java (70%) rename src/main/java/com/{island_simulation => island}/entities/Deer.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Duck.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Eagle.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Fox.java (67%) rename src/main/java/com/{island_simulation => island}/entities/Goat.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Herbivore.java (85%) rename src/main/java/com/{island_simulation => island}/entities/Horse.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Mouse.java (69%) rename src/main/java/com/{island_simulation => island}/entities/Plant.java (85%) rename src/main/java/com/{island_simulation => island}/entities/Predator.java (85%) rename src/main/java/com/{island_simulation => island}/entities/Rabbit.java (69%) rename src/main/java/com/{island_simulation => island}/entities/Sheep.java (68%) rename src/main/java/com/{island_simulation => island}/entities/Wolf.java (68%) diff --git a/src/main/java/com/island_simulation/Main.java b/src/main/java/com/island/Main.java similarity index 70% rename from src/main/java/com/island_simulation/Main.java rename to src/main/java/com/island/Main.java index 5919b06..669c38f 100644 --- a/src/main/java/com/island_simulation/Main.java +++ b/src/main/java/com/island/Main.java @@ -1,4 +1,4 @@ -package com.island_simulation; +package com.island; public class Main { public static void main(String[] args) { diff --git a/src/main/java/com/island_simulation/island_config/AnimalType.java b/src/main/java/com/island/config/AnimalType.java similarity index 81% rename from src/main/java/com/island_simulation/island_config/AnimalType.java rename to src/main/java/com/island/config/AnimalType.java index 9bf8fb4..80831e2 100644 --- a/src/main/java/com/island_simulation/island_config/AnimalType.java +++ b/src/main/java/com/island/config/AnimalType.java @@ -1,4 +1,4 @@ -package com.island_simulation.island_config; +package com.island.config; public enum AnimalType { BEAR, diff --git a/src/main/java/com/island_simulation/island_config/EatingChances.java b/src/main/java/com/island/config/EatingChances.java similarity index 99% rename from src/main/java/com/island_simulation/island_config/EatingChances.java rename to src/main/java/com/island/config/EatingChances.java index 8f886aa..4e15f20 100644 --- a/src/main/java/com/island_simulation/island_config/EatingChances.java +++ b/src/main/java/com/island/config/EatingChances.java @@ -1,4 +1,4 @@ -package com.island_simulation.island_config; +package com.island.config; import java.util.Collections; import java.util.HashMap; diff --git a/src/main/java/com/island_simulation/island_config/Island.java b/src/main/java/com/island/config/Island.java similarity index 94% rename from src/main/java/com/island_simulation/island_config/Island.java rename to src/main/java/com/island/config/Island.java index 70fad77..1186953 100644 --- a/src/main/java/com/island_simulation/island_config/Island.java +++ b/src/main/java/com/island/config/Island.java @@ -1,4 +1,4 @@ -package com.island_simulation.island_config; +package com.island.config; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/island_simulation/island_config/Location.java b/src/main/java/com/island/config/Location.java similarity index 86% rename from src/main/java/com/island_simulation/island_config/Location.java rename to src/main/java/com/island/config/Location.java index 5e5a768..c81c81b 100644 --- a/src/main/java/com/island_simulation/island_config/Location.java +++ b/src/main/java/com/island/config/Location.java @@ -1,7 +1,7 @@ -package com.island_simulation.island_config; +package com.island.config; -import com.island_simulation.entities.Animal; -import com.island_simulation.entities.Plant; +import com.island.entities.Animal; +import com.island.entities.Plant; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/island_simulation/entities/Animal.java b/src/main/java/com/island/entities/Animal.java similarity index 93% rename from src/main/java/com/island_simulation/entities/Animal.java rename to src/main/java/com/island/entities/Animal.java index c918dc4..855712e 100644 --- a/src/main/java/com/island_simulation/entities/Animal.java +++ b/src/main/java/com/island/entities/Animal.java @@ -1,7 +1,7 @@ -package com.island_simulation.entities; +package com.island.entities; -import com.island_simulation.island_config.Island; -import com.island_simulation.island_config.Location; +import com.island.config.Island; +import com.island.config.Location; import java.util.concurrent.ThreadLocalRandom; @@ -56,7 +56,7 @@ public void move(Island island){ this.location=newLocation; } - public void multiply(){ + public boolean multiply(){ long sameSpecies = 0; long potentialParents = 0; @@ -71,7 +71,10 @@ public void multiply(){ if (potentialParents>=2 || sameSpecies Date: Wed, 29 Jan 2025 20:37:32 +0200 Subject: [PATCH 07/17] eat for predators --- src/main/java/com/island/entities/Animal.java | 16 ++++-- src/main/java/com/island/entities/Bear.java | 7 +++ src/main/java/com/island/entities/Boa.java | 7 +++ src/main/java/com/island/entities/Boar.java | 7 +++ .../java/com/island/entities/Buffalo.java | 7 +++ .../java/com/island/entities/Caterpillar.java | 7 +++ src/main/java/com/island/entities/Deer.java | 7 +++ src/main/java/com/island/entities/Duck.java | 7 +++ src/main/java/com/island/entities/Eagle.java | 7 +++ src/main/java/com/island/entities/Fox.java | 7 +++ src/main/java/com/island/entities/Goat.java | 7 +++ .../java/com/island/entities/Herbivore.java | 6 ++- src/main/java/com/island/entities/Horse.java | 7 +++ src/main/java/com/island/entities/Mouse.java | 7 +++ src/main/java/com/island/entities/Plant.java | 9 +++- .../java/com/island/entities/Predator.java | 53 ++++++++++++++++++- src/main/java/com/island/entities/Rabbit.java | 7 +++ src/main/java/com/island/entities/Sheep.java | 7 +++ src/main/java/com/island/entities/Wolf.java | 7 +++ 19 files changed, 180 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/island/entities/Animal.java b/src/main/java/com/island/entities/Animal.java index 855712e..c6ba038 100644 --- a/src/main/java/com/island/entities/Animal.java +++ b/src/main/java/com/island/entities/Animal.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Island; import com.island.config.Location; @@ -22,9 +23,9 @@ protected Animal(double weight, int maxNumberInLocation, int movementSpeed, Loca location.addAnimal(this); } - public void move(Island island){ + public boolean move(Island island){ if (!this.isAlive || this.movementSpeed==0){ - return; + return false; } int direction = ThreadLocalRandom.current().nextInt(4); @@ -43,17 +44,22 @@ public void move(Island island){ case 2 -> newX=Math.max(x-steps, 0); //LEFT case 3 -> newX=Math.min(x+steps, island.getWIDTH() - 1); //RIGHT default -> { - newX=x; - newY=y; + return false; } } + if (newX == x && newY == y) { + return false; + } + this.location.removeAnimal(this); Location newLocation = island.getLocation(newX, newY); newLocation.addAnimal(this); this.location=newLocation; + + return true; } public boolean multiply(){ @@ -83,6 +89,8 @@ public boolean multiply(){ public abstract boolean eat(); + public abstract AnimalType getType(); + public double getWeight() { return weight; } diff --git a/src/main/java/com/island/entities/Bear.java b/src/main/java/com/island/entities/Bear.java index 07e7262..e7323fc 100644 --- a/src/main/java/com/island/entities/Bear.java +++ b/src/main/java/com/island/entities/Bear.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Bear extends Predator { @@ -7,7 +8,13 @@ public Bear(Location location){ super(500,5,2,80, location); } + @Override public void reproduce() { new Bear(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.BEAR; + } } diff --git a/src/main/java/com/island/entities/Boa.java b/src/main/java/com/island/entities/Boa.java index 7fbcad7..fc7ceea 100644 --- a/src/main/java/com/island/entities/Boa.java +++ b/src/main/java/com/island/entities/Boa.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Boa extends Predator { @@ -7,7 +8,13 @@ public Boa(Location location) { super(15.0, 30, 1, 3, location); } + @Override public void reproduce() { new Boa(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.BOA; + } } diff --git a/src/main/java/com/island/entities/Boar.java b/src/main/java/com/island/entities/Boar.java index bda5b3c..4fc0a6a 100644 --- a/src/main/java/com/island/entities/Boar.java +++ b/src/main/java/com/island/entities/Boar.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Boar extends Herbivore { @@ -7,7 +8,13 @@ public Boar(Location location){ super(400, 50, 2, 50, location); } + @Override public void reproduce() { new Boar(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.BOAR; + } } diff --git a/src/main/java/com/island/entities/Buffalo.java b/src/main/java/com/island/entities/Buffalo.java index 35d8d2c..4a61941 100644 --- a/src/main/java/com/island/entities/Buffalo.java +++ b/src/main/java/com/island/entities/Buffalo.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Buffalo extends Herbivore { @@ -7,7 +8,13 @@ public Buffalo(Location location){ super(700, 10, 3, 100, location); } + @Override public void reproduce() { new Buffalo(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.BUFFALO; + } } diff --git a/src/main/java/com/island/entities/Caterpillar.java b/src/main/java/com/island/entities/Caterpillar.java index 03c3560..eeec8bd 100644 --- a/src/main/java/com/island/entities/Caterpillar.java +++ b/src/main/java/com/island/entities/Caterpillar.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Caterpillar extends Herbivore { @@ -7,7 +8,13 @@ public Caterpillar(Location location){ super(0.01, 1000, 0, 0, location); } + @Override public void reproduce() { new Caterpillar(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.CATERPILLAR; + } } diff --git a/src/main/java/com/island/entities/Deer.java b/src/main/java/com/island/entities/Deer.java index d30c749..4bb11f7 100644 --- a/src/main/java/com/island/entities/Deer.java +++ b/src/main/java/com/island/entities/Deer.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Deer extends Herbivore { @@ -7,7 +8,13 @@ public Deer(Location location){ super(300, 20, 4, 50, location); } + @Override public void reproduce() { new Deer(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.DEER; + } } diff --git a/src/main/java/com/island/entities/Duck.java b/src/main/java/com/island/entities/Duck.java index b03c0d8..9772cb4 100644 --- a/src/main/java/com/island/entities/Duck.java +++ b/src/main/java/com/island/entities/Duck.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Duck extends Herbivore { @@ -7,7 +8,13 @@ public Duck(Location location){ super(1, 200, 4, 0.15, location); } + @Override public void reproduce() { new Duck(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.DUCK; + } } diff --git a/src/main/java/com/island/entities/Eagle.java b/src/main/java/com/island/entities/Eagle.java index a3e04c4..f48e2e7 100644 --- a/src/main/java/com/island/entities/Eagle.java +++ b/src/main/java/com/island/entities/Eagle.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Eagle extends Predator { @@ -7,7 +8,13 @@ public Eagle(Location location){ super(6, 20, 3, 1, location); } + @Override public void reproduce() { new Eagle(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.EAGLE; + } } diff --git a/src/main/java/com/island/entities/Fox.java b/src/main/java/com/island/entities/Fox.java index 9a2b5f5..c5ec4e1 100644 --- a/src/main/java/com/island/entities/Fox.java +++ b/src/main/java/com/island/entities/Fox.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Fox extends Predator { @@ -7,7 +8,13 @@ public Fox(Location location) { super(8, 30, 2, 2, location); } + @Override public void reproduce() { new Fox(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.FOX; + } } diff --git a/src/main/java/com/island/entities/Goat.java b/src/main/java/com/island/entities/Goat.java index ffa946b..6511903 100644 --- a/src/main/java/com/island/entities/Goat.java +++ b/src/main/java/com/island/entities/Goat.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Goat extends Herbivore { @@ -7,7 +8,13 @@ public Goat(Location location){ super(60, 140, 3, 10, location); } + @Override public void reproduce() { new Goat(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.GOAT; + } } diff --git a/src/main/java/com/island/entities/Herbivore.java b/src/main/java/com/island/entities/Herbivore.java index 343dc31..9f5a911 100644 --- a/src/main/java/com/island/entities/Herbivore.java +++ b/src/main/java/com/island/entities/Herbivore.java @@ -1,11 +1,12 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public abstract class Herbivore extends Animal { private final double foodNeeded; - private int satiety; + private double satiety; protected Herbivore(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded, Location location) { super(weight, maxNumberInLocation, movementSpeed, location); @@ -14,6 +15,9 @@ protected Herbivore(double weight, int maxNumberInLocation, int movementSpeed, d public abstract void reproduce(); + public abstract AnimalType getType(); + + @Override public boolean eat() { return false; diff --git a/src/main/java/com/island/entities/Horse.java b/src/main/java/com/island/entities/Horse.java index b3820be..7d5ced7 100644 --- a/src/main/java/com/island/entities/Horse.java +++ b/src/main/java/com/island/entities/Horse.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Horse extends Herbivore { @@ -7,7 +8,13 @@ public Horse(Location location){ super(400, 20, 4, 60, location); } + @Override public void reproduce() { new Horse(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.HORSE; + } } diff --git a/src/main/java/com/island/entities/Mouse.java b/src/main/java/com/island/entities/Mouse.java index 3a9c37d..06d3f68 100644 --- a/src/main/java/com/island/entities/Mouse.java +++ b/src/main/java/com/island/entities/Mouse.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Mouse extends Herbivore { @@ -7,7 +8,13 @@ public Mouse(Location location){ super(0.05, 500, 1, 0.01, location); } + @Override public void reproduce() { new Mouse(this.getLocation()); } + + @Override + public AnimalType getType() { + return AnimalType.MOUSE; + } } diff --git a/src/main/java/com/island/entities/Plant.java b/src/main/java/com/island/entities/Plant.java index df1d4c4..9c819f5 100644 --- a/src/main/java/com/island/entities/Plant.java +++ b/src/main/java/com/island/entities/Plant.java @@ -1,5 +1,6 @@ package com.island.entities; +import com.island.config.AnimalType; import com.island.config.Location; public class Plant { @@ -25,7 +26,11 @@ public boolean isAlive() { return isAlive; } - public void setAlive(boolean alive) { - isAlive = alive; + public void setDead() { + isAlive = false; + } + + public AnimalType getType(){ + return AnimalType.PLANT; } } diff --git a/src/main/java/com/island/entities/Predator.java b/src/main/java/com/island/entities/Predator.java index d42592f..8b684e9 100644 --- a/src/main/java/com/island/entities/Predator.java +++ b/src/main/java/com/island/entities/Predator.java @@ -1,11 +1,16 @@ package com.island.entities; +import com.island.config.AnimalType; +import com.island.config.EatingChances; import com.island.config.Location; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + public abstract class Predator extends Animal { private final double foodNeeded; - private int satiety; + private double satiety; protected Predator(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded, Location location) { super(weight, maxNumberInLocation, movementSpeed, location); @@ -14,9 +19,53 @@ protected Predator(double weight, int maxNumberInLocation, int movementSpeed, do public abstract void reproduce(); + public abstract AnimalType getType(); + + protected void increaseSatiety(double eatenWeight){ + double newSatiety = (eatenWeight / this.foodNeeded) * 100; + + this.satiety += newSatiety; + if (this.satiety>100){ + this.satiety=100; + } + } + + public void decreaseSatiety(){ + if (this.isAlive() && this.satiety>0){ + double reduceSatiety = this.getWeight()*ThreadLocalRandom.current().nextDouble(0,0.5); + satiety = Math.max(0, this.satiety - reduceSatiety); + } else { + this.setDead(); + } + } + @Override public boolean eat() { - return true; + if (!this.isAlive() || this.isFull()){ + return false; + } + + List animalsHere = this.getLocation().getAnimals(); + + for (Animal victim : animalsHere){ + int chance = EatingChances.getChance(this.getType(),victim.getType()); + + if (victim==this || !victim.isAlive() || chance<=0){ + continue; + } + + int roll = ThreadLocalRandom.current().nextInt(100); + if (roll Date: Wed, 29 Jan 2025 20:57:32 +0200 Subject: [PATCH 08/17] eat for herbivores --- src/main/java/com/island/entities/Boar.java | 42 ++++++++++++++++++ src/main/java/com/island/entities/Duck.java | 42 ++++++++++++++++++ .../java/com/island/entities/Herbivore.java | 43 +++++++++++++++++++ src/main/java/com/island/entities/Mouse.java | 42 ++++++++++++++++++ src/main/java/com/island/entities/Plant.java | 9 ---- 5 files changed, 169 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/island/entities/Boar.java b/src/main/java/com/island/entities/Boar.java index 4fc0a6a..94a3b66 100644 --- a/src/main/java/com/island/entities/Boar.java +++ b/src/main/java/com/island/entities/Boar.java @@ -1,13 +1,55 @@ package com.island.entities; import com.island.config.AnimalType; +import com.island.config.EatingChances; import com.island.config.Location; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + public class Boar extends Herbivore { public Boar(Location location){ super(400, 50, 2, 50, location); } + private boolean tryEatOther(){ + if (!this.isAlive() || this.isFull()){ + return false; + } + + List animalsHere = this.getLocation().getAnimals(); + + for (Animal victim : animalsHere){ + int chance = EatingChances.getChance(this.getType(),victim.getType()); + + if (victim==this || !victim.isAlive() || chance<=0){ + continue; + } + + int roll = ThreadLocalRandom.current().nextInt(100); + if (roll animalsHere = this.getLocation().getAnimals(); + + for (Animal victim : animalsHere){ + int chance = EatingChances.getChance(this.getType(),victim.getType()); + + if (victim==this || !victim.isAlive() || chance<=0){ + continue; + } + + int roll = ThreadLocalRandom.current().nextInt(100); + if (roll100){ + this.satiety=100; + } + } + + public void decreaseSatiety(){ + if (this.isAlive() && this.satiety>0){ + double reduceSatiety = this.getWeight()* ThreadLocalRandom.current().nextDouble(0,0.5); + satiety = Math.max(0, this.satiety - reduceSatiety); + } else { + this.setDead(); + } + } @Override public boolean eat() { + if (!this.isAlive() || this.isFull()) { + return false; + } + + List plantsHere = this.getLocation().getPlants(); + for (Plant plant : plantsHere){ + int chance = EatingChances.getChance(this.getType(),plant.getType()); + + if (chance<=0){ + continue; + } + + int roll = ThreadLocalRandom.current().nextInt(100); + if (roll animalsHere = this.getLocation().getAnimals(); + + for (Animal victim : animalsHere){ + int chance = EatingChances.getChance(this.getType(),victim.getType()); + + if (victim==this || !victim.isAlive() || chance<=0){ + continue; + } + + int roll = ThreadLocalRandom.current().nextInt(100); + if (roll Date: Wed, 29 Jan 2025 22:11:15 +0200 Subject: [PATCH 09/17] Initializer --- src/main/java/com/island/Simulation.java | 114 ++++++++++++++++++ .../com/island/config/IslandInitializer.java | 110 +++++++++++++++++ src/main/java/com/island/entities/Animal.java | 28 +++-- .../java/com/island/entities/Herbivore.java | 20 ++- .../java/com/island/entities/Predator.java | 13 +- 5 files changed, 261 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/island/Simulation.java create mode 100644 src/main/java/com/island/config/IslandInitializer.java diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java new file mode 100644 index 0000000..6002a10 --- /dev/null +++ b/src/main/java/com/island/Simulation.java @@ -0,0 +1,114 @@ +package com.island; + +import com.island.config.Island; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class Simulation { + private final Island island; + + private int tickCounter = 0; + + private int diedThisTick = 0; + private int bornThisTick = 0; + private int ateThisTick = 0; + private int multipliedThisTick = 0; + + private final ScheduledExecutorService executor; + + public Simulation(Island island) { + this.island = island; + this.executor = Executors.newScheduledThreadPool(1); + } + + public void start() { + printInitialStatistics(); + + executor.scheduleAtFixedRate( + this::runCycle, + 0, + 1, + TimeUnit.SECONDS + ); + } + + public void stop() { + executor.shutdownNow(); + } + + private void runCycle() { + try { + tickCounter++; + + diedThisTick = 0; + bornThisTick = 0; + ateThisTick = 0; + multipliedThisTick = 0; + + moveAndDecreaseSatiety(); + + checkAndHandleDeaths(); + + if (tickCounter % 2 == 0) { + eatAll(); + multiplyAll(); + } + + if (tickCounter % 3 == 0) { + convertDeadAnimalsToPlants(); + } + + printTickStatistics(); + + if (isAllAnimalsDead()) { + System.out.println("Усі тварини померли. Зупиняємо симуляцію."); + stop(); + } + + } catch (Exception e) { + e.printStackTrace(); + stop(); + } + } + + + private void printInitialStatistics() { + + } + + private void moveAndDecreaseSatiety() { + + } + + private void checkAndHandleDeaths() { + + } + + private void eatAll() { + + } + + private void multiplyAll() { + + } + + private void convertDeadAnimalsToPlants() { + + } + + private boolean isAllAnimalsDead() { + return true; + } + + private void printTickStatistics() { + System.out.println("=== Такт #" + tickCounter + " ==="); + System.out.println(" Померло тварин: " + diedThisTick); + System.out.println(" Народилося тварин: " + bornThisTick); + System.out.println(" Поїли тварин: " + ateThisTick); + System.out.println(" Розмножилися: " + multipliedThisTick); + // Ще можна вивести поточну кількість усіх живих тварин чи рослин + // (потрібно підрахувати) + } +} diff --git a/src/main/java/com/island/config/IslandInitializer.java b/src/main/java/com/island/config/IslandInitializer.java new file mode 100644 index 0000000..ad0bd14 --- /dev/null +++ b/src/main/java/com/island/config/IslandInitializer.java @@ -0,0 +1,110 @@ +package com.island.config; + +import com.island.entities.Animal; +import com.island.entities.Plant; + +import java.lang.reflect.Constructor; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Function; + +public class IslandInitializer { + + private final Island island; + private final double fillFactor = 0.8; + + public IslandInitializer(Island island){ + this.island = island; + } + + public void spawnAnimals(Class animalClass) { + try { + // 1. Дістанемо конструктор (Location) + Constructor constructor = animalClass.getConstructor(Location.class); + + // 2. Створимо "тимчасову" тварину + Location dummyLocation = island.getLocation(0, 0); + T dummy = constructor.newInstance(dummyLocation); + + // 3. Через гетер дізнаємося максимальну кількість на локації + int maxNumberInLocation = dummy.getMaxNumberInLocation(); + + // 4. Обчислюємо, скільки екземплярів (всього на острів) створити + int totalCells = island.getWIDTH() * island.getHEIGHT(); + int maxPossible = (int) (maxNumberInLocation * fillFactor * totalCells); + + int totalCount = ThreadLocalRandom.current().nextInt(maxPossible + 1); + + int created = 0; + while (created < totalCount) { + int x = ThreadLocalRandom.current().nextInt(island.getWIDTH()); + int y = ThreadLocalRandom.current().nextInt(island.getHEIGHT()); + Location location = island.getLocation(x, y); + + long sameSpeciesCount = location.getAnimals().stream() + .filter(a -> a.getClass().equals(animalClass)) + .count(); + + if (sameSpeciesCount < maxNumberInLocation) { + T animal = constructor.newInstance(location); + location.addAnimal(animal); + created++; + } + } + + System.out.println("Створено " + animalClass.getSimpleName() + ": " + created); + + } catch (NoSuchMethodException e) { + System.err.println("У класі " + animalClass.getSimpleName() + + " немає конструктора (Location): " + e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void spawnPlants(Class plantClass) { + try { + // 1. Дістанемо конструктор (Location) + Constructor constructor = plantClass.getConstructor(Location.class); + + // 2. Створимо "тимчасову" рослину + Location dummyLocation = island.getLocation(0, 0); + T dummy = constructor.newInstance(dummyLocation); + + // 3. Через гетер дізнаємося максимальну кількість на локації + int maxNumberInLocation = dummy.getMaxNumberInLocation(); + + // 4. Обчислюємо, скільки екземплярів (всього на острів) створити + int totalCells = island.getWIDTH() * island.getHEIGHT(); + int maxPossible = (int) (maxNumberInLocation * fillFactor * totalCells); + + int totalCount = ThreadLocalRandom.current().nextInt(maxPossible + 1); + + int created = 0; + while (created < totalCount) { + int x = ThreadLocalRandom.current().nextInt(island.getWIDTH()); + int y = ThreadLocalRandom.current().nextInt(island.getHEIGHT()); + Location location = island.getLocation(x, y); + + long sameSpeciesCount = location.getPlants().stream() + .filter(p -> p.getClass().equals(plantClass)) + .count(); + + if (sameSpeciesCount < maxNumberInLocation) { + T plant = constructor.newInstance(location); + location.addPlant(plant); + created++; + } + } + + System.out.println("Створено " + plantClass.getSimpleName() + ": " + created); + + } catch (NoSuchMethodException e) { + System.err.println("У класі " + plantClass.getSimpleName() + + " немає конструктора (Location): " + e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + +} diff --git a/src/main/java/com/island/entities/Animal.java b/src/main/java/com/island/entities/Animal.java index c6ba038..1f710c2 100644 --- a/src/main/java/com/island/entities/Animal.java +++ b/src/main/java/com/island/entities/Animal.java @@ -66,16 +66,16 @@ public boolean multiply(){ long sameSpecies = 0; long potentialParents = 0; - for(Animal animal : this.location.getAnimals()){ + for(Animal animal : this.getLocation().getAnimals()){ if (animal.getClass().equals(this.getClass())){ sameSpecies++; - if (animal.isAlive() && animal.isFull()){ + if (animal.isAlive() && animal.getSatiety()>=100){ potentialParents++; } } } - if (potentialParents>=2 || sameSpecies=2 || sameSpecies0){ + double reduceSatiety = this.getWeight()* ThreadLocalRandom.current().nextDouble(0,0.2); + setSatiety(Math.max(0, this.getSatiety() - reduceSatiety)); + } else { + this.setDead(); + } + } + public abstract void reproduce(); - public abstract boolean isFull(); + + public abstract double getSatiety(); + + public abstract void setSatiety(double satiety); public abstract boolean eat(); @@ -95,10 +107,6 @@ public double getWeight() { return weight; } - public int getMaxNumberInLocation() { - return maxNumberInLocation; - } - public boolean isAlive() { return isAlive; } @@ -110,4 +118,8 @@ public void setDead(){ public Location getLocation() { return location; } + + public int getMaxNumberInLocation() { + return maxNumberInLocation; + } } diff --git a/src/main/java/com/island/entities/Herbivore.java b/src/main/java/com/island/entities/Herbivore.java index 89a1e15..d9b90ac 100644 --- a/src/main/java/com/island/entities/Herbivore.java +++ b/src/main/java/com/island/entities/Herbivore.java @@ -30,18 +30,9 @@ protected void increaseSatiety(double eatenWeight){ } } - public void decreaseSatiety(){ - if (this.isAlive() && this.satiety>0){ - double reduceSatiety = this.getWeight()* ThreadLocalRandom.current().nextDouble(0,0.5); - satiety = Math.max(0, this.satiety - reduceSatiety); - } else { - this.setDead(); - } - } - @Override public boolean eat() { - if (!this.isAlive() || this.isFull()) { + if (!this.isAlive() || this.getSatiety()>=100) { return false; } @@ -67,7 +58,12 @@ public boolean eat() { } @Override - public boolean isFull(){ - return satiety>=100; + public double getSatiety() { + return satiety; + } + + @Override + public void setSatiety(double satiety) { + this.satiety = satiety; } } diff --git a/src/main/java/com/island/entities/Predator.java b/src/main/java/com/island/entities/Predator.java index 8b684e9..7bfebe6 100644 --- a/src/main/java/com/island/entities/Predator.java +++ b/src/main/java/com/island/entities/Predator.java @@ -32,7 +32,7 @@ protected void increaseSatiety(double eatenWeight){ public void decreaseSatiety(){ if (this.isAlive() && this.satiety>0){ - double reduceSatiety = this.getWeight()*ThreadLocalRandom.current().nextDouble(0,0.5); + double reduceSatiety = this.getWeight()*ThreadLocalRandom.current().nextDouble(0,0.3); satiety = Math.max(0, this.satiety - reduceSatiety); } else { this.setDead(); @@ -41,7 +41,7 @@ public void decreaseSatiety(){ @Override public boolean eat() { - if (!this.isAlive() || this.isFull()){ + if (!this.isAlive() || this.getSatiety()>=100){ return false; } @@ -69,7 +69,12 @@ public boolean eat() { } @Override - public boolean isFull(){ - return satiety>=100; + public double getSatiety() { + return satiety; + } + + @Override + public void setSatiety(double satiety) { + this.satiety = satiety; } } \ No newline at end of file From fcecc31bfece446b3a4d4537abe4db35f74dbe5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9E=D0=B3=D0=BB?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D1=8F?= Date: Thu, 30 Jan 2025 00:46:45 +0200 Subject: [PATCH 10/17] Initializer --- src/main/java/com/island/Main.java | 8 +++++ src/main/java/com/island/Simulation.java | 2 -- .../com/island/config/IslandInitializer.java | 34 ++++++++++++++----- src/main/java/com/island/entities/Boar.java | 2 +- src/main/java/com/island/entities/Duck.java | 2 +- src/main/java/com/island/entities/Mouse.java | 2 +- 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/island/Main.java b/src/main/java/com/island/Main.java index 669c38f..5ca25a3 100644 --- a/src/main/java/com/island/Main.java +++ b/src/main/java/com/island/Main.java @@ -1,7 +1,15 @@ package com.island; +import com.island.config.Island; +import com.island.config.IslandInitializer; + public class Main { public static void main(String[] args) { + Island island = new Island(); + IslandInitializer initializer = new IslandInitializer(island); + + initializer.initializeAll(); + } } \ No newline at end of file diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index 6002a10..50203ca 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -24,8 +24,6 @@ public Simulation(Island island) { } public void start() { - printInitialStatistics(); - executor.scheduleAtFixedRate( this::runCycle, 0, diff --git a/src/main/java/com/island/config/IslandInitializer.java b/src/main/java/com/island/config/IslandInitializer.java index ad0bd14..732549a 100644 --- a/src/main/java/com/island/config/IslandInitializer.java +++ b/src/main/java/com/island/config/IslandInitializer.java @@ -1,22 +1,40 @@ package com.island.config; -import com.island.entities.Animal; -import com.island.entities.Plant; +import com.island.entities.*; import java.lang.reflect.Constructor; import java.util.concurrent.ThreadLocalRandom; -import java.util.function.Function; public class IslandInitializer { private final Island island; - private final double fillFactor = 0.8; + private static final double FILL_FACTOR = 0.4; public IslandInitializer(Island island){ this.island = island; } - public void spawnAnimals(Class animalClass) { + public void initializeAll(){ + spawnAnimals(Bear.class); + spawnAnimals(Boa.class); + spawnAnimals(Boar.class); + spawnAnimals(Buffalo.class); + spawnAnimals(Caterpillar.class); + spawnAnimals(Deer.class); + spawnAnimals(Duck.class); + spawnAnimals(Eagle.class); + spawnAnimals(Fox.class); + spawnAnimals(Goat.class); + spawnAnimals(Horse.class); + spawnAnimals(Mouse.class); + spawnAnimals(Rabbit.class); + spawnAnimals(Sheep.class); + spawnAnimals(Wolf.class); + + spawnPlants(Plant.class); + } + + private void spawnAnimals(Class animalClass) { try { // 1. Дістанемо конструктор (Location) Constructor constructor = animalClass.getConstructor(Location.class); @@ -30,7 +48,7 @@ public void spawnAnimals(Class animalClass) { // 4. Обчислюємо, скільки екземплярів (всього на острів) створити int totalCells = island.getWIDTH() * island.getHEIGHT(); - int maxPossible = (int) (maxNumberInLocation * fillFactor * totalCells); + int maxPossible = (int) (maxNumberInLocation * FILL_FACTOR * totalCells); int totalCount = ThreadLocalRandom.current().nextInt(maxPossible + 1); @@ -61,7 +79,7 @@ public void spawnAnimals(Class animalClass) { } } - public void spawnPlants(Class plantClass) { + private void spawnPlants(Class plantClass) { try { // 1. Дістанемо конструктор (Location) Constructor constructor = plantClass.getConstructor(Location.class); @@ -75,7 +93,7 @@ public void spawnPlants(Class plantClass) { // 4. Обчислюємо, скільки екземплярів (всього на острів) створити int totalCells = island.getWIDTH() * island.getHEIGHT(); - int maxPossible = (int) (maxNumberInLocation * fillFactor * totalCells); + int maxPossible = (int) (maxNumberInLocation * FILL_FACTOR * totalCells); int totalCount = ThreadLocalRandom.current().nextInt(maxPossible + 1); diff --git a/src/main/java/com/island/entities/Boar.java b/src/main/java/com/island/entities/Boar.java index 94a3b66..cc166d1 100644 --- a/src/main/java/com/island/entities/Boar.java +++ b/src/main/java/com/island/entities/Boar.java @@ -13,7 +13,7 @@ public Boar(Location location){ } private boolean tryEatOther(){ - if (!this.isAlive() || this.isFull()){ + if (!this.isAlive() || this.getSatiety()>=100){ return false; } diff --git a/src/main/java/com/island/entities/Duck.java b/src/main/java/com/island/entities/Duck.java index eae4581..411b245 100644 --- a/src/main/java/com/island/entities/Duck.java +++ b/src/main/java/com/island/entities/Duck.java @@ -13,7 +13,7 @@ public Duck(Location location){ } private boolean tryEatOther(){ - if (!this.isAlive() || this.isFull()){ + if (!this.isAlive() || this.getSatiety()>=100){ return false; } diff --git a/src/main/java/com/island/entities/Mouse.java b/src/main/java/com/island/entities/Mouse.java index cdf87cb..df6a196 100644 --- a/src/main/java/com/island/entities/Mouse.java +++ b/src/main/java/com/island/entities/Mouse.java @@ -13,7 +13,7 @@ public Mouse(Location location){ } private boolean tryEatOther(){ - if (!this.isAlive() || this.isFull()){ + if (!this.isAlive() || this.getSatiety()>=100){ return false; } From bfd68e277842d88e194f9d3b034195b77e0f285c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9E=D0=B3=D0=BB?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D1=8F?= Date: Thu, 30 Jan 2025 01:35:03 +0200 Subject: [PATCH 11/17] Simulation class ready --- src/main/java/com/island/Main.java | 3 - src/main/java/com/island/Simulation.java | 105 +++++++++++++++---- src/main/java/com/island/entities/Plant.java | 46 +++++++- 3 files changed, 124 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/island/Main.java b/src/main/java/com/island/Main.java index 5ca25a3..38577c2 100644 --- a/src/main/java/com/island/Main.java +++ b/src/main/java/com/island/Main.java @@ -6,9 +6,6 @@ public class Main { public static void main(String[] args) { Island island = new Island(); - IslandInitializer initializer = new IslandInitializer(island); - - initializer.initializeAll(); } diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index 50203ca..f004225 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -1,7 +1,13 @@ package com.island; import com.island.config.Island; +import com.island.config.IslandInitializer; +import com.island.config.Location; +import com.island.entities.Animal; +import com.island.entities.Plant; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -9,21 +15,28 @@ public class Simulation { private final Island island; + private final int numberOfTicks; + private int tickCounter = 0; + private int movedThisTick = 0; private int diedThisTick = 0; private int bornThisTick = 0; private int ateThisTick = 0; - private int multipliedThisTick = 0; + private int plantsGrewThisTick = 0; + + private final Set locationsWithDead = new HashSet<>(); private final ScheduledExecutorService executor; - public Simulation(Island island) { + public Simulation(Island island, int numberOfTicks) { this.island = island; + this.numberOfTicks = numberOfTicks; this.executor = Executors.newScheduledThreadPool(1); } - public void start() { + public void start(IslandInitializer initializer) { + initializer.initializeAll(); executor.scheduleAtFixedRate( this::runCycle, 0, @@ -40,26 +53,31 @@ private void runCycle() { try { tickCounter++; + movedThisTick = 0; diedThisTick = 0; bornThisTick = 0; ateThisTick = 0; - multipliedThisTick = 0; + plantsGrewThisTick = 0; moveAndDecreaseSatiety(); + diedThisTick(); - checkAndHandleDeaths(); if (tickCounter % 2 == 0) { - eatAll(); - multiplyAll(); + eatAndMultiply(); } if (tickCounter % 3 == 0) { - convertDeadAnimalsToPlants(); + growPlants(); } printTickStatistics(); + if (numberOfTicks<=tickCounter){ + System.out.println("Виконано " + tickCounter + " тактів. Зупиняємо симуляцію."); + stop(); + } + if (isAllAnimalsDead()) { System.out.println("Усі тварини померли. Зупиняємо симуляцію."); stop(); @@ -71,42 +89,83 @@ private void runCycle() { } } - - private void printInitialStatistics() { - - } - private void moveAndDecreaseSatiety() { + for (int x = 0; x < island.getWIDTH(); x++) { + for (int y = 0; y< island.getHEIGHT(); y++){ + Location location=island.getLocation(x,y); + for (Animal animal : location.getAnimals()){ + if (animal.move(island)){ + movedThisTick++; + } + animal.decreaseSatiety(); + } + } + } } - private void checkAndHandleDeaths() { + private void diedThisTick(){ + + for (int x = 0; x < island.getWIDTH(); x++) { + for (int y = 0; y< island.getHEIGHT(); y++){ + Location location=island.getLocation(x,y); + for (Animal animal : location.getAnimals()){ + if (!animal.isAlive()){ + diedThisTick++; + locationsWithDead.add(location); + } + } + } + } } - private void eatAll() { - - } - private void multiplyAll() { + private void eatAndMultiply() { + for (int x = 0; x < island.getWIDTH(); x++) { + for (int y = 0; y< island.getHEIGHT(); y++){ + Location location=island.getLocation(x,y); + for (Animal animal : location.getAnimals()){ + if (animal.eat()){ + ateThisTick++; + } + if (animal.multiply()){ + bornThisTick++; + } + } + } + } } - private void convertDeadAnimalsToPlants() { - + private void growPlants(){ + for (Location location : locationsWithDead){ + plantsGrewThisTick += Plant.grow(location); + } + locationsWithDead.clear(); } private boolean isAllAnimalsDead() { + for (int x = 0; x < island.getWIDTH(); x++) { + for (int y = 0; y< island.getHEIGHT(); y++){ + Location location=island.getLocation(x,y); + for (Animal animal : location.getAnimals()){ + if (animal.isAlive()){ + return false; + } + } + } + } return true; } private void printTickStatistics() { System.out.println("=== Такт #" + tickCounter + " ==="); + System.out.println(" Походило тварин: " + movedThisTick); System.out.println(" Померло тварин: " + diedThisTick); System.out.println(" Народилося тварин: " + bornThisTick); System.out.println(" Поїли тварин: " + ateThisTick); - System.out.println(" Розмножилися: " + multipliedThisTick); - // Ще можна вивести поточну кількість усіх живих тварин чи рослин - // (потрібно підрахувати) + System.out.println(" Виросло рослин: " + plantsGrewThisTick); + } } diff --git a/src/main/java/com/island/entities/Plant.java b/src/main/java/com/island/entities/Plant.java index b11b984..7ca6ed8 100644 --- a/src/main/java/com/island/entities/Plant.java +++ b/src/main/java/com/island/entities/Plant.java @@ -3,22 +3,60 @@ import com.island.config.AnimalType; import com.island.config.Location; +import java.util.ArrayList; +import java.util.List; + public class Plant { - private static double weight=1; - private static final int maxNumberInLocation=200; + private static final double WEIGHT=1; + private static final int MAX_NUMBER_IN_LOCATION=200; Location location; public Plant(Location location){ this.location=location; + location.addPlant(this); + } + + public static int grow(Location location){ + int plantsInLocation = 0; + double deadAnimalsWeight = 0; + List deadAnimals = new ArrayList<>(); + + for (Animal animal : location.getAnimals()){ + if (!animal.isAlive()) { + deadAnimalsWeight += animal.getWeight(); + deadAnimals.add(animal); + } + } + + for (Plant _ : location.getPlants()){ + plantsInLocation++; + } + + location.getAnimals().removeAll(deadAnimals); + + int plantsFromDead = (int) Math.ceil(deadAnimalsWeight); + int canAdd = MAX_NUMBER_IN_LOCATION - plantsInLocation; + + if (canAdd <= 0){ + return 0; + } + + int toAdd = Math.min(plantsFromDead, canAdd); + + for (int i = 0; i < toAdd; i++){ + new Plant(location); + } + + return toAdd; } public double getWeight() { - return weight; + return WEIGHT; } public int getMaxNumberInLocation() { - return maxNumberInLocation; + return MAX_NUMBER_IN_LOCATION; } public AnimalType getType(){ From cd4f9a15482e265a248d288588496433eadef0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=9E=D0=B3=D0=BB?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D1=8F?= Date: Thu, 30 Jan 2025 01:46:08 +0200 Subject: [PATCH 12/17] working --- src/main/java/com/island/Main.java | 4 +++- src/main/java/com/island/Simulation.java | 16 +++++++++++----- src/main/java/com/island/entities/Herbivore.java | 2 +- src/main/java/com/island/entities/Predator.java | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/island/Main.java b/src/main/java/com/island/Main.java index 38577c2..08eba76 100644 --- a/src/main/java/com/island/Main.java +++ b/src/main/java/com/island/Main.java @@ -6,7 +6,9 @@ public class Main { public static void main(String[] args) { Island island = new Island(); + IslandInitializer initializer = new IslandInitializer(island); + Simulation simulation = new Simulation(island, 100); - + simulation.start(initializer); } } \ No newline at end of file diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index f004225..85b7be4 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -6,7 +6,9 @@ import com.island.entities.Animal; import com.island.entities.Plant; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -93,7 +95,8 @@ private void moveAndDecreaseSatiety() { for (int x = 0; x < island.getWIDTH(); x++) { for (int y = 0; y< island.getHEIGHT(); y++){ Location location=island.getLocation(x,y); - for (Animal animal : location.getAnimals()){ + List animals = new ArrayList<>(location.getAnimals()); + for (Animal animal : animals){ if (animal.move(island)){ movedThisTick++; } @@ -109,7 +112,8 @@ private void diedThisTick(){ for (int x = 0; x < island.getWIDTH(); x++) { for (int y = 0; y< island.getHEIGHT(); y++){ Location location=island.getLocation(x,y); - for (Animal animal : location.getAnimals()){ + List animals = new ArrayList<>(location.getAnimals()); + for (Animal animal : animals){ if (!animal.isAlive()){ diedThisTick++; locationsWithDead.add(location); @@ -125,7 +129,8 @@ private void eatAndMultiply() { for (int x = 0; x < island.getWIDTH(); x++) { for (int y = 0; y< island.getHEIGHT(); y++){ Location location=island.getLocation(x,y); - for (Animal animal : location.getAnimals()){ + List animals = new ArrayList<>(location.getAnimals()); + for (Animal animal : animals){ if (animal.eat()){ ateThisTick++; } @@ -149,7 +154,8 @@ private boolean isAllAnimalsDead() { for (int x = 0; x < island.getWIDTH(); x++) { for (int y = 0; y< island.getHEIGHT(); y++){ Location location=island.getLocation(x,y); - for (Animal animal : location.getAnimals()){ + List animals = new ArrayList<>(location.getAnimals()); + for (Animal animal : animals){ if (animal.isAlive()){ return false; } @@ -164,7 +170,7 @@ private void printTickStatistics() { System.out.println(" Походило тварин: " + movedThisTick); System.out.println(" Померло тварин: " + diedThisTick); System.out.println(" Народилося тварин: " + bornThisTick); - System.out.println(" Поїли тварин: " + ateThisTick); + System.out.println(" Поїло тварин: " + ateThisTick); System.out.println(" Виросло рослин: " + plantsGrewThisTick); } diff --git a/src/main/java/com/island/entities/Herbivore.java b/src/main/java/com/island/entities/Herbivore.java index d9b90ac..de5b96f 100644 --- a/src/main/java/com/island/entities/Herbivore.java +++ b/src/main/java/com/island/entities/Herbivore.java @@ -10,7 +10,7 @@ public abstract class Herbivore extends Animal { private final double foodNeeded; - private double satiety; + private double satiety = 50; protected Herbivore(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded, Location location) { super(weight, maxNumberInLocation, movementSpeed, location); diff --git a/src/main/java/com/island/entities/Predator.java b/src/main/java/com/island/entities/Predator.java index 7bfebe6..7409016 100644 --- a/src/main/java/com/island/entities/Predator.java +++ b/src/main/java/com/island/entities/Predator.java @@ -10,7 +10,7 @@ public abstract class Predator extends Animal { private final double foodNeeded; - private double satiety; + private double satiety=50; protected Predator(double weight, int maxNumberInLocation, int movementSpeed, double foodNeeded, Location location) { super(weight, maxNumberInLocation, movementSpeed, location); From 370edb7404916b7ddd8a9a0245203abc5716bb53 Mon Sep 17 00:00:00 2001 From: maxog Date: Thu, 30 Jan 2025 18:42:36 +0200 Subject: [PATCH 13/17] final changes --- src/main/java/com/island/Main.java | 2 +- src/main/java/com/island/Simulation.java | 43 +++++++++++++------ .../com/island/config/IslandInitializer.java | 12 +++--- src/main/java/com/island/entities/Animal.java | 2 +- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/island/Main.java b/src/main/java/com/island/Main.java index 08eba76..519b393 100644 --- a/src/main/java/com/island/Main.java +++ b/src/main/java/com/island/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) { Island island = new Island(); IslandInitializer initializer = new IslandInitializer(island); - Simulation simulation = new Simulation(island, 100); + Simulation simulation = new Simulation(island, 10); simulation.start(initializer); } diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index 85b7be4..60538c7 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -27,6 +27,10 @@ public class Simulation { private int ateThisTick = 0; private int plantsGrewThisTick = 0; + private int totalDied = 0; + private int totalBorn = 0; + private int aliveAnimals = 0; + private final Set locationsWithDead = new HashSet<>(); private final ScheduledExecutorService executor; @@ -63,25 +67,21 @@ private void runCycle() { moveAndDecreaseSatiety(); diedThisTick(); - - - if (tickCounter % 2 == 0) { - eatAndMultiply(); - } - - if (tickCounter % 3 == 0) { - growPlants(); - } + eatAndMultiply(); + growPlants(); printTickStatistics(); if (numberOfTicks<=tickCounter){ System.out.println("Виконано " + tickCounter + " тактів. Зупиняємо симуляцію."); + aliveAnimals(); + printFinalStatistics(); stop(); } if (isAllAnimalsDead()) { System.out.println("Усі тварини померли. Зупиняємо симуляцію."); + printFinalStatistics(); stop(); } @@ -120,7 +120,7 @@ private void diedThisTick(){ } } } - + totalDied+=diedThisTick; } } @@ -139,8 +139,8 @@ private void eatAndMultiply() { } } } - } + totalBorn+=bornThisTick; } private void growPlants(){ @@ -165,13 +165,32 @@ private boolean isAllAnimalsDead() { return true; } + private void aliveAnimals(){ + for (int x = 0; x < island.getWIDTH(); x++) { + for (int y = 0; y< island.getHEIGHT(); y++){ + Location location=island.getLocation(x,y); + List animals = new ArrayList<>(location.getAnimals()); + for (Animal animal : animals){ + if (animal.isAlive()){ + aliveAnimals++; + } + } + } + } + } + private void printTickStatistics() { - System.out.println("=== Такт #" + tickCounter + " ==="); + System.out.println("\n=== Такт #" + tickCounter + " ==="); System.out.println(" Походило тварин: " + movedThisTick); System.out.println(" Померло тварин: " + diedThisTick); System.out.println(" Народилося тварин: " + bornThisTick); System.out.println(" Поїло тварин: " + ateThisTick); System.out.println(" Виросло рослин: " + plantsGrewThisTick); + } + private void printFinalStatistics(){ + System.out.println("\n Живих тварин: " + aliveAnimals); + System.out.println(" Померло тварин за час симуляції: " + totalDied); + System.out.println(" Народилося тварин за час симуляції: " + totalBorn); } } diff --git a/src/main/java/com/island/config/IslandInitializer.java b/src/main/java/com/island/config/IslandInitializer.java index 732549a..f046971 100644 --- a/src/main/java/com/island/config/IslandInitializer.java +++ b/src/main/java/com/island/config/IslandInitializer.java @@ -8,7 +8,7 @@ public class IslandInitializer { private final Island island; - private static final double FILL_FACTOR = 0.4; + private static final double FILL_FACTOR = 0.001; public IslandInitializer(Island island){ this.island = island; @@ -79,14 +79,14 @@ private void spawnAnimals(Class animalClass) { } } - private void spawnPlants(Class plantClass) { + private void spawnPlants(Class plantClass) { try { // 1. Дістанемо конструктор (Location) - Constructor constructor = plantClass.getConstructor(Location.class); + Constructor constructor = plantClass.getConstructor(Location.class); // 2. Створимо "тимчасову" рослину Location dummyLocation = island.getLocation(0, 0); - T dummy = constructor.newInstance(dummyLocation); + Plant dummy = constructor.newInstance(dummyLocation); // 3. Через гетер дізнаємося максимальну кількість на локації int maxNumberInLocation = dummy.getMaxNumberInLocation(); @@ -108,7 +108,7 @@ private void spawnPlants(Class plantClass) { .count(); if (sameSpeciesCount < maxNumberInLocation) { - T plant = constructor.newInstance(location); + Plant plant = constructor.newInstance(location); location.addPlant(plant); created++; } @@ -123,6 +123,4 @@ private void spawnPlants(Class plantClass) { e.printStackTrace(); } } - - } diff --git a/src/main/java/com/island/entities/Animal.java b/src/main/java/com/island/entities/Animal.java index 1f710c2..c2ec21d 100644 --- a/src/main/java/com/island/entities/Animal.java +++ b/src/main/java/com/island/entities/Animal.java @@ -85,7 +85,7 @@ public boolean multiply(){ public void decreaseSatiety(){ if (this.isAlive() && this.getSatiety()>0){ - double reduceSatiety = this.getWeight()* ThreadLocalRandom.current().nextDouble(0,0.2); + double reduceSatiety = this.getWeight()* ThreadLocalRandom.current().nextDouble(0,0.8); setSatiety(Math.max(0, this.getSatiety() - reduceSatiety)); } else { this.setDead(); From 1d6377527e8ceaac28831087e827458962720ab0 Mon Sep 17 00:00:00 2001 From: maxog Date: Thu, 30 Jan 2025 20:11:29 +0200 Subject: [PATCH 14/17] multithreading improvement --- src/main/java/com/island/Simulation.java | 166 ++++++++++++++--------- 1 file changed, 104 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index 60538c7..b6efeea 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -5,24 +5,28 @@ import com.island.config.Location; import com.island.entities.Animal; import com.island.entities.Plant; +import com.island.entities.Predator; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; +import java.util.function.BiConsumer; public class Simulation { private final Island island; + private static final int CHUNK_COUNT = 4; + private final int numberOfTicks; private int tickCounter = 0; private int movedThisTick = 0; private int diedThisTick = 0; + private int eatenThisTick = 0; + private int totalEaten = 0; private int bornThisTick = 0; private int ateThisTick = 0; private int plantsGrewThisTick = 0; @@ -30,10 +34,12 @@ public class Simulation { private int totalDied = 0; private int totalBorn = 0; private int aliveAnimals = 0; + private boolean allAnimalsDead = true; private final Set locationsWithDead = new HashSet<>(); private final ScheduledExecutorService executor; + private final ExecutorService workerPool = Executors.newFixedThreadPool(CHUNK_COUNT); public Simulation(Island island, int numberOfTicks) { this.island = island; @@ -63,24 +69,28 @@ private void runCycle() { diedThisTick = 0; bornThisTick = 0; ateThisTick = 0; + aliveAnimals = 0; plantsGrewThisTick = 0; - moveAndDecreaseSatiety(); - diedThisTick(); - eatAndMultiply(); + processInChunks(this::processMoveAndDecreaseSatiety); + processInChunks(this::processEatAndMultiply); + processInChunks(this::processAliveAnimals); + processInChunks(this::processDiedThisTick); growPlants(); + totalDied+=diedThisTick; + totalBorn+=bornThisTick; + totalEaten+=eatenThisTick; printTickStatistics(); if (numberOfTicks<=tickCounter){ - System.out.println("Виконано " + tickCounter + " тактів. Зупиняємо симуляцію."); - aliveAnimals(); + System.out.println("\nВиконано " + tickCounter + " тактів. Зупиняємо симуляцію."); printFinalStatistics(); stop(); } - if (isAllAnimalsDead()) { - System.out.println("Усі тварини померли. Зупиняємо симуляцію."); + if (allAnimalsDead) { + System.out.println("\nУсі тварини померли. Зупиняємо симуляцію."); printFinalStatistics(); stop(); } @@ -91,56 +101,83 @@ private void runCycle() { } } - private void moveAndDecreaseSatiety() { - for (int x = 0; x < island.getWIDTH(); x++) { - for (int y = 0; y< island.getHEIGHT(); y++){ - Location location=island.getLocation(x,y); + private void processInChunks(BiConsumer chunkAction) { + int width = island.getWIDTH(); + int chunkSize = (int) Math.ceil((double) width / CHUNK_COUNT); + + List> futures = new ArrayList<>(CHUNK_COUNT); + + for (int i = 0; i < CHUNK_COUNT; i++) { + final int startX = i * chunkSize; + final int endX = Math.min((i + 1) * chunkSize, width); + + // Передаємо лямбду chunkAction у пул + Future future = workerPool.submit(() -> chunkAction.accept(startX, endX)); + futures.add(future); + } + + // Чекаємо на завершення всіх задач + waitForAllFutures(futures); + } + + private void processMoveAndDecreaseSatiety(int startX, int endX) { + for (int x = startX; x < endX; x++) { + for (int y = 0; y < island.getHEIGHT(); y++) { + Location location = island.getLocation(x, y); List animals = new ArrayList<>(location.getAnimals()); - for (Animal animal : animals){ - if (animal.move(island)){ - movedThisTick++; + for (Animal animal : animals) { + if (animal.move(island)) { + synchronized (this) { + movedThisTick++; + } } animal.decreaseSatiety(); } } - } } - private void diedThisTick(){ - - for (int x = 0; x < island.getWIDTH(); x++) { - for (int y = 0; y< island.getHEIGHT(); y++){ - Location location=island.getLocation(x,y); + private void processDiedThisTick(int startX, int endX) { + for (int x = startX; x < endX; x++) { + for (int y = 0; y < island.getHEIGHT(); y++) { + Location location = island.getLocation(x, y); List animals = new ArrayList<>(location.getAnimals()); - for (Animal animal : animals){ + for (Animal animal : animals) { if (!animal.isAlive()){ - diedThisTick++; - locationsWithDead.add(location); + synchronized (this){ + diedThisTick++; + locationsWithDead.add(location); + } } } } - totalDied+=diedThisTick; } } - - private void eatAndMultiply() { - for (int x = 0; x < island.getWIDTH(); x++) { - for (int y = 0; y< island.getHEIGHT(); y++){ - Location location=island.getLocation(x,y); + private void processEatAndMultiply(int startX, int endX) { + for (int x = startX; x < endX; x++) { + for (int y = 0; y < island.getHEIGHT(); y++) { + Location location = island.getLocation(x, y); List animals = new ArrayList<>(location.getAnimals()); - for (Animal animal : animals){ + for (Animal animal : animals) { if (animal.eat()){ - ateThisTick++; + synchronized (this){ + ateThisTick++; + } + if (animal instanceof Predator){ + synchronized (this){ + eatenThisTick++; + } + } } if (animal.multiply()){ - bornThisTick++; + synchronized (this){ + bornThisTick++; + } } } } } - totalBorn+=bornThisTick; } private void growPlants(){ @@ -150,47 +187,52 @@ private void growPlants(){ locationsWithDead.clear(); } - private boolean isAllAnimalsDead() { - for (int x = 0; x < island.getWIDTH(); x++) { - for (int y = 0; y< island.getHEIGHT(); y++){ - Location location=island.getLocation(x,y); + private void processAliveAnimals(int startX, int endX) { + for (int x = startX; x < endX; x++) { + for (int y = 0; y < island.getHEIGHT(); y++) { + Location location = island.getLocation(x, y); List animals = new ArrayList<>(location.getAnimals()); - for (Animal animal : animals){ + for (Animal animal : animals) { if (animal.isAlive()){ - return false; + synchronized (this){ + allAnimalsDead=false; + aliveAnimals++; + } } } } } - return true; } - private void aliveAnimals(){ - for (int x = 0; x < island.getWIDTH(); x++) { - for (int y = 0; y< island.getHEIGHT(); y++){ - Location location=island.getLocation(x,y); - List animals = new ArrayList<>(location.getAnimals()); - for (Animal animal : animals){ - if (animal.isAlive()){ - aliveAnimals++; - } - } + private void waitForAllFutures(List> futures) { + for (Future future : futures) { + try { + future.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); } } } private void printTickStatistics() { - System.out.println("\n=== Такт #" + tickCounter + " ==="); - System.out.println(" Походило тварин: " + movedThisTick); - System.out.println(" Померло тварин: " + diedThisTick); - System.out.println(" Народилося тварин: " + bornThisTick); - System.out.println(" Поїло тварин: " + ateThisTick); - System.out.println(" Виросло рослин: " + plantsGrewThisTick); + System.out.println( + "\n=== Такт #" + tickCounter + " ===" + + "\n Живих тварин: " + aliveAnimals + + "\n Походило тварин: " + movedThisTick + + "\n Померло тварин з голоду: " + diedThisTick + + "\n З'їдено тварин: " + eatenThisTick + + "\n Народилося тварин: " + bornThisTick + + "\n Поїло тварин: " + ateThisTick + + "\n Виросло рослин: " + plantsGrewThisTick + ); } private void printFinalStatistics(){ - System.out.println("\n Живих тварин: " + aliveAnimals); - System.out.println(" Померло тварин за час симуляції: " + totalDied); - System.out.println(" Народилося тварин за час симуляції: " + totalBorn); + System.out.println( + "\n Живих тварин: " + aliveAnimals + + "\n Померло тварин з голоду за час симуляції: " + totalDied + + "\n З'їдено тварин за час симуляції: " + totalEaten + + "\n Народилося тварин за час симуляції: " + totalBorn + ); } } From e43c5d4eba23dc69d82899b244c3b877b78dd438 Mon Sep 17 00:00:00 2001 From: maxog Date: Thu, 30 Jan 2025 20:15:38 +0200 Subject: [PATCH 15/17] multithreading improvement --- src/main/java/com/island/Simulation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index b6efeea..28ed8e0 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -59,6 +59,7 @@ public void start(IslandInitializer initializer) { public void stop() { executor.shutdownNow(); + workerPool.shutdownNow(); } private void runCycle() { From fb7d333e75ffde541d51ac38e9111e538f59e025 Mon Sep 17 00:00:00 2001 From: maxog Date: Thu, 30 Jan 2025 20:27:25 +0200 Subject: [PATCH 16/17] final --- src/main/java/com/island/Simulation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/island/Simulation.java b/src/main/java/com/island/Simulation.java index 28ed8e0..06b240c 100644 --- a/src/main/java/com/island/Simulation.java +++ b/src/main/java/com/island/Simulation.java @@ -116,7 +116,6 @@ private void processInChunks(BiConsumer chunkAction) { Future future = workerPool.submit(() -> chunkAction.accept(startX, endX)); futures.add(future); } - // Чекаємо на завершення всіх задач waitForAllFutures(futures); } From 259720accd4dd4dbfc55e4f6e4e2efbd436fffbc Mon Sep 17 00:00:00 2001 From: mxk77 <104596966+mxk77@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:47:59 +0200 Subject: [PATCH 17/17] Delete .idea directory --- .idea/.gitignore | 3 --- .idea/encodings.xml | 7 ------- .idea/misc.xml | 14 -------------- .idea/vcs.xml | 6 ------ 4 files changed, 30 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffa..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 6111a9a..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file