Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Create matrix
  2.         for(var i = 0; i < X; i++){
  3.             this.matrix[i] = new Array(Y).fill(0);
  4.         }
  5.         let tiless:[number,number][][] = [];
  6.         // Create tiles
  7.         for(var i = 1; i <= TILES; i++) {
  8.             do {
  9.                 var row = Math.floor(Math.random() * X);
  10.                 var column = Math.floor(Math.random() * Y);
  11.             } while (this.matrix[row][column] != 0)
  12.             var foo:[number,number][] = [];
  13.             foo.push([row, column]);
  14.             tiless.push(foo);
  15.         }
  16.  
  17.         fillMatrix(this.matrix, tiless);
  18.  
  19.         function fillMatrix(matrix:number[][], tiles:[number,number][][]) {
  20.             fillTile(matrix, tiles, 0);
  21.             if(!tiles.every(c => c.length == 0))
  22.                 fillMatrix(matrix, tiles);
  23.         }
  24.  
  25.         function fillTile(matrix:number[][], tiles:[number,number][][], tileIndex:number) {
  26.             tryFill(matrix, tiles[tileIndex], tileIndex+1);
  27.  
  28.             if (tileIndex < tiles.length-1)
  29.                 fillTile(matrix, tiles, tileIndex+1);
  30.         }
  31.  
  32.         function tryFill(matrix:number[][], tile:[number,number][], tileNumber: number) {
  33.             if (tile.length > 0) {
  34.                 var choosenIndex = Math.floor(Math.random()*tile.length);
  35.                 var choosen = tile[choosenIndex];
  36.                 tile.splice(choosenIndex, 1);
  37.                 tile.concat(tryFillBorder(matrix, [choosen[0]+1, choosen[1]+1], tileNumber));
  38.                 tile.concat(tryFillBorder(matrix, [choosen[0]-1, choosen[1]+1], tileNumber));
  39.                 tile.concat(tryFillBorder(matrix, [choosen[0]+1, choosen[1]-1], tileNumber));
  40.                 tile.concat(tryFillBorder(matrix, [choosen[0]-1, choosen[1]-1], tileNumber));
  41.                
  42.                 // removing duplicates
  43.                 tile = tile.filter((value, index, array) => !array.filter((v, i) => JSON.stringify(value) == JSON.stringify(v) && i < index).length);
  44.                
  45.                 // random chance to try fill again
  46.                 if (Math.random() > 0.2)
  47.                     tryFill(matrix, tile, tileNumber);
  48.             }
  49.         }
  50.  
  51.         function tryFillBorder(matrix:number[][], sqm:[number,number], tileNumber:number):[number,number][] {
  52.             let borderToReturn: [number,number][];
  53.             borderToReturn = [];
  54.             if (!isOutOfRange(matrix, sqm)) {
  55.                 if(matrix[sqm[0]][sqm[1]] == 0) {
  56.                     matrix[sqm[0]][sqm[1]] = tileNumber;
  57.                 }
  58.                 if (!isOutOfRange(matrix, [sqm[0]+1, sqm[1]+1]) && matrix[sqm[0]+1][sqm[1]+1] == 0) borderToReturn.push([sqm[0]+1, sqm[1]+1]);
  59.                 if (!isOutOfRange(matrix, [sqm[0]-1, sqm[1]+1]) && matrix[sqm[0]-1][sqm[1]+1] == 0) borderToReturn.push([sqm[0]-1, sqm[1]+1]);
  60.                 if (!isOutOfRange(matrix, [sqm[0]+1, sqm[1]-1]) && matrix[sqm[0]+1][sqm[1]-1] == 0) borderToReturn.push([sqm[0]+1, sqm[1]-1]);
  61.                 if (!isOutOfRange(matrix, [sqm[0]-1, sqm[1]-1]) && matrix[sqm[0]-1][sqm[1]-1] == 0) borderToReturn.push([sqm[0]-1, sqm[1]-1]);
  62.             }
  63.             return borderToReturn;
  64.         }
  65.  
  66.         function isOutOfRange(matrix:number[][], sqm:[number,number]):boolean {
  67.             return sqm[0] >= 0 && sqm[1] > 0 && sqm[0] < matrix.length && sqm[1] < matrix.length;
  68.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement