From fdfd7040a283b15d7c2346b6a20bda64900244b1 Mon Sep 17 00:00:00 2001 From: Andriy Cherniy Date: Sun, 16 Jun 2024 12:23:49 +0300 Subject: 20-22 --- .../lab56maven/entities/common/Coordinates.java | 2 +- .../oop/lab56maven/entities/macro/Fortress.java | 90 ++++++++++------------ .../oop/lab56maven/entities/macro/ThroneRoom.java | 4 +- .../quga/oop/lab56maven/entities/micro/Dwarf.java | 61 +++++---------- .../oop/lab56maven/entities/micro/Immigrant.java | 28 +++++++ .../quga/oop/lab56maven/entities/micro/Nobel.java | 19 ++++- 6 files changed, 111 insertions(+), 93 deletions(-) (limited to 'src/main/java/space/m0e/quga/oop/lab56maven/entities') diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java index a68f178..b30a6d5 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/common/Coordinates.java @@ -28,6 +28,6 @@ public class Coordinates { } public boolean isThere(Immigrant immigrant) { - return (int) immigrant.getX() == (int) this.x && (int) immigrant.getY() == (int) this.y; + return Math.abs(immigrant.getX() - this.x) < 2 && Math.abs(immigrant.getY() - this.y) < 2; } } 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 5114992..9e74c6a 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 @@ -1,5 +1,6 @@ package space.m0e.quga.oop.lab56maven.entities.macro; +import javafx.application.Platform; import javafx.scene.control.Alert; import javafx.scene.control.Label; import javafx.scene.image.Image; @@ -24,6 +25,11 @@ public class Fortress { private Label countLabel = new Label(); ArrayList workstations = new ArrayList<>(); + + public ArrayList getThroneRooms() { + return throneRooms; + } + ArrayList throneRooms = new ArrayList<>(); ArrayList dwarves = new ArrayList<>(); @@ -50,20 +56,12 @@ public class Fortress { nameLabel.setStyle("-fx-text-fill: red; -fx-font-size: 16px;"); -// RowConstraints insideRow = new RowConstraints(); -// insideRow.setPrefHeight(200); -// ColumnConstraints insideColumn = new ColumnConstraints(); -// insideColumn.setPrefWidth(200); -// for (int i = 0; i < 3; i++) { -// insideGroup.getRowConstraints().add(insideRow); -// insideGroup.getColumnConstraints().add(insideColumn); -// } insideGroup.setBackground(new Background(new BackgroundImage(spriteImage, BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER, BackgroundSize.DEFAULT))); insideGroup.setPrefColumns(2); insideGroup.setPrefRows(2); - insideGroup.setPrefTileHeight(200); - insideGroup.setPrefTileWidth(200); + insideGroup.setPrefTileHeight(300); + insideGroup.setPrefTileWidth(300); this.workstations = workstations; this.throneRooms = throneRooms; @@ -71,36 +69,14 @@ public class Fortress { throneRooms.forEach(throneRoom -> insideGroup.getChildren().add(throneRoom.getGroup())); insideGroup.getChildren().add(dwarvesContainer); -// int col = 0; -// int row = 0; -// for (Workstation w : this.workstations) { -// if (col > 3) { -// col = 0; -// row++; -// } -// insideGroup.add(w.getGroup(), col, row); -// col++; -// } -// -// for (ThroneRoom t : this.throneRooms) { -// if (col > 3) { -// col = 0; -// row++; -// } -// insideGroup.add(t.getGroup(), col, row); -// col++; -// } -// -// insideGroup.add(dwarvesContainer, 2, 2); - - this.dwarvesContainer.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3)))); +// this.dwarvesContainer.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3)))); // dwarvesContainer.setMinSize(100 * 3, 100 * 3); vBox.setLayoutX(x); vBox.setLayoutY(y); vBox.getChildren().addAll(nameLabel, insideGroup, countLabel); - this.vBox.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3)))); +// this.vBox.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3)))); this.vBox.setOnMouseClicked(event -> { switch (event.getButton()) { @@ -126,24 +102,28 @@ public class Fortress { public void remove(Dwarf dwarf) { dwarves.remove(dwarf); countLabel.setText(String.valueOf(dwarves.size())); - dwarvesContainer.getChildren().remove(dwarf.getGroup()); - Main.root.getChildren().add(dwarf.getGroup()); + if (dwarvesContainer.getChildren().contains(dwarf.getGroup())) + dwarvesContainer.getChildren().remove(dwarf.getGroup()); + if (!Main.root.getChildren().contains(dwarf.getGroup())) + Main.root.getChildren().add(dwarf.getGroup()); } - public void process() { - ArrayList migration = (ArrayList) Main.immigrants.stream().filter(immigrant -> immigrant.getClass().equals(Immigrant.class) && immigrant.getCoordinatesToFortress(this).isThere(immigrant)).collect(Collectors.toList()); - migration.forEach(immigrant -> { - Dwarf dwarf = new Dwarf(immigrant, this); - Main.immigrants.add(dwarf); - this.dwarves.add(dwarf); - Main.root.getChildren().remove(immigrant.getGroup()); + public void removeFromContainer(Dwarf dwarf) { + Platform.runLater(() -> { + if (dwarvesContainer.getChildren().contains(dwarf.getGroup())) { + dwarvesContainer.getChildren().remove(dwarf.getGroup()); + Main.root.getChildren().add(dwarf.getGroup()); + } }); - Main.immigrants.removeAll(migration); - - countLabel.setText(String.valueOf(dwarves.size())); + } - workstations.forEach(Workstation::process); - throneRooms.forEach(ThroneRoom::process); + public void addToContainer(Dwarf dwarf) { + Platform.runLater(() -> { + if (Main.root.getChildren().contains(dwarf.getGroup())) { + Main.root.getChildren().remove(dwarf.getGroup()); + dwarvesContainer.getChildren().add(dwarf.getGroup()); + } + }); } public double getX() { @@ -166,4 +146,18 @@ public class Fortress { return dwarves; } + public String serialize() { + return String.join(",", new String[]{ + this.getClass().getSimpleName(), + this.name, + String.valueOf(this.getX()), + String.valueOf(this.getY()), + "", + "", + "", + "", + "", + }); + } + } diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java index 7a51cb5..fa31908 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/macro/ThroneRoom.java @@ -38,8 +38,8 @@ public class ThroneRoom { Main.root.getChildren().add(vBox); }; - public void process() { - countLabel.setText(String.valueOf(nobels.size())); + public void add(Nobel nobel) { + nobels.add(nobel); } public ArrayList getNobels() { 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 9c3008e..3197a99 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 @@ -5,6 +5,7 @@ import space.m0e.quga.oop.lab56maven.Main; import space.m0e.quga.oop.lab56maven.entities.common.Ability; import space.m0e.quga.oop.lab56maven.entities.common.Coordinates; import space.m0e.quga.oop.lab56maven.entities.macro.Fortress; +import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom; import space.m0e.quga.oop.lab56maven.entities.macro.Workstation; import space.m0e.quga.oop.lab56maven.threads.DwarfThread; @@ -42,8 +43,6 @@ public class Dwarf extends Immigrant { public Dwarf(String firstName, String lastName, int age, double x, double y, Ability ability) { super(firstName, lastName, age, x, y, ability); getSprite().setImage(spriteImage); - this.setThread(new DwarfThread(this)); - this.getThread().start(); } public Dwarf() { @@ -58,6 +57,10 @@ public class Dwarf extends Immigrant { this.fortress = fortress; } + public Dwarf(String serializedData) { + super(serializedData); + } + public Workstation findNearestWorkstation() { ArrayList searchWorkstations = (ArrayList) fortress.getWorkstations().stream().filter(w -> w.getDwarves().isEmpty()).collect(Collectors.toList()); searchWorkstations.sort((o1, o2) -> (int) ((Math.abs(o1.getGroup().getLayoutX() - this.getX()) + Math.abs(o1.getGroup().getLayoutY() - this.getY())) - ((Math.abs(o2.getGroup().getLayoutX() - this.getX()) + Math.abs(o2.getGroup().getLayoutY() - this.getY()))))); @@ -68,51 +71,27 @@ public class Dwarf extends Immigrant { } } + public ThroneRoom findNearestThroneRoom() { + ArrayList searchThroneRooms = (ArrayList) fortress.getThroneRooms().stream().filter(w -> w.getNobels().size() < 2).collect(Collectors.toList()); + searchThroneRooms.sort((o1, o2) -> (int) ((Math.abs(o1.getGroup().getLayoutX() - this.getX()) + Math.abs(o1.getGroup().getLayoutY() - this.getY())) - ((Math.abs(o2.getGroup().getLayoutX() - this.getX()) + Math.abs(o2.getGroup().getLayoutY() - this.getY()))))); + if (searchThroneRooms.isEmpty()) { + return null; + } else { + return searchThroneRooms.get(0); + } + } + public Coordinates getCoordinatesToWorkstation(Workstation workstation) { double workstationX = workstation.getGroup().getLayoutX() + workstation.getGroup().getBoundsInParent().getWidth() - this.getGroup().getBoundsInParent().getWidth(); double workstationY = workstation.getGroup().getLayoutX() + workstation.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight(); return new Coordinates(workstationX, workstationY); } -// @Override -// public void moveAI() { -// if (fortress == null) { -// fortress = findNearestFortress(); -// fortress.getDwarves().add(this); -// } -// if (!fortress.getGroup().getBoundsInParent().contains(this.getGroup().getBoundsInParent())) { -// super.moveAI(); -// } else { -// if (workstation == null) { -// workstation = findNearestWorkstation(); -// if (workstation == null) { -// super.moveAI(); -// } else { -// Coordinates workstationToMove = this.getCoordinatesToWorkstation(workstation); -// if (!workstationToMove.isThere(this)) { -// double workstationX = workstationToMove.getX(); -// double workstationY = workstationToMove.getY(); -// -// if (workstationX > this.getX()) { -// this.setX(this.getX() + 1); -// } -// -// if (workstationX < this.getX()) { -// this.setX(this.getX() - 1); -// } -// -// if (workstationY > this.getY()) { -// this.setY(this.getY() + 1); -// } -// -// if (workstationY < this.getY()) { -// this.setY(this.getY() - 1); -// } -// } -// } -// } -// } -// } + public Coordinates getCoordinatesToThroneRoom(ThroneRoom throneRoom) { + double throneRoomX = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getWidth() - this.getGroup().getBoundsInParent().getWidth(); + double throneRoomY = throneRoom.getGroup().getLayoutX() + throneRoom.getGroup().getBoundsInParent().getHeight() - this.getGroup().getBoundsInParent().getHeight(); + return new Coordinates(throneRoomX, throneRoomY); + } public void free() { if (fortress == null) { diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java index 77a9c63..2c86526 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Immigrant.java @@ -91,6 +91,20 @@ public class Immigrant implements Comparable, Cloneable { this("Edzul", "Èrithbesmar", 35, 0, 0, Ability.values()[new Random().nextInt(Ability.values().length)]); } + public Immigrant(String serializedData) { + this(); + String[] params = serializedData.split(","); + this.setFirstName(params[1].split(" ")[0]); + this.setLastName(params[1].split(" ")[1]); + this.setX(Double.parseDouble(params[2])); + this.setY(Double.parseDouble(params[3])); + this.age = Integer.parseInt(params[4]); + this.setHp(Double.parseDouble(params[5])); + this.setMaxHp(Double.parseDouble(params[6])); + this.items = new ArrayList<>(List.of(params[7].split(";"))); + this.ability = Ability.valueOf(params[8]); + } + public boolean isActive() { return isActive; } @@ -337,4 +351,18 @@ public class Immigrant implements Comparable, Cloneable { return thread; } + public String serialize() { + return String.join(",", new String[]{ + this.getClass().getSimpleName(), + this.getFullName(), + String.valueOf(this.getX()), + String.valueOf(this.getY()), + String.valueOf(this.getAge()), + String.valueOf(this.getHp()), + String.valueOf(this.getMaxHp()), + String.join(";", this.getItems()), + this.ability.toString() + }); + } + } diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java index ed9ba7a..3de303d 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/entities/micro/Nobel.java @@ -2,12 +2,16 @@ package space.m0e.quga.oop.lab56maven.entities.micro; import javafx.scene.image.Image; import space.m0e.quga.oop.lab56maven.entities.common.Ability; +import space.m0e.quga.oop.lab56maven.entities.macro.Fortress; +import space.m0e.quga.oop.lab56maven.entities.macro.ThroneRoom; +import java.util.ArrayList; import java.util.Objects; import java.util.Random; -public class Nobel extends Immigrant { +public class Nobel extends Dwarf { public Image spriteImage = new Image(Objects.requireNonNull(Nobel.class.getResourceAsStream("nobel.png")));; + private ThroneRoom throneRoom; public Nobel(String firstName, String lastName, int age, double x, double y, Ability ability) { super(firstName, lastName, age, x, y, ability); getSprite().setImage(spriteImage); @@ -16,4 +20,17 @@ public class Nobel extends Immigrant { public Nobel() { this("Edzul", "Èrithbesmar", 35, 0, 0, Ability.values()[new Random().nextInt(Ability.values().length)]); } + + public Nobel(Immigrant immigrant, ThroneRoom throneRoom) { + this(immigrant.getFirstName(), immigrant.getLastName(), immigrant.getAge(), immigrant.getX(), immigrant.getY(), immigrant.getAbility()); + this.setItems((ArrayList) immigrant.getItems().clone()); + this.setHp(this.getHp()); + this.setMaxHp(this.getMaxHp()); + this.throneRoom = throneRoom; + } + + public Nobel(String serializedData) { + super(serializedData); + } + } -- cgit v1.3-3-ga95d