diff --git a/.gitignore b/.gitignore index 6df27a3..6c0b6f6 100644 --- a/.gitignore +++ b/.gitignore @@ -122,4 +122,4 @@ bin/ oolab/.idea/ oolab/gradlew.bat oolab/gradlew -oolab/.gitignore \ No newline at end of file +oolab/.gitignore diff --git a/README.md b/README.md index f84bf95..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,6 +0,0 @@ -Kamil Rudny -Piątek 11:20 -Gerard -https://gitexercises.fracz.com/committer/4a757cf05e8a3f76ed8599ee38a79085391ed03d?email=karudny@student.agh.edu.pl - -Za zadania z gita z srebrnej skrzynki chce marchewkę lab, a z brązowej weterynarza. \ No newline at end of file diff --git a/oolab/build.gradle b/oolab/build.gradle index 2618d76..e944566 100644 --- a/oolab/build.gradle +++ b/oolab/build.gradle @@ -1,31 +1,39 @@ plugins { - id 'application' - id 'java' + id("application") + id("java") + id("org.openjfx.javafxplugin") version "0.0.13" } -group = 'org.example' -version = '1.0-SNAPSHOT' +application { + getMainClass().set("agh.ics.oop.WorldGUI") +} -repositories { - mavenCentral() +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } } -dependencies { - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' - testImplementation 'junit:junit:4.13.1' +group = "org.example" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() } -test { - useJUnitPlatform() +javafx { + version = "17" + modules("javafx.controls", "javafx.fxml") } -application { - getMainClass().set('agh.ics.oop.World') +dependencies { + implementation("junit:junit:4.13.1") + implementation("junit:junit:4.13.1") + implementation("junit:junit:4.13.1") + testImplementation(platform("org.junit:junit-bom:5.9.1")) + testImplementation("org.junit.jupiter:junit-jupiter") } -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) - } +tasks.test { + useJUnitPlatform() } \ No newline at end of file diff --git a/oolab/src/main/java/agh/ics/oop/Simulation.java b/oolab/src/main/java/agh/ics/oop/Simulation.java index 0794c18..1939b7d 100644 --- a/oolab/src/main/java/agh/ics/oop/Simulation.java +++ b/oolab/src/main/java/agh/ics/oop/Simulation.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; -public class Simulation implements Runnable{ +public class Simulation extends Thread implements Runnable{ private final List Animals = new ArrayList<>(); private List Moves = new ArrayList<>(); private final WorldMap Map; @@ -28,15 +28,16 @@ public Simulation(List positions, List moves, WorldMap public synchronized void run() { int animal_count = Animals.size(); - int cnt = 0; - for(MoveDirection currentMove : Moves) { - Animal current_animal = Animals.get(0); - Animals.remove(0); - System.out.println("Zwierze " + ((cnt % animal_count) + 1) + " " + current_animal.toString()); - Map.move(current_animal, currentMove); - - cnt += 1; - Animals.add(current_animal); + try { + for(MoveDirection currentMove : Moves) { + Thread.sleep(500); + Animal current_animal = Animals.get(0); + Animals.remove(0); + Map.move(current_animal, currentMove); + Animals.add(current_animal); + } + } catch (InterruptedException e) { + e.printStackTrace(); } } diff --git a/oolab/src/main/java/agh/ics/oop/SimulationApp.java b/oolab/src/main/java/agh/ics/oop/SimulationApp.java new file mode 100644 index 0000000..9abd9bc --- /dev/null +++ b/oolab/src/main/java/agh/ics/oop/SimulationApp.java @@ -0,0 +1,38 @@ +package agh.ics.oop; + +import agh.ics.oop.model.ConsoleMapDisplay; +import agh.ics.oop.model.GrassField; +import agh.ics.oop.presenter.SimulationPresenter; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; + +import java.io.IOException; + +public class SimulationApp extends Application { + + @Override + public void start(Stage primaryStage) throws IOException { + FXMLLoader loader = new FXMLLoader(); + loader.setLocation(getClass().getClassLoader().getResource("simulation.fxml")); + BorderPane viewRoot = loader.load(); + SimulationPresenter presenter = loader.getController(); + GrassField grassField = new GrassField(10); + presenter.setWorldMap(grassField); + grassField.addListener(presenter); + + configureStage(primaryStage, viewRoot); + primaryStage.show(); + } + + private void configureStage(Stage primaryStage, BorderPane viewRoot) { + var scene = new Scene(viewRoot); + primaryStage.setScene(scene); + primaryStage.setTitle("Simulation app"); + primaryStage.minWidthProperty().bind(viewRoot.minWidthProperty()); + primaryStage.minHeightProperty().bind(viewRoot.minHeightProperty()); + } +} \ No newline at end of file diff --git a/oolab/src/main/java/agh/ics/oop/World.java b/oolab/src/main/java/agh/ics/oop/World.java index 841f5a6..ae8bb12 100644 --- a/oolab/src/main/java/agh/ics/oop/World.java +++ b/oolab/src/main/java/agh/ics/oop/World.java @@ -1,6 +1,7 @@ package agh.ics.oop; import agh.ics.oop.model.*; +import javafx.application.Application; import org.w3c.dom.css.Rect; import java.util.ArrayList; @@ -30,32 +31,7 @@ public static void run(List directions) { } public static void main(String[] args) { - List directions = new ArrayList<>(); - - String[] args1 = {"f", "f","f","f","f","f","f","f","f"}; - - try { - List listOfSimulations = new ArrayList<>(); - ConsoleMapDisplay listener = new ConsoleMapDisplay(); - for(int i = 0; i < 20; i++) { - directions = OptionsParser.Parser(args1); - List positions = List.of(new Vector2d(2,2), new Vector2d(3,4), new Vector2d(0,0)); - GrassField map = new GrassField(10); - map.addListener(listener); - listOfSimulations.add(new Simulation(positions, directions, map)); - } - - - SimulationEngine simulationEngine = new SimulationEngine(listOfSimulations); - simulationEngine.runAsyncInThreadPool(); - simulationEngine.awaitSimulationsEnds(); - - System.out.println("koniec programu"); - - } catch (IllegalArgumentException | InterruptedException e){ - e.printStackTrace(); - } - + Application.launch(SimulationApp.class, args); } } diff --git a/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java b/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java index 8d35daf..c4f755b 100644 --- a/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java +++ b/oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java @@ -29,7 +29,6 @@ public void runAsync() { thread.start(); } } - public void awaitSimulationsEnds() throws InterruptedException { for(Thread thread : simulationThreads) { @@ -43,7 +42,6 @@ public void awaitSimulationsEnds() throws InterruptedException } } } - public void runAsyncInThreadPool(){ simulatorExecutor = newFixedThreadPool(4); simulationList.forEach(simulatorExecutor :: submit); diff --git a/oolab/src/main/java/agh/ics/oop/model/WorldMap.java b/oolab/src/main/java/agh/ics/oop/model/WorldMap.java index 5371a75..b31ef44 100644 --- a/oolab/src/main/java/agh/ics/oop/model/WorldMap.java +++ b/oolab/src/main/java/agh/ics/oop/model/WorldMap.java @@ -44,4 +44,6 @@ public interface WorldMap extends MoveValidator { WorldElement objectAt(Vector2d position); String getId(); + + public Boundary getCurrentBounds(); } \ No newline at end of file diff --git a/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java b/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java new file mode 100644 index 0000000..671b6eb --- /dev/null +++ b/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java @@ -0,0 +1,137 @@ +package agh.ics.oop.presenter; + +import agh.ics.oop.OptionsParser; +import agh.ics.oop.Simulation; +import agh.ics.oop.model.SimulationEngine; +import agh.ics.oop.model.*; +import javafx.application.Platform; +import javafx.fxml.FXML; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; + + +import java.util.ArrayList; +import java.util.List; + +public class SimulationPresenter implements MapChangeListener { + private WorldMap worldMap; + public void setWorldMap(WorldMap worldMap) { + this.worldMap = worldMap; + } + + @FXML + private Label infoLabel; + @FXML + private TextField movesListTextField; + @FXML + private Label moveInfoLabel; + @FXML + private Button startButton; + + private void clearGrid() { + mapGrid.getChildren().retainAll(mapGrid.getChildren().get(0)); + mapGrid.getColumnConstraints().clear(); + mapGrid.getRowConstraints().clear(); + } + + private void drawAxes(Boundary boundary) { + drawXAxis(boundary); + drawYAxis(boundary); + Label label = new Label("x/y"); + label.setMinWidth(50); + label.setMinHeight(50); + label.setAlignment(Pos.CENTER); + mapGrid.add(label, 0, 0); + + + } + + private void drawXAxis(Boundary boundary) { + for (int j = boundary.MAP_LEFT_BOTTOM().getX(); j <= boundary.MAP_RIGHT_TOP().getX(); j++) { + Label label = new Label(Integer.toString(j)); + label.setMinWidth(50); + label.setMinHeight(50); + label.setAlignment(Pos.CENTER); + mapGrid.add(label, j + 1 - boundary.MAP_LEFT_BOTTOM().getX(), 0); // Dodajemy etykiety osi X na górze siatki + } + } + + private void drawYAxis(Boundary boundary) { + for (int i = boundary.MAP_LEFT_BOTTOM().getY(); i <= boundary.MAP_RIGHT_TOP().getY(); i++) { + Label label = new Label(Integer.toString(i)); + label.setMinWidth(50); + label.setMinHeight(50); + label.setAlignment(Pos.CENTER); + mapGrid.add(label, 0, boundary.MAP_RIGHT_TOP().getY() - i + 1); // Dodajemy etykiety osi Y po lewej stronie siatki + } + } + + @FXML + public void drawMap() { + clearGrid(); + Boundary boundary = worldMap.getCurrentBounds(); + drawAxes(boundary); + drawGrid(boundary); + infoLabel.setText(""); + } + + private void drawGrid(Boundary boundary) { + for (int i = boundary.MAP_LEFT_BOTTOM().getY(); i <= boundary.MAP_RIGHT_TOP().getY(); i++) { + for (int j = boundary.MAP_LEFT_BOTTOM().getX(); j <= boundary.MAP_RIGHT_TOP().getX(); j++) { + Vector2d position = new Vector2d(j, i); + drawGridCell(position, j - boundary.MAP_LEFT_BOTTOM().getX() + 1, boundary.MAP_RIGHT_TOP().getY() - i + 1); + } + } + } + + private void drawGridCell(Vector2d position, int column, int row) { + WorldElement element = worldMap.objectAt(position); + Label label = createLabelForElement(element); + mapGrid.add(label, column, row); + } + + private Label createLabelForElement(WorldElement element) { + Label label; + if (element != null) { + label = new Label(element.toString()); + } else { + label = new Label(" "); + } + label.setMinWidth(50); + label.setMinHeight(50); + label.setAlignment(Pos.CENTER); + return label; + } + + + @Override + public void mapChanged(WorldMap worldMap, String message) { + Platform.runLater(() -> { + this.drawMap(); + moveInfoLabel.setText(message); + }); + } + @FXML + public void onSimulationStartClicked() { + String movesString = movesListTextField.getText(); + try { + List movesList = OptionsParser.Parser(movesString.split("")); + List listOfSimulations = new ArrayList<>(); + listOfSimulations.add(new Simulation(List.of(new Vector2d(3,2), new Vector2d(5,5)), movesList, worldMap)); + + SimulationEngine simulationEngine = new SimulationEngine(listOfSimulations); + simulationEngine.runAsync(); + + + + Platform.runLater(() -> startButton.setDisable(true)); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + @FXML + private GridPane mapGrid; +} \ No newline at end of file diff --git a/oolab/src/main/resources/simulation.fxml b/oolab/src/main/resources/simulation.fxml new file mode 100644 index 0000000..22a00bb --- /dev/null +++ b/oolab/src/main/resources/simulation.fxml @@ -0,0 +1,26 @@ + + + + + + + + + + + +
+ + + +
+
\ No newline at end of file