diff --git a/oolab/map_0.log b/oolab/map_0.log new file mode 100644 index 0000000..7b8bfaa --- /dev/null +++ b/oolab/map_0.log @@ -0,0 +1,228 @@ +Move information: +Animal was placed at (1,1) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | |^| | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,1) to (1,2) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |^| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,2) to (1,1) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | |^| | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal changed direction from Północ to Wschód + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | |>| | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal changed direction from Wschód to Północ + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | |^| | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,1) to (1,2) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |^| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,2) to (1,3) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | |^|*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal changed direction from Północ to Wschód + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | |>|*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal changed direction from Wschód to Południe + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | |v|*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,3) to (1,2) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |v| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,2) to (1,1) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | |v| | | | | | | | | + 0: |*| | | | | | | | |*| + -1: --------------------- + +----------------- +Move information: +Animal moved from (1,1) to (1,0) + +Current map state: + + y\x 0 1 2 3 4 5 6 7 8 9 + 9: --------------------- + 8: | | | | | | | | | |*| + 7: | | | |*| | | |*| | | + 6: | | | | |*| | | | | | + 5: | | | | | | | |*| | | + 4: | | | |*| | | | | | | + 3: | | |*| | | | | | | | + 2: | |*| | | | | | | | | + 1: | | | | | | | | | | | + 0: |*|v| | | | | | | |*| + -1: --------------------- + +----------------- diff --git a/oolab/src/main/java/agh/ics/oop/OptionsParser.java b/oolab/src/main/java/agh/ics/oop/OptionsParser.java index c0d7fb7..915365d 100644 --- a/oolab/src/main/java/agh/ics/oop/OptionsParser.java +++ b/oolab/src/main/java/agh/ics/oop/OptionsParser.java @@ -2,8 +2,8 @@ import agh.ics.oop.model.MoveDirection; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; public class OptionsParser { @@ -29,19 +29,37 @@ public static List parseOptions(String[] options) { // }; // current_index++; // } - List moves = new ArrayList<>(); - for (String option : options) { + Stream optionsStream = Stream.of(options); + + var result = optionsStream.map(option -> { if (!(option.equals("f") || option.equals("b") || option.equals("l") || option.equals("r"))) { throw new IllegalArgumentException(option + " is not legal move specification"); } - moves.add(switch (option) { + return switch (option) { case "f" -> MoveDirection.FORWARD; case "b" -> MoveDirection.BACKWARD; case "l" -> MoveDirection.LEFT; case "r" -> MoveDirection.RIGHT; default -> null; - }); - } - return moves; + } + ; + }).toList(); + + return result; + +// List moves = new ArrayList<>(); +// for (String option : options) { +// if (!(option.equals("f") || option.equals("b") || option.equals("l") || option.equals("r"))) { +// throw new IllegalArgumentException(option + " is not legal move specification"); +// } +// moves.add(switch (option) { +// case "f" -> MoveDirection.FORWARD; +// case "b" -> MoveDirection.BACKWARD; +// case "l" -> MoveDirection.LEFT; +// case "r" -> MoveDirection.RIGHT; +// default -> null; +// }); +// } +// return moves; } } diff --git a/oolab/src/main/java/agh/ics/oop/World.java b/oolab/src/main/java/agh/ics/oop/World.java index f6e71e5..70db483 100644 --- a/oolab/src/main/java/agh/ics/oop/World.java +++ b/oolab/src/main/java/agh/ics/oop/World.java @@ -5,7 +5,9 @@ import agh.ics.oop.model.RectangularMap; import agh.ics.oop.model.Vector2d; import agh.ics.oop.model.util.ConsoleMapDisplay; +import agh.ics.oop.model.util.FileMapDisplay; +import java.time.LocalDateTime; import java.util.List; public class World { @@ -17,6 +19,11 @@ public static void main(String[] args) { var rectangularMap = new RectangularMap(10, 10, 1); var observer = new ConsoleMapDisplay(); grassField.addObserver(observer); + grassField.addObserver((worldMap, message) -> { + System.out.println(String.format("%s %s", LocalDateTime.now(), message)); + }); + FileMapDisplay fileMapDisplay = new FileMapDisplay(); + grassField.addObserver(fileMapDisplay); rectangularMap.addObserver(observer); var simulation = new Simulation(positions, moves, grassField); var simulation2 = new Simulation(positions, moves, rectangularMap); diff --git a/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java b/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java index 1b77a94..dd966c4 100644 --- a/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java +++ b/oolab/src/main/java/agh/ics/oop/model/AbstractWorldMap.java @@ -4,9 +4,7 @@ import agh.ics.oop.model.util.IncorrectPositionException; import agh.ics.oop.model.util.MapVisualizer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; public abstract class AbstractWorldMap implements WorldMap { protected final MapVisualizer visualizer; @@ -69,13 +67,13 @@ public void place(Animal animal) throws IncorrectPositionException { } @Override - public WorldElement objectAt(Vector2d position) { - return animals.get(position); + public Optional objectAt(Vector2d position) { + return Optional.ofNullable(animals.get(position)); } @Override public boolean isOccupied(Vector2d position) { - return objectAt(position) != null; + return objectAt(position).isPresent(); } @Override @@ -105,4 +103,10 @@ public String toString() { public int getId() { return mapId; } + + @Override + public List getOrderedAnimals() { + return animals.values().stream().sorted(Comparator.comparing((Animal animal) -> animal.getPosition().getX() + ).thenComparing((Animal animal) -> animal.getPosition().getY())).toList(); + } } diff --git a/oolab/src/main/java/agh/ics/oop/model/Animal.java b/oolab/src/main/java/agh/ics/oop/model/Animal.java index 5ed3df1..fad9d86 100644 --- a/oolab/src/main/java/agh/ics/oop/model/Animal.java +++ b/oolab/src/main/java/agh/ics/oop/model/Animal.java @@ -71,4 +71,14 @@ public int hashCode() { public Vector2d getPosition() { return localizationOnMap; } + + @Override + public String getResourceString() { + return switch (facingDirection) { + case NORTH -> "up.png"; + case EAST -> "right.png"; + case SOUTH -> "down.png"; + case WEST -> "left.png"; + }; + } } diff --git a/oolab/src/main/java/agh/ics/oop/model/Grass.java b/oolab/src/main/java/agh/ics/oop/model/Grass.java index 30bbfa9..b286f73 100644 --- a/oolab/src/main/java/agh/ics/oop/model/Grass.java +++ b/oolab/src/main/java/agh/ics/oop/model/Grass.java @@ -11,6 +11,11 @@ public Vector2d getPosition() { return position; } + @Override + public String getResourceString() { + return "grass.png"; + } + @Override public String toString() { return "*"; diff --git a/oolab/src/main/java/agh/ics/oop/model/GrassField.java b/oolab/src/main/java/agh/ics/oop/model/GrassField.java index 17bdd9d..eb9d2f3 100644 --- a/oolab/src/main/java/agh/ics/oop/model/GrassField.java +++ b/oolab/src/main/java/agh/ics/oop/model/GrassField.java @@ -5,6 +5,8 @@ import java.util.HashMap; import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; public class GrassField extends AbstractWorldMap { private final HashMap grasses; @@ -17,20 +19,6 @@ public GrassField(int grassCount, int mapId) { var upperBound = (int) Math.sqrt(grassCount * 10); lowerVisualisationBoundary = new Vector2d(upperBound, upperBound); upperVisualisationBoundary = new Vector2d(0, 0); -//obsolete code - will be removed after pr 5, kept as fallback in case Random position generator is broken -// for (var i = 0; i < grassCount; ++i) { -// -// var possiblePosition = new Vector2d((int) (Math.random() * upperBound), (int) (Math.random() * upperBound)); -// -// while (grass.get(possiblePosition) != null) { -// possiblePosition = new Vector2d((int) (Math.random() * upperBound), (int) (Math.random() * upperBound)); -// } -// -// upperVisualisationBoundary = upperVisualisationBoundary.upperRight(possiblePosition); -// lowerVisualisationBoundary = lowerVisualisationBoundary.lowerLeft(possiblePosition); -// -// grass.put(possiblePosition, new Grass(possiblePosition)); -// } RandomPositionGenerator randomPositionGenerator = new RandomPositionGenerator(upperBound, upperBound, grassCount); for (Vector2d grassPosition : randomPositionGenerator) { grasses.put(grassPosition, new Grass(grassPosition)); @@ -43,22 +31,18 @@ public GrassField(int grassCount, int mapId) { @Override - public WorldElement objectAt(Vector2d position) { + public Optional objectAt(Vector2d position) { var animalAt = super.objectAt(position); - if (animalAt != null) { + if (animalAt.isPresent()) { return animalAt; } - return grasses.get(position); + return Optional.ofNullable(grasses.get(position)); } @Override public List getElements() { - var temporaryAnimals = super.getElements(); - - temporaryAnimals.addAll(grasses.values()); - - return temporaryAnimals; + return Stream.concat(super.getElements().stream(), grasses.values().stream()).toList(); } @Override @@ -72,12 +56,5 @@ public Boundary getCurrentBounds() { return new Boundary(drawingLowerBoundary, drawingUpperBoundary); } - //Methods used for testing - protected Vector2d getUpperVisualisationBoundary() { - return upperVisualisationBoundary; - } - protected Vector2d getLowerVisualisationBoundary() { - return lowerVisualisationBoundary; - } } diff --git a/oolab/src/main/java/agh/ics/oop/model/MapChangeListener.java b/oolab/src/main/java/agh/ics/oop/model/MapChangeListener.java index 5ad2ee2..90eda16 100644 --- a/oolab/src/main/java/agh/ics/oop/model/MapChangeListener.java +++ b/oolab/src/main/java/agh/ics/oop/model/MapChangeListener.java @@ -1,5 +1,6 @@ package agh.ics.oop.model; +@FunctionalInterface public interface MapChangeListener { void mapChanged(WorldMap worldMap, String message); } diff --git a/oolab/src/main/java/agh/ics/oop/model/WorldElement.java b/oolab/src/main/java/agh/ics/oop/model/WorldElement.java index 70d47a0..054d9ad 100644 --- a/oolab/src/main/java/agh/ics/oop/model/WorldElement.java +++ b/oolab/src/main/java/agh/ics/oop/model/WorldElement.java @@ -6,4 +6,6 @@ //assumption turns out to be false public interface WorldElement { public Vector2d getPosition(); + + public String getResourceString(); } 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 93a4b2d..a464e92 100644 --- a/oolab/src/main/java/agh/ics/oop/model/WorldMap.java +++ b/oolab/src/main/java/agh/ics/oop/model/WorldMap.java @@ -4,6 +4,7 @@ import agh.ics.oop.model.util.IncorrectPositionException; import java.util.List; +import java.util.Optional; /** * The interface responsible for interacting with the map of the world. @@ -42,7 +43,7 @@ public interface WorldMap extends agh.ics.oop.model.MoveValidator { * @param position The position of the animal. * @return animal or null if the position is not occupied. */ - WorldElement objectAt(Vector2d position); + Optional objectAt(Vector2d position); boolean canMoveTo(Vector2d position); @@ -51,4 +52,6 @@ public interface WorldMap extends agh.ics.oop.model.MoveValidator { Boundary getCurrentBounds(); int getId(); + + List getOrderedAnimals(); } diff --git a/oolab/src/main/java/agh/ics/oop/model/util/FileMapDisplay.java b/oolab/src/main/java/agh/ics/oop/model/util/FileMapDisplay.java new file mode 100644 index 0000000..dc8c6b3 --- /dev/null +++ b/oolab/src/main/java/agh/ics/oop/model/util/FileMapDisplay.java @@ -0,0 +1,27 @@ +package agh.ics.oop.model.util; + +import agh.ics.oop.model.MapChangeListener; +import agh.ics.oop.model.WorldMap; + +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; + +public class FileMapDisplay implements MapChangeListener { + + @Override + public void mapChanged(WorldMap worldMap, String message) { + File file = new File(String.format("map_%d.log", worldMap.getId())); + try (PrintWriter writer = new PrintWriter(new FileWriter(file, true))) { + writer.println("Move information:"); + writer.println(message); + + writer.println("\nCurrent map state:\n"); + writer.println(worldMap.toString()); + + writer.println("-----------------"); + } catch (Exception e) { + System.out.println(String.format("Failed to save state to file due to error: %s", e.getMessage())); + } + } +} diff --git a/oolab/src/main/java/agh/ics/oop/model/util/MapVisualizer.java b/oolab/src/main/java/agh/ics/oop/model/util/MapVisualizer.java index c10b2d7..ed17510 100644 --- a/oolab/src/main/java/agh/ics/oop/model/util/MapVisualizer.java +++ b/oolab/src/main/java/agh/ics/oop/model/util/MapVisualizer.java @@ -1,8 +1,11 @@ package agh.ics.oop.model.util; import agh.ics.oop.model.Vector2d; +import agh.ics.oop.model.WorldElement; import agh.ics.oop.model.WorldMap; +import java.util.Optional; + /** * The map visualizer converts the {@link WorldMap} map into a string * representation. @@ -75,9 +78,9 @@ private String drawHeader(Vector2d lowerLeft, Vector2d upperRight) { private String drawObject(Vector2d currentPosition) { if (this.map.isOccupied(currentPosition)) { - Object object = this.map.objectAt(currentPosition); - if (object != null) { - return object.toString(); + Optional object = this.map.objectAt(currentPosition); + if (object.isPresent()) { + return object.get().toString(); } } return EMPTY_CELL; diff --git a/oolab/src/main/java/agh/ics/oop/presenter/MainWindowPresenter.java b/oolab/src/main/java/agh/ics/oop/presenter/MainWindowPresenter.java index 18edd81..1318825 100644 --- a/oolab/src/main/java/agh/ics/oop/presenter/MainWindowPresenter.java +++ b/oolab/src/main/java/agh/ics/oop/presenter/MainWindowPresenter.java @@ -31,7 +31,7 @@ public class MainWindowPresenter { public void onSimulationStartClicked(ActionEvent actionEvent) throws IOException { - if (moveslisttextfield.getText().strip().length() > 0) { + if (!moveslisttextfield.getText().strip().isEmpty()) { try { List moves = OptionsParser.parseOptions(moveslisttextfield.getText().split(" ")); List positions = List.of(new Vector2d(1, 1)); diff --git a/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java b/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java index 3e88ea2..a714367 100644 --- a/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java +++ b/oolab/src/main/java/agh/ics/oop/presenter/SimulationPresenter.java @@ -1,8 +1,6 @@ package agh.ics.oop.presenter; -import agh.ics.oop.model.AbstractWorldMap; -import agh.ics.oop.model.MapChangeListener; -import agh.ics.oop.model.WorldMap; +import agh.ics.oop.model.*; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.geometry.HPos; @@ -95,12 +93,25 @@ private void setLabelsOy() { } private void addElementsToMap() { - for (var element : worldMap.getElements()) { - if (worldMap.isOccupied(element.getPosition())) { - var label = new Label(element.toString()); - var pos = element.getPosition(); - mapGrid.add(label, pos.getX() - minX + 1, maxY - pos.getY() + 1); - GridPane.setHalignment(label, HPos.CENTER); +// for (var element : worldMap.getElements()) { +// if (worldMap.isOccupied(element.getPosition())) { +// var label = new Label(element.toString()); +// var pos = element.getPosition(); +// mapGrid.add(label, pos.getX() - minX + 1, maxY - pos.getY() + 1); +// GridPane.setHalignment(label, HPos.CENTER); +// } +// } + for (int i = 0; i <= width; ++i) { + for (int j = 0; j <= height; ++j) { + Vector2d positionToCheck = new Vector2d(i + minX, j + minY); + if (worldMap.isOccupied(positionToCheck)) { + WorldElement element = worldMap.objectAt(positionToCheck).get(); + var label = new Label(element.toString()); + System.out.println(label); + //mapGrid.add(label, positionToCheck.getX() - minX + 1, maxY - positionToCheck.getY() + 1); + mapGrid.add(new WorldElementBox(element), i + 1, height - j + 1); + GridPane.setHalignment(label, HPos.CENTER); + } } } } diff --git a/oolab/src/main/java/agh/ics/oop/presenter/WorldElementBox.java b/oolab/src/main/java/agh/ics/oop/presenter/WorldElementBox.java new file mode 100644 index 0000000..c64431e --- /dev/null +++ b/oolab/src/main/java/agh/ics/oop/presenter/WorldElementBox.java @@ -0,0 +1,71 @@ +package agh.ics.oop.presenter; + +import agh.ics.oop.model.Animal; +import agh.ics.oop.model.WorldElement; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.VBox; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class WorldElementBox extends VBox { + private static final int IMAGE_HEIGHT = 20; + private static final int IMAGE_WIDTH = 20; + private static final Map images = new HashMap<>(); + + static { + String[] images = {"up.png", "right.png", "down.png", "left.png", "grass.png"}; + for (String url : images) { + WorldElementBox.images.put(url, new Image(url)); + } + } + + private ImageView lastImageView; + private String lastImageUrl; + private String lastLabel; + + public WorldElementBox(WorldElement element) { + updateImage(element); + updateLabel(element); + this.setAlignment(Pos.CENTER); + } + + private void updateImage(WorldElement element) { + String currImageUrl = element.getResourceString(); + + if (!Objects.equals(lastImageUrl, currImageUrl)) { + ImageView currImageView = new ImageView(images.get(currImageUrl)); + currImageView.setFitHeight(IMAGE_HEIGHT); + currImageView.setFitWidth(IMAGE_WIDTH); + + this.getChildren().remove(lastImageView); + this.getChildren().add(currImageView); + + lastImageUrl = currImageUrl; + lastImageView = currImageView; + } + } + + private void updateLabel(WorldElement element) { + + String currLabel = " "; + + if (element instanceof Animal) { + currLabel = "Z " + element.getPosition().toString(); + } else { + currLabel = "Trawa"; + } + + if (!Objects.equals(currLabel, lastLabel)) { + Label positionLabel = new Label(currLabel); + + this.getChildren().add(positionLabel); + + lastLabel = currLabel; + } + } +} diff --git a/oolab/src/main/resources/down.png b/oolab/src/main/resources/down.png new file mode 100644 index 0000000..4dc0160 Binary files /dev/null and b/oolab/src/main/resources/down.png differ diff --git a/oolab/src/main/resources/grass.png b/oolab/src/main/resources/grass.png new file mode 100644 index 0000000..cfb9782 Binary files /dev/null and b/oolab/src/main/resources/grass.png differ diff --git a/oolab/src/main/resources/left.png b/oolab/src/main/resources/left.png new file mode 100644 index 0000000..531a5e8 Binary files /dev/null and b/oolab/src/main/resources/left.png differ diff --git a/oolab/src/main/resources/right.png b/oolab/src/main/resources/right.png new file mode 100644 index 0000000..c263a77 Binary files /dev/null and b/oolab/src/main/resources/right.png differ diff --git a/oolab/src/main/resources/up.png b/oolab/src/main/resources/up.png new file mode 100644 index 0000000..3a51ea2 Binary files /dev/null and b/oolab/src/main/resources/up.png differ diff --git a/oolab/src/test/java/agh/ics/oop/model/GrassFieldTest.java b/oolab/src/test/java/agh/ics/oop/model/GrassFieldTest.java index af9510e..2286005 100644 --- a/oolab/src/test/java/agh/ics/oop/model/GrassFieldTest.java +++ b/oolab/src/test/java/agh/ics/oop/model/GrassFieldTest.java @@ -21,7 +21,7 @@ void animalIsPlacedOnValidCoordinates() { try { testMap.place(testAnimal); - Assertions.assertEquals(testAnimal, testMap.objectAt(properPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(properPosition).get()); } catch (IncorrectPositionException ex) { Assertions.fail("Exception was thrown"); } @@ -58,7 +58,7 @@ void animalMovesIfPositionValid() { var expectedPosition = new Vector2d(1, 2); - Assertions.assertEquals(testAnimal, testMap.objectAt(expectedPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(expectedPosition).get()); } catch (IncorrectPositionException ex) { Assertions.fail("Exception was thrown" + ex.getMessage()); } @@ -76,7 +76,7 @@ void animalWontMoveIfPositionInvalid() { testMap.place(testAnimal); testMap.place(blockingAnimal); testMap.move(testAnimal, MoveDirection.BACKWARD); - Assertions.assertEquals(testAnimal, testMap.objectAt(testPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(testPosition).get()); } catch (IncorrectPositionException e) { Assertions.fail("Exception was thrown" + e.getMessage()); } @@ -118,7 +118,7 @@ void objectThatIsOnPositionIsReturned() { Assertions.fail("Exception was thrown" + e.getMessage()); } - Assertions.assertEquals(testAnimal, testMap.objectAt(occupiedPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(occupiedPosition).get()); } @Test diff --git a/oolab/src/test/java/agh/ics/oop/model/RectangularMapTest.java b/oolab/src/test/java/agh/ics/oop/model/RectangularMapTest.java index 72a117b..8b00dba 100644 --- a/oolab/src/test/java/agh/ics/oop/model/RectangularMapTest.java +++ b/oolab/src/test/java/agh/ics/oop/model/RectangularMapTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; + public class RectangularMapTest { @Test @@ -14,7 +16,7 @@ void animalIsPlacedOnValidCoordinates() { try { testMap.place(testAnimal); - Assertions.assertEquals(testAnimal, testMap.objectAt(properPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(properPosition).get()); } catch (IncorrectPositionException e) { Assertions.fail("Exception was thrown" + e.getMessage()); } @@ -66,7 +68,7 @@ void animalMovesIfPositionValid() { var expectedPosition = new Vector2d(1, 2); Assertions.assertFalse(testMap.isOccupied(testPosition)); - Assertions.assertEquals(testAnimal, testMap.objectAt(expectedPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(expectedPosition).get()); } @Test @@ -83,7 +85,7 @@ void animalWontMoveIfPositionInvalid() { testMap.move(testAnimal, MoveDirection.BACKWARD); Assertions.assertTrue(testMap.isOccupied(testPosition)); - Assertions.assertEquals(testAnimal, testMap.objectAt(testPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(testPosition).get()); } @Test @@ -129,7 +131,7 @@ void objectThatIsOnPositionIsReturned() { Assertions.fail("Exception was thrown" + e.getMessage()); } - Assertions.assertEquals(testAnimal, testMap.objectAt(occupiedPosition)); + Assertions.assertEquals(testAnimal, testMap.objectAt(occupiedPosition).get()); } @Test @@ -179,4 +181,33 @@ void rectangularMapReturnsProperAmountOfElements() { } } + @Test + void animalsAreSortedByX() { + RectangularMap testMap = new RectangularMap(10, 10, 0); + Animal animal1 = new Animal(new Vector2d(0, 1)); + Animal animal2 = new Animal(new Vector2d(1, 1)); + List expectedAnimals = List.of(animal1, animal2); + try { + testMap.place(animal1); + testMap.place(animal2); + Assertions.assertEquals(expectedAnimals, testMap.getOrderedAnimals()); + } catch (IncorrectPositionException e) { + Assertions.fail("Exception was thrown" + e.getMessage()); + } + } + + @Test + void animalsAreSortedByY() { + RectangularMap testMap = new RectangularMap(10, 10, 0); + Animal animal1 = new Animal(new Vector2d(1, 0)); + Animal animal2 = new Animal(new Vector2d(1, 1)); + List expectedAnimals = List.of(animal1, animal2); + try { + testMap.place(animal1); + testMap.place(animal2); + Assertions.assertEquals(expectedAnimals, testMap.getOrderedAnimals()); + } catch (IncorrectPositionException e) { + Assertions.fail("Exception was thrown" + e.getMessage()); + } + } }