Skip to content

Commit

Permalink
Sidewinder maze implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
sadanandpai committed Mar 11, 2024
1 parent e36b6af commit c128e6c
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 6 deletions.
6 changes: 4 additions & 2 deletions src/apps/path-finder/algorithms/maze-generator/index.ts
Original file line number Diff line number Diff line change
@@ -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 }],
Expand All @@ -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 }],
]);
8 changes: 4 additions & 4 deletions src/apps/path-finder/algorithms/maze-generator/random.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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);
}
}
}
Expand Down
37 changes: 37 additions & 0 deletions src/apps/path-finder/algorithms/maze-generator/side-winder.ts
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit c128e6c

Please sign in to comment.