diff options
| author | Andriy Cherniy <qugalet@m0e.space> | 2024-06-16 12:23:49 +0300 |
|---|---|---|
| committer | Andriy Cherniy <qugalet@m0e.space> | 2024-06-16 12:23:49 +0300 |
| commit | fdfd7040a283b15d7c2346b6a20bda64900244b1 (patch) | |
| tree | b01c75f7e4354d4259f0aeb30f081ca3b2b14312 | |
| parent | d0f951643060821673e060eea7376000418c457b (diff) | |
| download | oop-kursach-fdfd7040a283b15d7c2346b6a20bda64900244b1.tar.gz oop-kursach-fdfd7040a283b15d7c2346b6a20bda64900244b1.zip | |
20-22
16 files changed, 408 insertions, 109 deletions
@@ -35,4 +35,7 @@ build/ .vscode/ ### Mac OS ### -.DS_Store
\ No newline at end of file +.DS_Store + +Lab_5_24.docx +Lab_5_24.pdf diff --git a/genlisting b/genlisting new file mode 100755 index 0000000..10377f0 --- /dev/null +++ b/genlisting @@ -0,0 +1,7 @@ +#!/usr/bin/env sh + +find . -type f \( -name "*.java" -o -name "*.fxml" -o -name "*.c" \) | while read -r java_file; do + printf "## $(basename $java_file):\n\n\`\`\`java\n" >> listing.md + cat "$java_file" >> listing.md + printf "\`\`\`\n\n\n" >> listing.md +done 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 1549ff5..25ba617 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/Main.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/Main.java @@ -10,18 +10,25 @@ import javafx.scene.input.KeyCode; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; +import javafx.stage.FileChooser; import javafx.stage.Stage; +import space.m0e.quga.oop.lab56maven.dialogs.CountDialog; import space.m0e.quga.oop.lab56maven.dialogs.InsertDialog; import space.m0e.quga.oop.lab56maven.dialogs.SearchDialog; import space.m0e.quga.oop.lab56maven.entities.common.Ability; +import space.m0e.quga.oop.lab56maven.entities.common.Utils; 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.entities.micro.Dwarf; import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant; +import space.m0e.quga.oop.lab56maven.entities.micro.Nobel; +import space.m0e.quga.oop.lab56maven.threads.DwarfThread; +import space.m0e.quga.oop.lab56maven.threads.ImmigrantThread; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.concurrent.Executors; @@ -35,9 +42,17 @@ public class Main extends Application { public static ArrayList<Fortress> fortresses = new ArrayList<>(); public static Label status = new Label(); + public static final double width = 3555; + public static final double height = 2000; + @Override public void start(Stage stage) throws IOException, InterruptedException { - Rectangle rect = new Rectangle(3000, 2000, Color.WHITE); + Rectangle rect = new Rectangle(width, height, Color.WHITE); +// rect.setStroke(Color.BLUE); +// rect.setStrokeWidth(10); + + FileChooser fileChooser = new FileChooser(); + fileChooser.setInitialFileName("serial.csv"); root.getChildren().add(rect); Fortress fortress = new Fortress("Eartha", 150, 150, new ArrayList<>(List.of(new Workstation("Torgrus"))), new ArrayList<>(List.of(new ThroneRoom("Halzorga")))); @@ -47,13 +62,8 @@ public class Main extends Application { immigrants.getFirst().setX(100); immigrants.getFirst().setY(100); -// BorderPane borderPane = new BorderPane(); -// borderPane.setCenter(root); -// borderPane.setTop(status); - -// root.setStyle("-fx-background-color:rgb(186,153,122,0.7);"); root.getChildren().add(status); - Scene scene = new Scene(root, 1500, 700); + Scene scene = new Scene(root, width/4, height/4); scene.setOnKeyPressed(event -> { switch (event.getCode()) { @@ -123,6 +133,90 @@ public class Main extends Application { alert.setContentText(immigrants.stream().map(Immigrant::toString).collect(Collectors.joining("\n"))); alert.showAndWait(); } + + case W -> { + if (root.getLayoutY() + 20 <= 0) + root.setLayoutY(root.getLayoutY()+20); + } + + case S -> { + if (root.getLayoutY() - 20 - stage.getHeight() >= -height) + root.setLayoutY(root.getLayoutY()-20); + } + + case A -> { + if (root.getLayoutX() + 20 <= 0) + root.setLayoutX(root.getLayoutX()+20); + } + + case D -> { + if (root.getLayoutX() - 20 - stage.getWidth() >= -width) + root.setLayoutX(root.getLayoutX()-20); + } + + case F5 -> { + File file = fileChooser.showSaveDialog(stage); + String finalSerializeData = ""; // "class,name,age,hp,max_hp,items,x,y\n"; + finalSerializeData += immigrants.stream().map(Immigrant::serialize).collect(Collectors.joining("\n")); + finalSerializeData += "\n" + fortresses.stream().map(Fortress::serialize).collect(Collectors.joining("\n")); + System.out.println(finalSerializeData); + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write(finalSerializeData); + writer.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + case F6 -> { + File file = fileChooser.showOpenDialog(stage); + try { + immigrants.forEach(immigrant -> { + if (Main.root.getChildren().contains(immigrant.getGroup())) { + Main.root.getChildren().remove(immigrant.getGroup()); + } else { + fortresses.forEach(fortress1 -> { + fortress1.removeFromContainer((Dwarf) immigrant); + fortress1.remove((Dwarf) immigrant); + }); + } + immigrant.getThread().interrupt(); + }); + immigrants.clear(); + StringBuilder finalDeserializeData = new StringBuilder(); + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line; + while ((line = reader.readLine()) != null) { + finalDeserializeData.append(line).append("\n"); + } + Arrays.stream(finalDeserializeData.toString().split("\n")).forEach(data -> { + String[] params = data.split(","); + switch (params[0]) { + case "Immigrant" -> { + Immigrant immigrant = new Immigrant(data); + immigrant.setThread(new ImmigrantThread(immigrant)); + immigrant.getThread().start(); + immigrants.add(immigrant); + } + case "Dwarf" -> { + Dwarf dwarf = new Dwarf(data); + dwarf.setThread(new DwarfThread(dwarf)); + dwarf.getThread().start(); + immigrants.add(dwarf); + } + case "Nobel" -> { + Dwarf nobel = new Nobel(data); + nobel.setThread(new DwarfThread(nobel)); + nobel.getThread().start(); + immigrants.add(nobel); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } } }); diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java new file mode 100644 index 0000000..a68f658 --- /dev/null +++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/Decision.java @@ -0,0 +1,35 @@ +package space.m0e.quga.oop.lab56maven.decisions; + +public abstract class Decision { + + private int executeWhen; + + public boolean isComplete() { + return isComplete; + } + + public void setComplete(boolean complete) { + isComplete = complete; + } + + private boolean isComplete = false; + + public Decision(int executeWhen) { + this.executeWhen = executeWhen; + } + + public int getExecuteWhen() { + return executeWhen; + } + + public void setExecuteWhen(int executeWhen) { + this.executeWhen = executeWhen; + } + + public abstract void cycle(); + + @Override + public String toString() { + return String.format("Decision [executeWhen=%d, isComplete=%b]", executeWhen, isComplete); + } +} diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java new file mode 100644 index 0000000..6ad8fad --- /dev/null +++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToDwarvesContainerDecision.java @@ -0,0 +1,26 @@ +package space.m0e.quga.oop.lab56maven.decisions; + +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.Workstation; +import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf; + +public class GoToDwarvesContainerDecision extends Decision { + private Dwarf dwarf; + + public GoToDwarvesContainerDecision(int executeWhen, Dwarf dwarf) { + super(executeWhen); + this.dwarf = dwarf; + } + + @Override + public void cycle() { + Fortress fortress = dwarf.getFortress(); + Coordinates nearCoordinates = new Coordinates(fortress.getGroup().getBoundsInParent().getCenterX(), fortress.getGroup().getBoundsInParent().getCenterY()); + dwarf.move(nearCoordinates); + if (nearCoordinates.isThere(dwarf)) { + fortress.addToContainer(dwarf); + setComplete(true); + } + } +}
\ No newline at end of file diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java new file mode 100644 index 0000000..ba44d08 --- /dev/null +++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToThroneRoomDecision.java @@ -0,0 +1,45 @@ +package space.m0e.quga.oop.lab56maven.decisions; + +import javafx.application.Platform; +import space.m0e.quga.oop.lab56maven.Main; +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.micro.Dwarf; +import space.m0e.quga.oop.lab56maven.entities.micro.Nobel; + +import java.util.ArrayList; +import java.util.stream.Collectors; + +public class GoToThroneRoomDecision extends Decision { + private Dwarf dwarf; + + public GoToThroneRoomDecision(int executeWhen, Dwarf dwarf) { + super(executeWhen); + this.dwarf = dwarf; + } + + @Override + public void cycle() { + ThroneRoom throneRoom = dwarf.findNearestThroneRoom(); + if (throneRoom != null) { + dwarf.getFortress().removeFromContainer(dwarf); + Coordinates nearCoordinates = dwarf.getCoordinatesToThroneRoom(throneRoom); + dwarf.move(nearCoordinates); + if (nearCoordinates.isThere(dwarf)) { + Platform.runLater(() -> { + Fortress fort = Main.fortresses.stream().filter(fortress -> fortress.getThroneRooms().contains(throneRoom)).collect(Collectors.toCollection(ArrayList::new)).get(0); + dwarf.getFortress().remove(dwarf); + Nobel nobel = new Nobel(dwarf, throneRoom); + Main.immigrants.remove(dwarf); + Main.immigrants.add(nobel); + fort.add(nobel); + fort.removeFromContainer(nobel); + throneRoom.add(nobel); + dwarf.getThread().interrupt(); + }); + setComplete(true); + } + } + } +}
\ No newline at end of file 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 new file mode 100644 index 0000000..06f69e9 --- /dev/null +++ b/src/main/java/space/m0e/quga/oop/lab56maven/decisions/GoToWorkstationDecision.java @@ -0,0 +1,29 @@ +package space.m0e.quga.oop.lab56maven.decisions; + +import space.m0e.quga.oop.lab56maven.entities.common.Coordinates; +import space.m0e.quga.oop.lab56maven.entities.macro.Workstation; +import space.m0e.quga.oop.lab56maven.entities.micro.Dwarf; + +public class GoToWorkstationDecision extends Decision { + + private Dwarf dwarf; + + public GoToWorkstationDecision(int executeWhen, Dwarf dwarf) { + super(executeWhen); + this.dwarf = dwarf; + } + + @Override + public void cycle() { + Workstation near = dwarf.findNearestWorkstation(); + if (near != null) { + dwarf.getFortress().removeFromContainer(dwarf); + Coordinates nearCoordinates = dwarf.getCoordinatesToWorkstation(near); + dwarf.move(nearCoordinates); + if (nearCoordinates.isThere(dwarf)) { + dwarf.setWorkstation(near); + setComplete(true); + } + } + } +} diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java b/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java index 13226c8..b4aba1d 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/dialogs/InsertDialog.java @@ -94,9 +94,9 @@ public class InsertDialog implements Initializable { if (!generateItems.isSelected()) { immigrant.setItems(new ArrayList<>()); } + Main.immigrants.add(immigrant); immigrant.getThread().start(); - Main.immigrants.add(immigrant); } case "Dwarf" -> { Dwarf dwarf = new Dwarf(firstName.getText(), lastName.getText(), inputAge, inputX, inputY, inputAbility); 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<Workstation> workstations = new ArrayList<>(); + + public ArrayList<ThroneRoom> getThroneRooms() { + return throneRooms; + } + ArrayList<ThroneRoom> throneRooms = new ArrayList<>(); ArrayList<Dwarf> 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<Immigrant> migration = (ArrayList<Immigrant>) 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<Nobel> 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<Workstation> searchWorkstations = (ArrayList<Workstation>) 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<ThroneRoom> searchThroneRooms = (ArrayList<ThroneRoom>) 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<Immigrant>, 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<Immigrant>, 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<String>) immigrant.getItems().clone()); + this.setHp(this.getHp()); + this.setMaxHp(this.getMaxHp()); + this.throneRoom = throneRoom; + } + + public Nobel(String serializedData) { + super(serializedData); + } + } diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java b/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java index a662a6a..cffeeea 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/threads/DwarfThread.java @@ -2,11 +2,17 @@ package space.m0e.quga.oop.lab56maven.threads; import javafx.application.Platform; import space.m0e.quga.oop.lab56maven.Main; +import space.m0e.quga.oop.lab56maven.decisions.Decision; +import space.m0e.quga.oop.lab56maven.decisions.GoToDwarvesContainerDecision; +import space.m0e.quga.oop.lab56maven.decisions.GoToThroneRoomDecision; +import space.m0e.quga.oop.lab56maven.decisions.GoToWorkstationDecision; 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.micro.Dwarf; import space.m0e.quga.oop.lab56maven.entities.micro.Immigrant; +import java.util.Objects; +import java.util.Random; import java.util.concurrent.TimeUnit; public class DwarfThread extends Thread { @@ -14,6 +20,15 @@ public class DwarfThread extends Thread { return dwarf; } + private int timer = 0; + private Decision decision; + private static final String[] availableDecisions = new String[]{ + "GoToWorkstation", + "GoToDwarvesContainer", +// "GoToThroneRoom" + }; + private static String lastDecision; + public void setDwarf(Dwarf dwarf) { this.dwarf = dwarf; } @@ -33,13 +48,9 @@ public class DwarfThread extends Thread { try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { - throw new RuntimeException(e); + break; } -// Fortress fortress = dwarf.findNearestFortress(); -// if (fortress != null) { -// Coordinates moveTo = dwarf.getCoordinatesToFortress(fortress); -// dwarf.move(moveTo); -// } + timer++; if (dwarf.getFortress() == null) { Fortress fortress = dwarf.findNearestFortress(); if (fortress != null) { @@ -53,6 +64,35 @@ public class DwarfThread extends Thread { }); } } + } 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; + switch (decisionName) { + case "GoToWorkstation" -> { + if (dwarf.getAge() > 12 && dwarf.getAge() < 70) { + decision = new GoToWorkstationDecision(new Random().nextInt(timer + 200, timer + 500), dwarf); + } + } + case "GoToDwarvesContainer" -> { + decision = new GoToDwarvesContainerDecision(new Random().nextInt(timer + 200, timer + 500), dwarf); + } + case "GoToThroneRoom" -> { + if (dwarf.getAge() > 35 && dwarf.getAge() < 70) { + decision = new GoToThroneRoomDecision(new Random().nextInt(timer + 200, timer + 500), dwarf); + } + } + } + } else { + if (decision.getExecuteWhen() < timer) { + decision.cycle(); + } + if (decision.isComplete()) + decision = null; + } } } } diff --git a/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java b/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java index 1eb8bbb..b3406d8 100644 --- a/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java +++ b/src/main/java/space/m0e/quga/oop/lab56maven/threads/ImmigrantThread.java @@ -42,6 +42,8 @@ public class ImmigrantThread extends Thread { if (moveTo.isThere(immigrant)) { Platform.runLater(() -> { Dwarf dwarf = new Dwarf(immigrant, fortress); + dwarf.setThread(new DwarfThread(dwarf)); + dwarf.getThread().start(); Main.immigrants.remove(immigrant); Main.immigrants.add(dwarf); fortress.add(dwarf); |
