当前位置 博文首页 > zhtbs的博客:HTML+CSS+JavaScript 迷宫生成算法 【建议收藏】

    zhtbs的博客:HTML+CSS+JavaScript 迷宫生成算法 【建议收藏】

    作者:[db:作者] 时间:2021-09-14 19:42

    最近发现很多人都在写算法类的博客,今天就献丑了使用HTML,CSS和JavaScript制作一个简单的迷宫生成小代码。证明了自己对一些简单的小算法还是可以驾驭的,基本功没有荒废。

    在这里插入图片描述

    迷宫生成有很多种算法,今天给大家展示的是钻孔法(道路延伸)。

    • 1 首先将数组所有属性都设置成为墙。
    • 2 进行道路挖掘,在数组中进行道路属性值设置。每次随机选择点打桩,在打桩数据旁边进行延伸路径,向上、向下、向左或向右看前方两个方格。如果那不是通道,则延长道路,如果无法延长道路,此时从现有道路中随机选择点(但 X 和 Y 坐标偶数的点)并延长道路。
    • 3 重复步骤2的操作并用道路填满整个屏幕,完成迷宫。

    钻孔法的特点

    算法的特点是遇到墙壁才会生成道路,如果存在道路无法通过的墙壁死胡同,就会在墙壁周围生产道路。由此可以看出,这种迷宫生成方法倾向于围绕起点生成通道。换句话说迷宫以起点,到终点目标的正确路径是最短路径。这样的生产方式小型迷宫没有问题,但是当你创建一个大迷宫时,答案就变得很单调了。另外,通道是随机弯曲的,直线很少,所以如果你创建一个大迷宫,它会看起来很乱很复杂。

    html构成

    <div style="margin-bottom:10px;">
            迷宫格子数
      <input id="sumSize" type="text" value="20" style="width:30px;">
      <button id="创建迷宫">创建迷宫</button>
    </div>
    <div id="zhtbs"></div>
    

    墙壁生成Js算法

    for (var i = 0; i < this.size; i++) {
        var row = [];
        this.box.push(row);
        for (var j = 0; j < this.size; j++) {
              // 第一行和最后一行是墙
             if (i === 0 || (i + 1) === this.size) {
                   row.push(0);
              // 第一列和最后一列也是墙壁
              } else if (j === 0 || (j + 1) === this.size) {
                   row.push(0);
                  // 奇数行都是过路
              } else if (i % 2 === 1) {
                  row.push(1);
                  // 偶数行墙壁和路交替排列
              } else {
                  // 墙壁和路
                 row.push(j % 2);
             }
         }
      }
    
    • 第一行与最后一行全是墙壁

    • 第一列与最后一列全是墙壁

    • 奇数行都是路

    • 偶数行墙壁和路交替出现

    道路生成算法(钻孔法)

    • 第一行与最后一行 不生成路
    • 不是偶数墙的不生成路
    • 设置所有需要钻孔方位置的钻孔方向都是在上方开始
    • 随机排列墙的方向,在墙的周围随机向一个方向进行钻孔打路
    for (var r = 0; r < this.box.length; r++) {
                // 第一行与最后一行 生成
                if (r === 0 || (r + 1) === this.box.length) {
                    continue;
                }
                // 生成有墙的行
                if (r % 2 === 1) {
                    continue;
                }
                // 获得行
                var row = this.box[r];
    
                // 初始化行,上下左右 参数
                var direction = ['top', 'bottom', 'left', 'right'];
                if (r >= 4) {
                    // 出了第一行,默认都是上
                    direction = direction.slice(1);
                }
    
                for (var i = 0; i < row.length; i++) {
                    //边缘不生成路
                    if (i === 0 || (i + 1) === row.length) {
                        continue;
                    }
                    // 获得处理墙
                    if (i % 2 === 0) {
                        // 随机排列墙的方向
                        direction = this.shuffle(direction);
                        // 随机向一个方向,生成路
                        // 在随机方向上去掉墙壁生成路
                        for (var j = 0; j < direction.length; j++) {
                            if (direction[j] === "top") {
                                if (this.box[r-1][i] === 1) {
                                    this.box[r-1][i] = 0;
                                    break;
                                }
                            }
                            if (direction[j] === "left") {
                                if (this.box[r][i-1] === 1) {
                                    this.box[r][i-1] = 0;
                                    break;
                                }
                            }
                            if (direction[j] === "right") {
                                if (this.box[r][i+1] === 1) {
                                    this.box[r][i+1] = 0;
                                    break;
                                }
                            }
                            if (direction[j] === "bottom") {
                                if (this.box[r+1][i] === 1) {
                                    this.box[r+1][i] = 0;
                                    break;
                                }
                            }
                        }
                    }
                }
    		}
    

    迷宫算法完整代码

    <html>
    <head>
        <meta charset="UTF-8">
        <title>Maze</title>
        <style>
            .maze {
    
            }
            .maze:after {
                width: 0;
                height: 0;
                content: "";
                clear: both;
            }
            .w {
                background-color: blue;
                width: 10px;
                height: 10px;
                padding: 0;
                margin: 0;
                float: left;
            }
            .p {
                background-color: white;
                width: 10px;
                height: 10px;
                padding: 0;
                margin: 0;
                float: left;
            }        
            .s, .e {
                background-color: yellow;
                width: 10px;
                height: 10px;
                padding: 0;
                margin: 0;
                float: left;
            }        
        </style>
    <script>
    
    </script>
    <body>
        <div style="margin-bottom:10px;">
    			迷宫格子数
    	  <input id="sumSize" type="text" value