diff options
| author | Andriy Cherniy <qugalet@m0e.space> | 2024-06-17 05:10:58 +0300 |
|---|---|---|
| committer | Andriy Cherniy <qugalet@m0e.space> | 2024-06-17 05:10:58 +0300 |
| commit | 943bc45a13256d57c82ed58f22aa2cb802292744 (patch) | |
| tree | ada8c6d5eefa3e4034504bfcc5eb03ab84597ebe | |
| parent | 3401d742ca53dce6bb1464cc12f94d107cfc285d (diff) | |
| download | oop-kursach-master.tar.gz oop-kursach-master.zip | |
8 files changed, 136 insertions, 40 deletions
diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/Main.java b/src/main/java/space/m0e/quga/oop/lab56maven/Main.java index 65a0f5d..17b1e0f 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/Main.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/Main.java @@ -36,10 +36,7 @@ import space.m0e.quga.oop.lab56maven.handlers.DwarfHandler; import space.m0e.quga.oop.lab56maven.handlers.ImmigrantHandler; import java.io.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -54,8 +51,8 @@ public class Main extends Application { public static MiniMap miniMap; - public static final double width = 3555; - public static final double height = 2000; + public static final double width = 5000; + public static final double height = 2812; public static ImageView imgviewmap; public static Rectangle rectMinimap; @@ -68,29 +65,68 @@ public class Main extends Application { fileChooser.setInitialFileName("serial.csv"); root.getChildren().add(rect); - Fortress fortress = new Fortress("Eartha", 150, 150, + + fortresses.add(new Fortress("Eartha", 150, 150, new ArrayList<>(List.of( new Workstation("Torgrus", Ability.MASONIST), new Workstation("Abbacus", Ability.WOODCUTTER) )), new ArrayList<>(List.of( new ThroneRoom("Halzorga")) - )); - - Fortress fortressTrade = new Fortress("Aboba", 1000, 150, + ))); + fortresses.add(new Fortress("Aboba", 1000, 150, new ArrayList<>(List.of( new Workstation("Torgrass", Ability.WOODCUTTER) )), new ArrayList<>(List.of( + )))); + + fortresses.add(new Fortress("Eldoria", 2300, 500, + new ArrayList<>(List.of( + new Workstation("Eldoria Workstation", Ability.MASONIST) + )), + new ArrayList<>(List.of( + new ThroneRoom("Eldoria Throne Room")) ))); - fortresses.add(fortressTrade); - fortresses.add(fortress); - fortressTrade.setWoodCount(999); + fortresses.add(new Fortress("Valeria", 800, 1600, + new ArrayList<>(List.of( + new Workstation("Valeria Workstation", Ability.WOODCUTTER) + )), + new ArrayList<>(List.of( + new ThroneRoom("Valeria Throne Room")) + ))); + fortresses.add(new Fortress("Dunewood", 2700, 2100, + new ArrayList<>(List.of( + new Workstation("Dunewood Workstation", Ability.MASONIST) + )), + new ArrayList<>(List.of( + new ThroneRoom("Dunewood Throne Room")) + ))); + fortresses.add(new Fortress("Glimmerstone", 3300, 200, + new ArrayList<>(List.of( + new Workstation("Glimmerstone Workstation", Ability.WOODCUTTER) + )), + new ArrayList<>(List.of( + new ThroneRoom("Glimmerstone Throne Room")) + ))); + fortresses.add(new Fortress("Stormwatch", 4000, 1000, + new ArrayList<>(List.of( + new Workstation("Stormwatch Workstation", Ability.MASONIST) + )), + new ArrayList<>(List.of( + new ThroneRoom("Stormwatch Throne Room")) + ))); + + fortresses.get(0).setWoodCount(1000); + fortresses.get(1).setStoneCount(1000); -// immigrants.add(new Immigrant("Melbil", "Lancerpaddle", 50, 100,100, Ability.WOODCUTTER)); -// immigrants.add(new Immigrant("Atír", "Razorpaddle", 50, 0,0, Ability.WOODCUTTER)); -// immigrants.add(new Immigrant("Onget", "Sabreletter", 52, 200,150, Ability.WOODCUTTER)); + immigrants.add(new Immigrant("Melbil", "Lancerpaddle", 50, 0,50, Ability.COMMUNICATION)); + immigrants.add(new Immigrant("Atír", "Razorpaddle", 50, 0,50, Ability.COMMUNICATION)); + immigrants.add(new Immigrant("Onget", "Sabreletter", 52, 200,140, Ability.MASONIST)); immigrants.add(new Immigrant("Limul", "Rockrack", 52, 700,150, Ability.WOODCUTTER)); +// for (int i = 0; i < 20; i++) { +// immigrants.add(new Immigrant()) +// } root.getChildren().add(status); group.getChildren().add(root); diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java index 6dc4448..9002fc5 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java @@ -19,7 +19,6 @@ public class GoToWorkstationDecision extends Decision { public void cycle() { Workstation near = dwarf.findNearestWorkstation(); if (near != null) { - System.out.println(near.getName()); Platform.runLater(dwarf::updateItemLabel); dwarf.getFortress().removeFromContainer(dwarf); Coordinates nearCoordinates = dwarf.getCoordinatesToWorkstation(near); diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java index 493fb45..784f061 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoTradingDecision.java @@ -33,10 +33,12 @@ public class GoTradingDecision extends Decision { Item getItem = null; switch (tradingItem) { case WOOD -> { + near.setWoodCount(near.getWoodCount() + amountOfItem); near.setStoneCount(near.getStoneCount() - amountOfItem); getItem = Item.STONE; } case STONE -> { + near.setStoneCount(near.getStoneCount() + amountOfItem); near.setWoodCount(near.getWoodCount() - amountOfItem); getItem = Item.WOOD; } diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java index 5e5f319..0a6b25b 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/MiniMap.java @@ -16,8 +16,8 @@ public class MiniMap extends Rectangle setWidth(width); this.mainGroup = mainGroup; setFill(Color.GREY); - setStroke(Color.GREEN); - setStrokeWidth(5); + setStroke(Color.YELLOW); + setStrokeWidth(2); rect.setWidth(selectionWidth); rect.setHeight(selectionHeight); rect.setFill(Color.TRANSPARENT); diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java index 3264802..fe34ce1 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/Fortress.java @@ -36,6 +36,13 @@ public class Fortress { return throneRooms; } + public ArrayList<String> getAvailableDecisions() { + return availableDecisions; + } + + private ArrayList<String> availableDecisions = new ArrayList<String>(); + + ArrayList<ThroneRoom> throneRooms = new ArrayList<>(); ArrayList<Dwarf> dwarves = new ArrayList<>(); @@ -112,6 +119,14 @@ public class Fortress { // this.dwarvesContainer.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3)))); // dwarvesContainer.setMinSize(100 * 3, 100 * 3); hBox.getChildren().addAll(countLabel, resourcesLabel); + availableDecisions.add("GoToDwarvesContainer"); + availableDecisions.add("GoTrading"); + if (!workstations.isEmpty()) { + availableDecisions.add("GoToWorkstation"); + } + if (!throneRooms.isEmpty()) { + availableDecisions.add("GoToThroneRoom"); + } vBox.setLayoutX(x); vBox.setLayoutY(y); @@ -137,6 +152,7 @@ public class Fortress { public void add(Dwarf dwarf) { dwarves.add(dwarf); countLabel.setText(String.valueOf(dwarves.size())); + dwarf.getTimeline().play(); dwarvesContainer.getChildren().add(dwarf.getGroup()); } diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java index daaa9c5..a36f66a 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Dwarf.java @@ -4,6 +4,7 @@ import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Platform; +import javafx.geometry.Bounds; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.util.Duration; @@ -139,16 +140,44 @@ public class Dwarf extends Immigrant { }).findFirst().orElse(null); } +// public Coordinates getCoordinatesToWorkstation(Workstation workstation) { +// double workstationX = workstation.getGroup().getLayoutX() + workstation.getGroup().getBoundsInParent().getWidth() - this.getGroup().getBoundsInParent().getWidth(); +// double workstationY = workstation.getGroup().getLayoutY() + workstation.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight(); +// return new Coordinates(workstationX, workstationY); +// } public Coordinates getCoordinatesToWorkstation(Workstation workstation) { - double workstationX = workstation.getGroup().getLayoutX() + workstation.getGroup().getBoundsInParent().getWidth() - this.getGroup().getBoundsInParent().getWidth(); - double workstationY = workstation.getGroup().getLayoutY() + workstation.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight(); + // Отримання меж групи робочої станції в координатах сцени + Bounds workstationBoundsInScene = workstation.getGroup().localToScene(workstation.getGroup().getBoundsInLocal()); + + // Отримання меж кореневої групи в координатах сцени + Bounds rootBoundsInScene = this.getGroup().getScene().getRoot().localToScene(this.getGroup().getScene().getRoot().getBoundsInLocal()); + + // Обчислення відносних координат робочої станції відносно кореневої групи + double workstationX = workstationBoundsInScene.getMinX() - rootBoundsInScene.getMinX(); + double workstationY = workstationBoundsInScene.getMinY() - rootBoundsInScene.getMinY(); + return new Coordinates(workstationX, workstationY); } - public Coordinates getCoordinatesToThroneRoom(ThroneRoom throneRoom) { - double throneRoomX = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getWidth() / 2 + this.getGroup().getBoundsInParent().getWidth(); - double throneRoomY = throneRoom.getGroup().getLayoutY() + throneRoom.getGroup().getBoundsInParent().getHeight() / 2 + this.getGroup().getBoundsInParent().getHeight(); - return new Coordinates(throneRoomX, throneRoomY); + +// public Coordinates getCoordinatesToThroneRoom(ThroneRoom throneRoom) { +// double throneRoomX = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getWidth() / 2 + this.getGroup().getBoundsInParent().getWidth(); +// double throneRoomY = throneRoom.getGroup().getLayoutY() + throneRoom.getGroup().getBoundsInParent().getHeight() / 2 + this.getGroup().getBoundsInParent().getHeight(); +// return new Coordinates(throneRoomX, throneRoomY); +// } + + public Coordinates getCoordinatesToThroneRoom(ThroneRoom workstation) { + // Отримання меж групи робочої станції в координатах сцени + Bounds workstationBoundsInScene = workstation.getGroup().localToScene(workstation.getGroup().getBoundsInLocal()); + + // Отримання меж кореневої групи в координатах сцени + Bounds rootBoundsInScene = this.getGroup().getScene().getRoot().localToScene(this.getGroup().getScene().getRoot().getBoundsInLocal()); + + // Обчислення відносних координат робочої станції відносно кореневої групи + double workstationX = workstationBoundsInScene.getMinX() - rootBoundsInScene.getMinX(); + double workstationY = workstationBoundsInScene.getMinY() - rootBoundsInScene.getMinY(); + + return new Coordinates(workstationX, workstationY); } public void free() { diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java index 7ba5466..1e6b0c7 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/DwarfHandler.java @@ -10,9 +10,10 @@ import space.m0e.quga.oop.lab56maven.entities.common.Coordinates; import space.m0e.quga.oop.lab56maven.entities.common.Item; import space.m0e.quga.oop.lab56maven.entities.macro.Fortress; import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf; +import space.m0e.quga.oop.lab56maven.entities.micro.Nobel; -import java.util.Objects; import java.util.Random; +import java.util.concurrent.atomic.AtomicBoolean; public class DwarfHandler implements EventHandler<ActionEvent> { public Dwarf getDwarf() { @@ -25,10 +26,6 @@ public class DwarfHandler implements EventHandler<ActionEvent> { private int timer = 0; - public Decision getDecision() { - return decision; - } - public void setDecision(Decision decision) { this.decision = decision; } @@ -78,30 +75,47 @@ public class DwarfHandler implements EventHandler<ActionEvent> { } } else { if (decision == null) { - String decisionName = availableDecisions[new Random().nextInt(availableDecisions.length)]; - while (Objects.equals(lastDecision, decisionName)) { - decisionName = availableDecisions[new Random().nextInt(availableDecisions.length)]; - } - lastDecision = decisionName; + Fortress fortress = dwarf.getFortress(); + String decisionName = fortress.getAvailableDecisions().get(new Random().nextInt(fortress.getAvailableDecisions().size())); +// while (Objects.equals(lastDecision, decisionName)) { +// decisionName = availableDecisions[new Random().nextInt(availableDecisions.length)]; +// } +// lastDecision = decisionName; switch (decisionName) { case "GoToWorkstation" -> { if (dwarf.getAge() > 12 && dwarf.getAge() < 70 && dwarf.getAbility() != Ability.COMMUNICATION ) { - decision = new GoToWorkstationDecision(new Random().nextInt(timer + 200, timer + 500), dwarf); + decision = new GoToWorkstationDecision(new Random().nextInt(timer + 5, timer + 50), dwarf); } } case "GoToDwarvesContainer" -> { if (dwarf.getFortress().contains(dwarf)) break; - decision = new GoToDwarvesContainerDecision(new Random().nextInt(timer + 200, timer + 500), dwarf); + decision = new GoToDwarvesContainerDecision(new Random().nextInt(timer + 5, timer + 50), dwarf); } case "GoToThroneRoom" -> { if (dwarf.getAge() > 35 && dwarf.getAge() < 70) { - decision = new GoToThroneRoomDecision(new Random().nextInt(timer + 200, timer + 500), dwarf); +// if (!dwarf.getFortress().getDwarves().stream().anyMatch(dwarf1 -> { +// DwarfHandler dwarfHandler = (DwarfHandler) dwarf1.getHandler(); +// return dwarfHandler.decision.getClass().getSimpleName().equals("GoToThroneRoomDecision"); +// })) + AtomicBoolean isThroneEmpty = new AtomicBoolean(false); + dwarf.getFortress().getDwarves().stream().forEach(dwarf1 -> { + if (dwarf1 instanceof Nobel) { + return; + } + + DwarfHandler dwarfHandler = (DwarfHandler) dwarf1.getHandler(); + if (dwarfHandler.decision != null && dwarfHandler.decision.getClass().getSimpleName().equals("GoToThroneRoomDecision")) { + isThroneEmpty.set(true); + } + }); + if (!isThroneEmpty.get()) { + decision = new GoToThroneRoomDecision(new Random().nextInt(timer + 5, timer + 50), dwarf); + } } } case "GoTrading" -> { if (dwarf.getAbility() == Ability.COMMUNICATION) { - Fortress fortress = dwarf.getFortress(); Item itemToTrade; int amountToTrade; if (fortress.getWoodCount() > 0 && fortress.getWoodCount() >= fortress.getStoneCount()) { diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java index fe9a3f0..28edbb9 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/handlers/ImmigrantHandler.java @@ -37,10 +37,10 @@ public class ImmigrantHandler implements EventHandler<ActionEvent> { Platform.runLater(() -> { immigrant.getTimeline().stop(); Dwarf dwarf = new Dwarf(immigrant, fortress); - dwarf.getTimeline().play(); Main.immigrants.remove(immigrant); Main.immigrants.add(dwarf); fortress.add(dwarf); +// dwarf.getTimeline().play(); Main.root.getChildren().remove(immigrant.getGroup()); }); } |
