Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 12x 1x 17x 8x 1x 1x 1x 4x 1x 1x 2x 2x 6x 2x 1x 1x 1x 1x 14x 6x 3x 3x 3x 1x | // TODO optimization: use '' for empty blocks, undefined as a sentinel export const create = (width, height) => Array(height).fill([]).map(() => Array(width).fill(undefined)) export const clone = grid => [...grid.map(row => [...row])] export const draw = (grid, x: number, y: number, block, rotation: number, color) => { // TODO doesn't need to be pure, clone in caller const bucket1 = clone(grid) block.coords[rotation].forEach(([xx, yy]) => bucket1[y + yy][x + xx] = color) return bucket1 } // check for free, return true if so export const check = (grid, x, y, block, rotation) => { const [width, height] = [grid[0].length, grid.length] const predicate = ([xx, yy]) => x + xx >= 0 && x + xx < width && y + yy >= 0 && y + yy < height && grid[y + yy][x + xx] === undefined return block.coords[rotation].every(predicate) } // clear full lines (non pure) export const sweep = grid => { let linesCleared = 0 const width = grid[0].length for (const [rowIndex, row] of grid.entries()) { const full = row.every(cell => cell !== undefined) if (full) { grid.splice(rowIndex, 1) grid.unshift(new Array(width).fill(undefined)) linesCleared++ } } return linesCleared } |