Berserker Style Maze
Algorithm to generate a maze based on the algorithm from the old Berserker game.
by realhunts
HTML
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<div ng-app="berserker" ng-controller="mazeCtrl as ctrl">
<button ng-click="ctrl.newMaze()">New Maze</button>
<table>
<tr ng-repeat="row in ctrl.maze track by $index">
<td ng-repeat="col in row track by $index" ng-class="{ 'wall' : col === 1, 'pillar' : col === 2 }"></td>
</tr>
</table>
</div>
CSS
.pillar {
width: 2em;
height: 1em;
margin: 0;
background: red;
}
.wall {
width: 2em;
height: 1em;
margin: 0;
background: green;
}
JavaScript
(function (app) {
var mazeGenerator = function () {
var maze = [],
pillarCoords = {
row: [4, 8, 16, 20],
col: [3, 6, 9, 12]
},
doors = [
[0, 7],
[0, 8],
[12, 7],
[12, 8],
[17, 15],
[18, 15],
[19, 15]
],
dirs = {
left: [{
row: 0,
col: -1
}, {
row: 0,
col: -2
}],
up: [{
row: -1,
col: 0
}, {
row: -2,
col: 0
}, {
row: -3,
col: 0
}],
right: [{
row: 0,
col: 1
}, {
row: 0,
col: 2
}],
down: [{
row: 1,
col: 0
}, {
row: 2,
col: 0
}, {
row: 3,
col: 0
}]
},
row,
cells,
border,
col;
for (row = 0; row < 25; row += 1) {
cells = [];
maze.push(cells);
for (col = 0; col < 16; col += 1) {
border = row === 0 || row === 24 || row === 12 || col === 0 || col === 15;
cells.push(border ? 1 : 0);
}
}
angular.forEach(doors, function (door) {
maze[door[0]][door[1]] = 0;
});
function getDirection(seed) {
if (seed < 0.25) return dirs.left;
if (seed < 0.5) return dirs.up;
if (seed < 0.75) return dirs.right;
return dirs.down;
...