MapGenerator #34
							
								
								
									
										78
									
								
								app/src/main/java/school_project/MapGenerator.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								app/src/main/java/school_project/MapGenerator.java
									
									
									
									
									
										Normal file
									
								
							| @ -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){ | ||||
| 
					
					tonitch marked this conversation as resolved
					
				 | ||||
|                         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<Vec2> 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										26
									
								
								app/src/test/java/school_project/MapGeneratorTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								app/src/test/java/school_project/MapGeneratorTest.java
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	
boucle qui fait le tour des extrémités de la matrice