Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1.  
  2. const WALL = 'X';
  3. const EMPTY = ' ';
  4. const PORTAL = '$';
  5.  
  6. class MazeGenerator {
  7. constructor(rows, cols) {
  8. this.numRows = rows;
  9. this.numCols = cols;
  10. this.visited = [];
  11. this.render = [];
  12.  
  13. for (let i = 0; i < rows + 2; ++i) {
  14. this.visited.push(Array(cols + 2).fill(false));
  15. this.render.push(Array(cols + 2).fill(WALL));
  16. }
  17.  
  18. // set borders as visited
  19. for (let i = 0; i < rows + 2; ++i) {
  20. this.visited[i][0] = true;
  21. this.visited[i][cols + 1] = true;
  22. }
  23.  
  24. for (let i = 0; i < cols + 2; ++i) {
  25. this.visited[0][i] = true;
  26. this.visited[rows + 1][i] = true;
  27. }
  28.  
  29. }
  30.  
  31. init(startPos, exitPos) {
  32. let [x, y] = this.offset(startPos);
  33. this.render[x][y] = PORTAL;
  34. for (const exit of exitPos) {
  35. [x, y] = this.offset(exit);
  36. this.render[x][y] = PORTAL;
  37. }
  38. }
  39.  
  40. offset(pos) {
  41. let [i, j] = pos;
  42. if (i === 0) i++;
  43. if (j === 0) j++;
  44. return [i, j];
  45. }
  46.  
  47. generate(x, y) {
  48. this.visited[x][y] = true;
  49. if (this.render[x][y] === WALL) this.render[x][y] = ' ';
  50. let paths = this.adjacent(x, y);
  51. for (const [a, b] of paths) {
  52. if (this.numWalls(a, b) >= 6 && !this.hasDiagWalls(a, b)) {
  53. this.generate(a, b);
  54. }
  55. }
  56. }
  57.  
  58. numWalls(x, y) {
  59. let count = 0;
  60. for (let i = x - 1; i <= x + 1; ++i) {
  61. for (let j = y - 1; j <= y + 1; ++j) {
  62. if (this.render[i][j] === WALL) count++;
  63. }
  64. }
  65. return count;
  66. }
  67.  
  68. adjacent(x, y) {
  69. let paths = [];
  70. let dirs = [
  71. [x - 1, y],
  72. [x + 1, y],
  73. [x, y - 1],
  74. [x, y + 1],
  75. ];
  76. for (let [a, b] of dirs) {
  77. if (!this.visited[a][b]) {
  78. paths.push([a, b]);
  79. }
  80. }
  81. this.shuffle(paths);
  82. return paths;
  83. }
  84.  
  85. hasDiagWalls(x, y) {
  86. let corners = [
  87. [x - 1, y - 1],
  88. [x - 1, y + 1],
  89. [x + 1, y - 1],
  90. [x + 1, y + 1],
  91. ];
  92. let adjacent = [
  93. [[x - 1, y], [x, y - 1]],
  94. [[x - 1, y], [x, y + 1]],
  95. [[x + 1, y], [x, y - 1]],
  96. [[x + 1, y], [x, y + 1]],
  97. ];
  98. for (let i = 0; i < 4; ++i) {
  99. let [a, b] = corners[i];
  100. let [[c1, c2], [c3, c4]] = adjacent[i];
  101. let vtx = this.render[a][b];
  102. let n1 = this.render[c1][c2];
  103. let n2 = this.render[c3][c4];
  104. if (vtx === EMPTY && n1 === WALL && n2 === WALL) {
  105. return true;
  106. }
  107. }
  108. return false;
  109. }
  110.  
  111. shuffle(arr) {
  112. for (let i = arr.length - 1; i > 0; --i) {
  113. const idx = Math.floor(Math.random() * i);
  114. this.swap(arr, i, idx);
  115. }
  116. }
  117.  
  118. swap(arr, x, y) {
  119. const temp = arr[x];
  120. arr[x] = arr[y];
  121. arr[y] = temp;
  122. }
  123.  
  124. display() {
  125. for (let i = 0; i < this.numRows + 2; ++i) {
  126. let line = '';
  127. for (let j = 0; j < this.numCols + 2; ++j) {
  128. line += this.render[i][j];
  129. }
  130. console.log(line);
  131. }
  132. }
  133. }
  134.  
  135.  
  136. function test() {
  137. const maze = new MazeGenerator(20, 20);
  138. const startPos = [0, 0];
  139. const exits = [[0, 20], [20, 20], [20, 7], [15, 0]];
  140. maze.init(startPos, exits);
  141. maze.generate(1, 1);
  142. maze.display()
  143. }
  144.  
  145. test()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement