diff --git a/src/apps/path-finder/algorithms/maze-generator/index.ts b/src/apps/path-finder/algorithms/maze-generator/index.ts index 259493c..8e18bdf 100644 --- a/src/apps/path-finder/algorithms/maze-generator/index.ts +++ b/src/apps/path-finder/algorithms/maze-generator/index.ts @@ -1,9 +1,10 @@ -import { generateMazeRandomly } from './random'; +import { generateRandomMaze } from './random'; import { generatePrimsMaze } from './prims'; import { generateRecursiveDivisionMaze } from './recursive-division'; import { generateRecursiveBacktrackingMaze } from './recursive-backtracking'; import { generateBinaryMaze } from './binary'; import { generateKruskalMaze } from './kruskal'; +import { generateSideWinderMaze } from './side-winder'; export const mazeGenerators = new Map([ ['prims', { name: 'Prims', fn: generatePrimsMaze }], @@ -14,5 +15,6 @@ export const mazeGenerators = new Map([ ], ['recursiveDivision', { name: 'Rec Div', fn: generateRecursiveDivisionMaze }], ['binary', { name: 'Binary', fn: generateBinaryMaze }], - ['random', { name: 'Random', fn: generateMazeRandomly }], + ['sideWinder', { name: 'Side Winder', fn: generateSideWinderMaze }], + ['random', { name: 'Random', fn: generateRandomMaze }], ]); diff --git a/src/apps/path-finder/algorithms/maze-generator/random.ts b/src/apps/path-finder/algorithms/maze-generator/random.ts index f9d2eee..15db72d 100644 --- a/src/apps/path-finder/algorithms/maze-generator/random.ts +++ b/src/apps/path-finder/algorithms/maze-generator/random.ts @@ -1,7 +1,7 @@ import { generateGrid } from '../../helpers/grid'; import { CellType, MazeAlgoProps } from '../../models/interfaces'; -export async function generateMazeRandomly({ +export async function generateRandomMaze({ rows, cols, entry, @@ -12,10 +12,10 @@ export async function generateMazeRandomly({ const grid = generateGrid(rows, cols, CellType.clear); updateGrid(grid); - for (let i = 0; i < rows; i++) { - for (let j = 0; j < cols; j++) { + for (let row = 0; row < rows; row++) { + for (let col = 0; col < cols; col++) { if (Math.random() < 0.25) { - await updateCells(grid, { row: i, col: j }, CellType.wall); + await updateCells(grid, { row, col }, CellType.wall); } } } diff --git a/src/apps/path-finder/algorithms/maze-generator/side-winder.ts b/src/apps/path-finder/algorithms/maze-generator/side-winder.ts new file mode 100644 index 0000000..a2e7f2a --- /dev/null +++ b/src/apps/path-finder/algorithms/maze-generator/side-winder.ts @@ -0,0 +1,37 @@ +import { generateGrid } from '../../helpers/grid'; +import { CellType, MazeAlgoProps } from '../../models/interfaces'; + +export async function generateSideWinderMaze({ + rows, + cols, + entry, + exit, + updateGrid, + updateCells, +}: MazeAlgoProps) { + const grid = generateGrid(rows, cols, CellType.wall); + updateGrid(grid); + + const topRowCells = grid[0].map((_, i) => ({ row: 0, col: i })); + await updateCells(grid, topRowCells); + + for (let row = 2; row < rows; row += 2) { + for (let col = 0; col < cols; col += 2) { + const run = [{ row, col }]; + const runCells = [{ row, col }]; + while (col < cols - 2 && Math.random() < 0.5) { + col += 2; + run.push({ row, col }); + runCells.push({ row, col: col - 1 }, { row, col }); + } + + const northCell = run[Math.floor(Math.random() * run.length)]; + runCells.push({ row: northCell.row - 1, col: northCell.col }); + await updateCells(grid, runCells); + } + } + + updateCells(grid, entry, CellType.entry); + updateCells(grid, exit, CellType.exit); + return grid; +}