Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Create matrix
- for(var i = 0; i < X; i++){
- this.matrix[i] = new Array(Y).fill(0);
- }
- let tiless:[number,number][][] = [];
- // Create tiles
- for(var i = 1; i <= TILES; i++) {
- do {
- var row = Math.floor(Math.random() * X);
- var column = Math.floor(Math.random() * Y);
- } while (this.matrix[row][column] != 0)
- var foo:[number,number][] = [];
- foo.push([row, column]);
- tiless.push(foo);
- }
- fillMatrix(this.matrix, tiless);
- function fillMatrix(matrix:number[][], tiles:[number,number][][]) {
- fillTile(matrix, tiles, 0);
- if(!tiles.every(c => c.length == 0))
- fillMatrix(matrix, tiles);
- }
- function fillTile(matrix:number[][], tiles:[number,number][][], tileIndex:number) {
- tryFill(matrix, tiles[tileIndex], tileIndex+1);
- if (tileIndex < tiles.length-1)
- fillTile(matrix, tiles, tileIndex+1);
- }
- function tryFill(matrix:number[][], tile:[number,number][], tileNumber: number) {
- if (tile.length > 0) {
- var choosenIndex = Math.floor(Math.random()*tile.length);
- var choosen = tile[choosenIndex];
- tile.splice(choosenIndex, 1);
- tile.concat(tryFillBorder(matrix, [choosen[0]+1, choosen[1]+1], tileNumber));
- tile.concat(tryFillBorder(matrix, [choosen[0]-1, choosen[1]+1], tileNumber));
- tile.concat(tryFillBorder(matrix, [choosen[0]+1, choosen[1]-1], tileNumber));
- tile.concat(tryFillBorder(matrix, [choosen[0]-1, choosen[1]-1], tileNumber));
- // removing duplicates
- tile = tile.filter((value, index, array) => !array.filter((v, i) => JSON.stringify(value) == JSON.stringify(v) && i < index).length);
- // random chance to try fill again
- if (Math.random() > 0.2)
- tryFill(matrix, tile, tileNumber);
- }
- }
- function tryFillBorder(matrix:number[][], sqm:[number,number], tileNumber:number):[number,number][] {
- let borderToReturn: [number,number][];
- borderToReturn = [];
- if (!isOutOfRange(matrix, sqm)) {
- if(matrix[sqm[0]][sqm[1]] == 0) {
- matrix[sqm[0]][sqm[1]] = tileNumber;
- }
- 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]);
- 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]);
- 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]);
- 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]);
- }
- return borderToReturn;
- }
- function isOutOfRange(matrix:number[][], sqm:[number,number]):boolean {
- return sqm[0] >= 0 && sqm[1] > 0 && sqm[0] < matrix.length && sqm[1] < matrix.length;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement