From f71675dd21a7af71b09f0d2b5f69010bdf87de2e Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Thu, 27 Apr 2023 10:35:36 +0200 Subject: [PATCH 1/5] addition of vectors Vector to string --- app/src/main/java/school_project/Vec2.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/school_project/Vec2.java b/app/src/main/java/school_project/Vec2.java index 7bf6ed9..6529e15 100644 --- a/app/src/main/java/school_project/Vec2.java +++ b/app/src/main/java/school_project/Vec2.java @@ -26,4 +26,13 @@ public class Vec2 implements Serializable { } return false; } + + public Vec2 add(Vec2 o){ + return new Vec2(x + o.x, y + o.y); + } + + @Override + public String toString() { + return "("+x+","+y+")"; + } } From 0baef0820510daaf07b2da4e0031e9ee98e19b90 Mon Sep 17 00:00:00 2001 From: Debucquoy Date: Thu, 27 Apr 2023 10:04:31 +0200 Subject: [PATCH 2/5] Adding Array Copy for matrix Currently only boolean but we can add more if we need --- .../main/java/school_project/Utils/Array.java | 13 ++++++++++ .../java/school_project/Utils/ArrayTest.java | 26 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 app/src/main/java/school_project/Utils/Array.java create mode 100644 app/src/test/java/school_project/Utils/ArrayTest.java diff --git a/app/src/main/java/school_project/Utils/Array.java b/app/src/main/java/school_project/Utils/Array.java new file mode 100644 index 0000000..9f722d6 --- /dev/null +++ b/app/src/main/java/school_project/Utils/Array.java @@ -0,0 +1,13 @@ +package school_project.Utils; + +import java.util.Arrays; + +public class Array{ + public static boolean[][] MatrixCopyOf(boolean[][] o){ + boolean[][] ret = new boolean[o.length][]; + for (int i = 0; i < o.length; i++){ + ret[i] = Arrays.copyOf(o[i], o[i].length); + } + return ret; + } +} diff --git a/app/src/test/java/school_project/Utils/ArrayTest.java b/app/src/test/java/school_project/Utils/ArrayTest.java new file mode 100644 index 0000000..70b66b9 --- /dev/null +++ b/app/src/test/java/school_project/Utils/ArrayTest.java @@ -0,0 +1,26 @@ +package school_project.Utils; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ArrayTest { + + @Test + void matrixCopyOf() { + boolean[][] a = new boolean[][] { + {true, false, true}, + {false, false, false}, + {true, false, true}, + }; + boolean[][] b = new boolean[][] { + {true, false, true}, + {false, false, false}, + {true, false, true}, + }; + boolean[][] c = Array.MatrixCopyOf(a); + assertArrayEquals(a, c); + a[1][1] = true; + assertArrayEquals(b, c); + } +} \ No newline at end of file From c6df65638195e1702b6045339336a2e44503a0bf Mon Sep 17 00:00:00 2001 From: Debucquoy Anthony Date: Mon, 1 May 2023 18:38:52 +0200 Subject: [PATCH 3/5] MapGenerator (#34) This generate maps following a simple structure First we choose map size depending on the difficulty we grind the edge with a random pattern so the map is not just a square we pick a random open piece and try to make a piece out of it between a size of 1 to 3 and we do this in a loop until all open spaces are filled this is not the best but it's efficient known problem: - We can have sometime a lot of small pieces - We can have weird shape, for instance pieces that are only connected by corner I think this is technically not a problem in the end. but this could be changed Co-authored-by: Debucquoy Reviewed-on: https://git.herisson.ovh/undefined_name/School_Project/pulls/34 Reviewed-by: Mat_02 --- .../java/school_project/MapGenerator.java | 78 +++++++++++++++++++ .../java/school_project/MapGeneratorTest.java | 26 +++++++ 2 files changed, 104 insertions(+) create mode 100644 app/src/main/java/school_project/MapGenerator.java create mode 100644 app/src/test/java/school_project/MapGeneratorTest.java diff --git a/app/src/main/java/school_project/MapGenerator.java b/app/src/main/java/school_project/MapGenerator.java new file mode 100644 index 0000000..f6a44b8 --- /dev/null +++ b/app/src/main/java/school_project/MapGenerator.java @@ -0,0 +1,78 @@ +package school_project; + +import school_project.Utils.Array; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Random; + +public class MapGenerator { + private static final Random rand = new Random(); + public enum Difficulty { + Easy, + Medium, + Difficult, + } + public static Map generate(Difficulty difficulty){ + Vec2 map_size; + int depth = 1; // how much the map shape generator could grind + + // define map size depending on the difficulty + switch (difficulty){ + case Easy -> map_size = new Vec2(rand.nextInt(3, 5), rand.nextInt(3, 5)); + case Medium -> map_size = new Vec2(rand.nextInt(5, 8), rand.nextInt(5, 8)); + case Difficult -> { + map_size = new Vec2(rand.nextInt(8, 10), rand.nextInt(8, 10)); + depth = 2; + } + default -> map_size = new Vec2(); + } + + // Cut edges + boolean[][] map_shape = new boolean[map_size.x][map_size.y]; + for (boolean[] b : map_shape) { + Arrays.fill(b, true); + } + for (int i = 0; i < map_shape.length; i++) { + for (int j = 0; j < map_shape[0].length; j++) { + if(i > depth - 1 && i < map_shape.length - depth && j > depth - 1 && j < map_shape[0].length - depth){ + j = map_shape[0].length - depth; + } + map_shape[i][j] = rand.nextBoolean(); + } + } + Map ret = new Map(map_shape); + boolean[][] piece_layout = Array.MatrixCopyOf(map_shape); + ArrayList EmptySlots = new ArrayList<>(); + + for (int i = 0; i < piece_layout.length; i++) { + for (int j = 0; j < piece_layout[i].length; j++) { + if(piece_layout[i][j]){ + EmptySlots.add(new Vec2(i, j)); + } + } + } + + while (EmptySlots.size() > 0){ + Collections.shuffle(EmptySlots); + Vec2 selected = EmptySlots.get(0); + int size = rand.nextInt(1, 4); + boolean[][] shape = new boolean[size][size]; + for(int i = 0; i < size; i++){ + for (int j = 0; j < size; j++) { + Vec2 checked = new Vec2(i, j).add(selected); + if(EmptySlots.contains(checked)){ + EmptySlots.remove(checked); + piece_layout[checked.x][checked.y] = false; + shape[i][j] = true; + } + } + } + ret.addPiece(new Piece(shape)); + } + + //generate pieces + return ret; + } +} diff --git a/app/src/test/java/school_project/MapGeneratorTest.java b/app/src/test/java/school_project/MapGeneratorTest.java new file mode 100644 index 0000000..d052592 --- /dev/null +++ b/app/src/test/java/school_project/MapGeneratorTest.java @@ -0,0 +1,26 @@ +package school_project; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MapGeneratorTest { + + @Test + void generate() { + Map[] maps = new Map[] { + MapGenerator.generate(MapGenerator.Difficulty.Easy), + MapGenerator.generate(MapGenerator.Difficulty.Medium), + MapGenerator.generate(MapGenerator.Difficulty.Difficult), + }; + + for(Map m: maps){ + System.out.println("=========="); + System.out.println(m); + System.out.println("++++++++++++++++++++"); + for (Piece p: m.getPieces()){ + System.out.println(p); + } + } + } +} \ No newline at end of file From 72dcbcbf4fad2f49fdc61a6b3c756eda622613c3 Mon Sep 17 00:00:00 2001 From: Debucquoy Anthony Date: Wed, 3 May 2023 17:27:10 +0200 Subject: [PATCH 4/5] Adding Color to pieces (#31) Just adding a color field to pieces for drawing later Carefull when you review, I also moved Vec2 to Utils where I feel it belong. Solve #29 Co-authored-by: Anthony Debucquoy Reviewed-on: https://git.herisson.ovh/undefined_name/School_Project/pulls/31 Reviewed-by: Mat_02 --- app/src/main/java/school_project/Piece.java | 21 +++++++++++++++---- .../test/java/school_project/PieceTest.java | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/school_project/Piece.java b/app/src/main/java/school_project/Piece.java index 51df463..ac01953 100644 --- a/app/src/main/java/school_project/Piece.java +++ b/app/src/main/java/school_project/Piece.java @@ -1,5 +1,10 @@ package school_project; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; + +import java.util.Random; + /** * Represent a Piece in the game. * Every Piece should be contained in a Map Object. @@ -10,13 +15,20 @@ public class Piece extends Shape{ private Vec2 Position; private Map linked_map; - - public Piece() { - super(); - } + private transient Paint color; // https://www.baeldung.com/java-transient-keyword public Piece(boolean[][] matrix) { super(matrix); + Random rand = new Random(); + color = new Color(rand.nextDouble(), rand.nextDouble(), rand.nextDouble(), 1); + } + + public void setColor(Paint p){ + color = p; + } + + public Paint getColor(){ + return color; } public Vec2 getPosition() { @@ -27,6 +39,7 @@ public class Piece extends Shape{ this.Position = position; } + /** * set the map the piece is into the the map argument * @param map map where to place the piece diff --git a/app/src/test/java/school_project/PieceTest.java b/app/src/test/java/school_project/PieceTest.java index e3adc2e..6e80749 100644 --- a/app/src/test/java/school_project/PieceTest.java +++ b/app/src/test/java/school_project/PieceTest.java @@ -36,7 +36,7 @@ class PieceTest { {true, false, true}, }; - Piece piece1 = new Piece(); + Piece piece1 = new Piece(piece2_matrix); piece1.setShape(piece1_matrix); Piece piece2 = new Piece(piece2_matrix); From f1519ba40c5f1b4576b9bb8c70d47d76bbe9c724 Mon Sep 17 00:00:00 2001 From: Debucquoy Anthony Date: Wed, 3 May 2023 17:29:10 +0200 Subject: [PATCH 5/5] levelMaker (#36) This is a really simple and not efficient level Maker to build levels. you have to run the main method in FileParserFacotry.java with your idea and respond to all the questions. it's painfully slow but less than doing it by hand on a paper I guess. I added level11.level as an example for where to put the level when finished. To access it you have to do: `new File(getClass().getResources("level11.level").getFile())` and put it into `FileParserFactory.loadMapFromFile(File f)` Co-authored-by: Debucquoy Co-authored-by: Anthony Debucquoy Reviewed-on: https://git.herisson.ovh/undefined_name/School_Project/pulls/36 Reviewed-by: Mat_02 --- .../Parsers/FileParserFactory.java | 49 +++++++++++++++++++ .../resources/school_project/level11.level | 1 + 2 files changed, 50 insertions(+) create mode 100644 app/src/main/resources/school_project/level11.level diff --git a/app/src/main/java/school_project/Parsers/FileParserFactory.java b/app/src/main/java/school_project/Parsers/FileParserFactory.java index a7f4f68..83749bf 100644 --- a/app/src/main/java/school_project/Parsers/FileParserFactory.java +++ b/app/src/main/java/school_project/Parsers/FileParserFactory.java @@ -2,11 +2,13 @@ package school_project.Parsers; import javafx.util.Pair; import school_project.Map; +import school_project.Piece; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.NotSerializableException; +import java.util.Scanner; /** * This is used to find the right parser to parser a save/level file. @@ -80,4 +82,51 @@ public class FileParserFactory { } return new Pair(fileParser, save_data); } + + public static void main(String[] args) throws IOException { + Scanner in = new Scanner(System.in); + Map level = new Map(); + + System.out.print("Entrez le nom du fichier:"); + File file = new File(in.nextLine()); + + System.out.print("Entrez la largeur de la map:"); + int map_width = in.nextInt(); + + System.out.print("Entrez la hauteur de la map:"); + int map_height = in.nextInt(); + + boolean[][] map_shape = new boolean[map_height][map_width]; + + for (int i = 0; i < map_height; i++) { + for (int j = 0; j < map_width; j++) { + System.out.print("mur (" + i + ", " + j + ")? (y/n):"); + map_shape[i][j] = in.next(".").charAt(0) != 'y'; + } + } + + level.setShape(map_shape); + System.out.println(level); + System.out.print("Entrez le nombre de pieces:"); + int piece_amount = in.nextInt(); + + for (int i = 0; i < piece_amount; i++) { + System.out.print("Entrez la largeur de la piece" + (i+1) +": "); + int _piece_width = in.nextInt(); + + System.out.print("Entrez la hauteur de la piece" + (i+1) +": "); + int _piece_height = in.nextInt(); + boolean[][] _piece_shape = new boolean[_piece_height][_piece_width]; + + for (int k = 0; k < _piece_height; k++) { + for (int j = 0; j < _piece_width; j++) { + System.out.print("mur (" + k + ", " + j + ")? (y/n):"); + _piece_shape[k][j] = in.next(".").charAt(0) != 'y'; + } + } + + level.addPiece(new Piece(_piece_shape)); + } + saveFileFromMap(file, level); + } } \ No newline at end of file diff --git a/app/src/main/resources/school_project/level11.level b/app/src/main/resources/school_project/level11.level new file mode 100644 index 0000000..b66355c --- /dev/null +++ b/app/src/main/resources/school_project/level11.level @@ -0,0 +1 @@ +SMSçÿÿ€3ÿ€"ð"°"p"°€SME \ No newline at end of file