Maze (recursive division) algorithm design

后端 未结 1 458
天涯浪人
天涯浪人 2021-01-02 20:41

I am currently developing a random maze generator that stores the maze in a 2-dimensional array called grid. This will then be used later on to generate a real

相关标签:
1条回答
  • 2021-01-02 21:18

    Put walls only in even cells, and doors in odd cells, and make "dimensions" odd. http://jsfiddle.net/tPm3s/1/

    Code:
    var grid;
    
    function generate(dimensions, numDoors) {
        grid = new Array();
        for (var i = 0; i < dimensions; i++) {
            grid[i] = new Array();
    
            for (var j = 0; j < dimensions; j++) {
                grid[i][j] = "";
            }
        }
    
        addOuterWalls();
        var ent = addEntrance();
        addInnerWalls(true, 1, grid.length - 2, 1, grid.length - 2, ent);
    }
    
    function addOuterWalls() {
        for (var i = 0; i < grid.length; i++) {
            if (i == 0 || i == (grid.length - 1)) {
                for (var j = 0; j < grid.length; j++) {
                    grid[i][j] = "w";
                }
            } else {
                grid[i][0] = "w";
                grid[i][grid.length - 1] = "w";
            }
        }
    }
    
    function addEntrance() {
        var x = randomNumber(1, grid.length - 1);
        grid[grid.length - 1][x] = "g";
        return x;
    }
    
    function addInnerWalls(h, minX, maxX, minY, maxY, gate) {
        if (h) {
    
            if (maxX - minX < 2) {
                return;
            }
    
            var y = Math.floor(randomNumber(minY, maxY)/2)*2;
            addHWall(minX, maxX, y);
    
            addInnerWalls(!h, minX, maxX, minY, y-1, gate);
            addInnerWalls(!h, minX, maxX, y + 1, maxY, gate);
        } else {
            if (maxY - minY < 2) {
                return;
            }
    
            var x = Math.floor(randomNumber(minX, maxX)/2)*2;
            addVWall(minY, maxY, x);
    
            addInnerWalls(!h, minX, x-1, minY, maxY, gate);
            addInnerWalls(!h, x + 1, maxX, minY, maxY, gate);
        }
    }
    
    function addHWall(minX, maxX, y) {
        var hole = Math.floor(randomNumber(minX, maxX)/2)*2+1;
    
        for (var i = minX; i <= maxX; i++) {
            if (i == hole) grid[y][i] = "";
            else grid[y][i] = "w";
        }
    }
    
    function addVWall(minY, maxY, x) {
        var hole = Math.floor(randomNumber(minY, maxY)/2)*2+1;
    
        for (var i = minY; i <= maxY; i++) {
            if (i == hole) grid[i][x] = "";
            else grid[i][x] = "w";
        }
    }
    
    function randomNumber(min, max) {
        return Math.floor(Math.random() * (max - min + 1) + min);
    }
    
    function display() {
        document.getElementById("cnt").innerHTML = "";
    
        for (var i = 0; i < grid.length; i++) {
            var output = "<div>";
            for (var j = 0; j < grid.length; j++) {
                output += "<b " + grid[i][j] + "></b>";
            }
            output += "</div>";
            document.getElementById("cnt").innerHTML += output;
        }
    }
    generate(31, 1, 1);
    display();
    
    0 讨论(0)
提交回复
热议问题