Advertisement
Guest User

Untitled

a guest
Jun 25th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. import java.util.ArrayDeque;
  2. import java.util.Arrays;
  3. import java.util.Collections;
  4. import java.util.Random;
  5.  
  6. public class MazeGenerator
  7. {
  8. static Random RANDOM = new Random();
  9.  
  10. public static int[][] generate(int width, int height)
  11. {
  12. int[][] maze = new int[width][height];
  13. initMaze(maze);
  14.  
  15. ArrayDeque<int[]> moves = new ArrayDeque<int[]>();
  16. moves.push(new int[]
  17. { width / 2, height / 2 });
  18.  
  19. while(moves.size() > 0)
  20. {
  21. int[] xy = moves.peek();
  22.  
  23. maze[xy[0]][xy[1]] = moves.size() - 1;
  24.  
  25. Integer[] dirs =
  26. { 0, 1, 2, 3 };
  27.  
  28. Collections.shuffle(Arrays.asList(dirs));
  29.  
  30. boolean dirFound = false;
  31.  
  32. for(int i = 0; i < dirs.length; i++)
  33. {
  34. int[] dxy = dir2xy(dirs[i]);
  35.  
  36. if(isInRange(maze, xy[0] + dxy[0], xy[1] + dxy[1]) && maze[xy[0] + dxy[0]][xy[1] + dxy[1]] == -1)
  37. {
  38. moves.push(new int[]
  39. { xy[0] + dxy[0], xy[1] + dxy[1] });
  40. dirFound = true;
  41.  
  42. break;
  43. }
  44. }
  45.  
  46. if(!dirFound)
  47. {
  48. moves.pop();
  49. }
  50. }
  51.  
  52. return maze;
  53. }
  54.  
  55. public static int[][] generate2(int width, int height)
  56. {
  57. int[][] maze = new int[width][height];
  58. initMaze(maze);
  59.  
  60. ArrayDeque<int[]> moves = new ArrayDeque<int[]>();
  61. moves.push(new int[]
  62. { RANDOM.nextInt(width), RANDOM.nextInt(height) });
  63.  
  64. while(moves.size() > 0)
  65. {
  66. int[] xy = moves.peek();
  67.  
  68. maze[xy[0]][xy[1]] = moves.size() - 1;
  69.  
  70. Integer[] dirs =
  71. { 0, 1, 2, 3 };
  72.  
  73. Collections.shuffle(Arrays.asList(dirs));
  74.  
  75. boolean dirFound = false;
  76.  
  77. for(int i = 0; i < dirs.length; i++)
  78. {
  79. int[] dxy = dir2xy(dirs[i]);
  80.  
  81. if(isInRange(maze, xy[0] + dxy[0], xy[1] + dxy[1]) && maze[xy[0] + dxy[0]][xy[1] + dxy[1]] == -1)
  82. {
  83. moves.push(new int[]
  84. { xy[0] + dxy[0], xy[1] + dxy[1] });
  85. dirFound = true;
  86.  
  87. break;
  88. }
  89. }
  90.  
  91. if(!dirFound)
  92. {
  93. moves.pop();
  94. }
  95. }
  96.  
  97. return maze;
  98. }
  99.  
  100. public static void initMaze(int[][] maze)
  101. {
  102. for(int i = 0; i < maze.length; i++)
  103. {
  104. for(int j = 0; j < maze[i].length; j++)
  105. {
  106. maze[i][j] = -1;
  107. }
  108. }
  109. }
  110.  
  111. public static int[] dir2xy(int dir)
  112. {
  113. dir %= 4;
  114.  
  115. switch(dir)
  116. {
  117. case 0:
  118. return new int[]
  119. { 1, 0 };
  120. case 1:
  121. return new int[]
  122. { 0, 1 };
  123. case 2:
  124. return new int[]
  125. { -1, 0 };
  126. case 3:
  127. return new int[]
  128. { 0, -1 };
  129. }
  130.  
  131. //should never happen
  132. return new int[]
  133. { 0, 0 };
  134. }
  135.  
  136. public static boolean isInRange(int[][] maze, int x, int y)
  137. {
  138. return x >= 0 && x < maze.length && y >= 0 && y < maze[x].length;
  139. }
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement