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