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;
     ...