Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,4 @@ bin/
oolab/.idea/
oolab/gradlew.bat
oolab/gradlew
oolab/.gitignore
oolab/.gitignore
6 changes: 0 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.
44 changes: 26 additions & 18 deletions oolab/build.gradle
Original file line number Diff line number Diff line change
@@ -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()
}
21 changes: 11 additions & 10 deletions oolab/src/main/java/agh/ics/oop/Simulation.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Animal> Animals = new ArrayList<>();
private List<MoveDirection> Moves = new ArrayList<>();
private final WorldMap Map;
Expand All @@ -28,15 +28,16 @@ public Simulation(List<Vector2d> positions, List<MoveDirection> 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();
}
}

Expand Down
38 changes: 38 additions & 0 deletions oolab/src/main/java/agh/ics/oop/SimulationApp.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
28 changes: 2 additions & 26 deletions oolab/src/main/java/agh/ics/oop/World.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -30,32 +31,7 @@ public static void run(List<MoveDirection> directions) {
}

public static void main(String[] args) {
List<MoveDirection> directions = new ArrayList<>();

String[] args1 = {"f", "f","f","f","f","f","f","f","f"};

try {
List <Simulation> listOfSimulations = new ArrayList<>();
ConsoleMapDisplay listener = new ConsoleMapDisplay();
for(int i = 0; i < 20; i++) {
directions = OptionsParser.Parser(args1);
List<Vector2d> 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);

}
}
2 changes: 0 additions & 2 deletions oolab/src/main/java/agh/ics/oop/model/SimulationEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ public void runAsync() {
thread.start();
}
}

public void awaitSimulationsEnds() throws InterruptedException
{
for(Thread thread : simulationThreads) {
Expand All @@ -43,7 +42,6 @@ public void awaitSimulationsEnds() throws InterruptedException
}
}
}

public void runAsyncInThreadPool(){
simulatorExecutor = newFixedThreadPool(4);
simulationList.forEach(simulatorExecutor :: submit);
Expand Down
2 changes: 2 additions & 0 deletions oolab/src/main/java/agh/ics/oop/model/WorldMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,6 @@ public interface WorldMap extends MoveValidator {
WorldElement objectAt(Vector2d position);

String getId();

public Boundary getCurrentBounds();
}
137 changes: 137 additions & 0 deletions oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java
Original file line number Diff line number Diff line change
@@ -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<MoveDirection> movesList = OptionsParser.Parser(movesString.split(""));
List <Simulation> 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;
}
26 changes: 26 additions & 0 deletions oolab/src/main/resources/simulation.fxml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.GridPane?>

<BorderPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
minHeight="550.0" minWidth="850.0"
fx:controller="agh.ics.oop.presenter.SimulationPresenter">
<center>
<VBox alignment="CENTER">
<HBox alignment="CENTER">
<TextField fx:id="movesListTextField"/>
<Button fx:id="startButton" minWidth="100" text="Start" onAction="#onSimulationStartClicked" />
</HBox>
<Label fx:id="moveInfoLabel" alignment="CENTER"/>
<Label fx:id="infoLabel" text="All animals will be living here!" alignment="CENTER"/>
<GridPane fx:id="mapGrid" gridLinesVisible="true" alignment="CENTER" />
</VBox>
</center>
</BorderPane>