最近发现很多人都在写算法类的博客,今天就献丑了使用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="20" style="width:30px;"><button id="创建迷宫" onclick="onRun()">创建迷宫</button></div><div id="zhtbs"></div>
<script>
function zht(size){this.pagesum=size;this.size = (size % 2 === 0 ? size + 1 : size);this.box = [];this.$maze = document.querySelector("#zhtbs");this.ALGO = {STICK: 1};this.shuffle =function (o) {for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);return o;}this.show = function () {var snipet = '';for (var i = 0; i < this.size; i++) {for (var j = 0; j < this.size; j++) {if (i == 0 && j == 1) {//入口snipet += '<div class="p"></div>';}else if (i==(this.pagesum%2==0?this.pagesum:this.pagesum-1) &&  j == (this.pagesum%2==0?this.pagesum-1:this.pagesum-2)) {// 出口snipet += '<div class="p"></div>';} else if (this.box[j][i] === 0) {// 墙snipet += '<div class="w"></div>';} else {// 路snipet += '<div class="p"></div>';}}}this.$maze.innerHTML = snipet;this.$maze.style.height = (this.size * 10) + 'px';this.$maze.style.width  = (this.size * 10) + 'px';}this.create = function (options) {options = options || {};if (options.algorithm === this.ALGO.STICK) {this._createByStick();}this.show();}this._createByStick = function () {//初始化 墙与路生成this.box = [];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;}}}}}}}
}
function onRun(){var size = parseInt(document.querySelector("#sumSize").value);
if (isNaN(size)) size = 20;
var z=new zht(size);z.create({algorithm: 1});
}
onRun();
</script>
</body>
</html>

HTML+CSS+JavaScript 迷宫生成算法 【建议收藏】相关推荐

  1. c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析

    1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图:   ...

  2. [迷宫中的算法实践]迷宫生成算法——Prim算法

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...

  3. 迷宫生成算法和迷宫寻路算法

    迷宫生成算法和迷宫寻路算法 大学二年级的时候,作为对栈这个数据结构的复习,我制作了一个迷宫生成算法的小程序,当时反响十分好,过了几天我又用自己已经学的DirectX技术制作了DirectX版的程序.这 ...

  4. C#三大迷宫生成算法

    今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法).实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该 ...

  5. 随机迷宫生成算法——深度优先算法

    迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...

  6. 迷宫生成算法---深度优先算法(基于python)

    迷宫生成算法---深度优先算法 总体的目录 版权及协议声明 更加舒服的阅读方式 一. 深度优先算法的原理与思路 二.迷宫的制作 迷宫的总体的创建. 三.代码的实现 总体的目录 版权及协议声明 本文章遵 ...

  7. 随机迷宫生成算法——prime算法

    本以为Prime迷宫生成算法和图论的Prime算法有什么关联,貌似并没有. Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设 ...

  8. 随机迷宫生成算法浅析

    摘要 本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法.最终的算法结合了图的深度优先遍历.通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳. ...

  9. android迷宫生成算法,【Unity算法实现】简单回溯法随机生成 Tile Based 迷宫

    算法学习自 作者eastecho 在IndieNova上发表的文章 简单的使用回溯法生成 Tile Based 迷宫 , 我只是简单做了一下Unity的实现. 基础算法的简单说明 简单说明一下算法步骤 ...

最新文章

  1. 每秒5百亿亿次!Meta祭出元宇宙巨兽,联手英伟达打造全球最强超算
  2. 怎么设置ppt页面的长度和宽度_在PPT中将照片变裸眼3D效果怎样操作?分享技巧,帮你快速实现...
  3. 快速选择思维导图软件,就是这么任性
  4. 【ABAP】获取程序中的Include
  5. python flask服务_在python中Flask配置服务
  6. 【版本更新】网易云信IM微信小程序上线啦!
  7. Java讲课笔记18:异常处理
  8. iPhone 7疯狂生产 苹果提升在印度存在感
  9. NLP预训练家族 | Transformer-XL及其进化XLNet
  10. .NET中获取字符串的MD5码
  11. 在Vue.js中使用Mixin
  12. 20190910每日一句 你有勇气直面自己的恐惧吗?
  13. MySQL彻底卸载干净
  14. mes项目 组态开发项目reademe文档 待整理
  15. 通过ajax接口爬取智联招聘
  16. 二极管钳位、稳压二极管的应用
  17. java 连接 2008,java连接SqlServer2008R2连接异常
  18. 卡片游戏--循环队列实现
  19. 阿里妈妈展示广告引擎动态算力再探索:面向业务收益的机器自适应调配
  20. 华为机试训练做题总结(三)

热门文章

  1. InTra【异常检测:Reconstruction_based】
  2. selenium报错信息-- Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案...
  3. ceac计算机考试试题,计算机ceac考试复习题12套.doc
  4. 游狼html鼠标,《速评13》65g极轻FPS鼠标游狼SK
  5. Selenium Gird下文件上传问题的解决(WebUI自动化测试)
  6. Android 恢复出厂设置流程分析
  7. 万字长文深度剖析面向对象的javascript
  8. Android Ui卡断的原因分析及常见的解决方式
  9. git PR合并提交(rebase方式)
  10. 详解C++学习方向和就业方向!