Prime算法生成迷宫

prime迷宫生成

    • 结果展示
    • 算法解析
      • 实现代码

结果展示

在这里插入图片描述

算法解析

参考链接

Prime迷宫生成算法的原理:
(1)初始地图所有位置均设为墙
(2)任意插入一个墙体进墙队列
(3)判断此时墙体是否可以设置为路(判断依据在于上下左右四个位置是否只有一个位置是路)
(4)若设置为路,则将该位置周围(上下左右)的所有墙插入队列,接着执行(5);若无法设置为路,直接执行(5)
(5)从墙队列中删去当前位置所在节点
(6)若墙队列不为空,则从队列中随机选取一面墙重新执行(3),直到墙队列为空

实现代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>迷宫</title><style>table {margin: 0 auto;border-collapse: collapse;border: 1px solid #ddd;}td {width: 18px;height: 18px;box-sizing: border-box;border:1px solid #eee}td.wall {background: #eee;border: 1px solid #eee;}.now {background: #ffbd2a;}.now.success {background: #05dd8c}.map{width:100%;padding:20px;}</style>
</head>
<body>
<div class="map"></div>
<br>
<p style="text-align: center">控制台输入loadMap(10,10)初始化地图</p>
<script>let mapEl = document.querySelector('.map');loadMap(20, 20);//初始化/**@param w :横宽*@param h :纵高*/function loadMap(w, h) {let i, j, k;//1) 随机二维数组作为原始地图,实际上迷宫的地图要小一圈let mapData = [],//原始地图数据wallQueue = [];//墙块队列for (i = 0; i < h; i++) {mapData[i] = [];for (j = 0; j < w; j++) {k = i + '-' + j;mapData[i][j] = {x: j, y: i,k: k};//除最外层均标记为墙mapData[i][j].val = (i == 0 || i == h - 1 || j == 0 || j == w - 1)?1:0;}}//2)指定需要挖掉的墙作为入口,这里均以左侧墙上随机随机位置let exitBlock = mapData[h - 2][2 + ~~(Math.random() * (w - 4))];wallQueue.push(exitBlock);//3)开始挖路let lastRoad,//最后一块挖出的路ri, wall;while (wallQueue.length > 0) {ri = ~~(Math.random() * wallQueue.length);//从墙队列中随机一个wall = wallQueue[ri];//随机墙//检测上下左右是否有路,true=>设置为路,移除;false=>移除let mark = 0,y = wall.y,//检测墙的纵坐标x = wall.x,//检测墙的横坐标//周围需要检测的点  //[[-1,0],[0,1],[1,0],[-1,0]] 上下左右 [y,x]relArr = [[(y - 1), x], [y, (x + 1)], [(y + 1), x], [y, (x - 1)]],relIndex,relBlock;for (i = 0; (relIndex = relArr[i]) != null; i++) {relBlock = mapData[relIndex[0]][relIndex[1]];if (relBlock && relBlock.val == 1) {mark++}}wallQueue.splice(ri, 1);//移除当前块if (mark == 1) {wall.val = 1;lastRoad = wall;//如果当前块为路,将周围块加入队列for (i = 0; (relIndex = relArr[i]) != null; i++) {relBlock = mapData[relIndex[0]][relIndex[1]];if (relBlock.val == 0) {wallQueue.push(relBlock);}}}}/**设置出口,prime算法只是在特定的地图内挖出若干条线,但不会挖通地图,因此可以有两种模式:* 1)入口和出口,出口需要遍历边缘打通* 2)唯一的缺口作为出口,最后一个打通的块作为出发点*///4) 打印let resultStr = '';for (i = 0; i < h; i++) {resultStr += '<tr>';for (j = 0; j < w; j++) {if (i > 0 && i < h - 1 && j > 0 && j < w - 1) {let b = mapData[i][j];resultStr += '<td class="' + (b.val == 1 ? (lastRoad.k == b.k ? 'now' : '') : 'wall') + '" loc="' + b.k + '"></td>';}}resultStr += '</tr>'}mapEl.innerHTML = '<table>' + resultStr + '</table>';//移动document.addEventListener('keyup', move);function move(e) {//w:87 a:65 s:83 d:68let direct = {w: [-1, 0],//上移d: [0, 1],//右移s: [1, 0],//下移a: [0, -1]//左移}[e.key];if (direct) {//获取当前位置let moveFlag = 0,locNow = document.querySelector('.now').getAttribute('loc').split('-');locNow[0] = +locNow[0] + direct[0];locNow[1] = +locNow[1] + direct[1];if (locNow[0] == exitBlock.y && locNow[1] == exitBlock.x) {moveFlag = 1;document.removeEventListener('keyup', move);} else {if (locNow[0] > 1 && locNow[0] < h - 2 && locNow[1] > 1 && locNow[1] < w - 2) {moveFlag = 2;}}if (moveFlag) {//移动if (mapData[locNow[0]][locNow[1]].val == 1) {let target = document.querySelector('[loc = "' + locNow[0] + '-' + locNow[1] + '"]');document.querySelector('.now').classList.remove('now');target.classList.add('now');if (moveFlag == 1) {target.classList.add('now', 'success');}}}}}}</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wifi密码公式计算机,求一些高数公式,做wifi密码用?

满意答案thyk72832018.06.08采纳率&#xff1a;55% 等级&#xff1a;13已帮助&#xff1a;8612人1)∫kdxkxc2)∫x^udx(x^(u1))/(u c3)∫1/xdxln|x|c4) ∫a^xdx(a^x)/lnac5)∫e^xdxe^xc6)∫sinxdx-cosxc7)∫cosxdxsinxc8)∫1/(cosx)^2dxtanxc9)∫1/(sinx)^2dx-cotxc10)∫1/√…

canvas简单五子棋

canvas简单五子棋效果思路代码效果 思路 canvans 绘制棋盘&#xff0c;绘制时候边缘预留棋子位置监听点击事件绘制落子并记录到字典中获胜判定&#xff0c;在四个方向上检测是否有足够数量的连贯棋子 代码 <!DOCTYPE html> <html lang"en"> <head…

unet作为服务器不显示画面,UNet:无法生成服务器对象(不使用NetworkManager)

我m playing around with Unity 5的网络HLAPI . I dont want to use the NetworkManager &#xff0c;因为我没有t want to pay for Unity的多人游戏服务(Matchmaker和Relay服务器) .当客户端连接到服务器时&#xff0c;我正在尝试在客户端上生成播放器 . 我可以让客户端正确连…

viewBox视图缩放(1)

文章目录前言一、案例解析前言 svg 的viewBox 可以重新定义视口的显示范围&#xff0c;通常表现为平移&#xff0c;缩放内容&#xff0c;之前测试的一直是viewBox 和viewPort 之间的等比缩放&#xff0c;后来发现不等比情况与认知有些出入&#xff0c;如下 <svg width&quo…

sklearn svm如何选择核函数_文本挖掘篇|利用SVM进行短文本分类

何为数据挖掘&#xff0c;顾名思义就是从大量数据中挖掘或抽取出知识。在实际中&#xff0c;进行数据挖掘的数据不仅仅有数值型数据&#xff0c;还有图片型数据&#xff0c;文本型数据等。而所谓文本挖掘&#xff0c;就是从大量文本数据中&#xff0c;提取出对信息使用者有价值…

svg 折线添加新的折点

问题 现有已知折线 有多段&#xff0c;当双击折线的时候&#xff0c;需要将该双击的位置点Q 添加到折线上&#xff08;排除端点情况&#xff09;&#xff0c;如何去判断Q要添加在折线的哪一段&#xff0c;或者Q分割了折线的哪一段&#xff1f;&#xff1f; 分析 方式1 一开始…

微信企业号已停止提供企业消息会话服务器,企业微信注册时显示会话服务已经被安装了怎么解决 解决攻略教程大全...

2016年4月18日&#xff0c;腾讯正式发布全平台企业办公工具“企业微信”&#xff0c;并通过腾讯应用宝独家首发安卓版。“企业微信”的推出将为企业员工提供最基础和最实用的办公服务&#xff0c;并加入贴合办公场景的特色功能、轻OA工具&#xff0c;合理化区分工作与生活&…

hashmap 扩容是元素还是数组_曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?...

如何计算&#xff0c;一对key/value应该放在哪个哈希桶大家都知道&#xff0c;hashmap底层是数组链表(不讨论红黑树的情况)&#xff0c;其中&#xff0c;这个数组&#xff0c;我们一般叫做哈希桶&#xff0c;大家如果去看jdk的源码&#xff0c;会发现里面有一些变量&#xff0c…

ftp服务器文件名存在,有什么办法根据已知文件名来检测FTP服务器上是否存在该文件? 急...

蛊毒传说我不敢说_________________using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;namespace test{ class Program { static void Main(string[] args) { string path "ftp://192.168.1.200/ser…

A* 寻路 +寻路演示(js)

效果 每个单元格内文字&#xff1a; (F) (Price) (G) (H) 原理 原理是参考另一篇csdn博文&#xff0c;不过忘记收藏找不到了 初始化 open_set和 close_set。将 起点 加入open_set中&#xff0c;并设置优先级为0&#xff08;优先级最高&#xff09;。如果open_set不为空&…

pc端无法ping android模拟器_【内附下载方式】PC端最新宝可梦 Lets Go去皮去伊模拟器+最新dlc+mod...

游戏名称&#xff1a;精灵宝可梦 Let‘s go 皮卡丘 伊布游戏总大小&#xff1a;9GB游戏简介&#xff1a;《精灵宝可梦 Lets Go 皮卡丘/伊布》是宝可梦系列全新作品&#xff0c;也是该系列首次登上Switch主机&#xff0c;为后续作品的开发奠定了基础。本作可以视为是对第一世代红…

自定义处理网页选区字符并实时显示(js)

概述 浏览网页的时候&#xff0c;可能需要去数一下某段文字的字符数量&#xff0c;或者需要对选中内容做些实时翻译&#xff0c;比如进制的转化&#xff0c;可以使用脚本做个简单的实时翻译。 效果 选中内容&#xff0c;并且鼠标移动时会在左下角显示翻译后的结果。示例为翻…

css文本行高是哪个属性_CSS中的line-height行高属性的使用技巧小结

CSS中的line-hight属性是用来控制文本行之间的空隙的。它一般情况下没有单位的设定(如&#xff1a;line-height:1.4;)所以这是一个按字体尺寸的比例来计算。这对印刷版来说是一个很重要的属性。线条过低就会挤在一起&#xff0c;线条过高就会相距甚远&#xff0c;这两种情况都会…

模2运算及模2运算式计算 (js)

概述 学习二维码生成的时候卡在纠错码部分&#xff0c;然后就接触到了伽罗华域&#xff0c;了解到模2运算&#xff0c;恰好前不久刚了解了波兰表达式&#xff0c;就尝试写一个支持模2运算的算式解析计算。 结果 10011*101101.M2Calc() >"1011010" 涉及内容 模…

react配合python_部署React前端和Django后端的3种方法

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。2020年4月7日星期二&#xff0c;马修西格尔类别&#xff1a;Django如果您要用Django REST开发web应用程序后端&#xff0c;并使用React或Vue开发应用程序前端。有很多方法实现。你需要做出…

伽罗瓦域(256) 生成指定纠错码字的生成多项式 (js)

效果 使用 复制code 保存为html 涉及内容 1、有限域、伽罗瓦域(256) 2、对数反对数 3、XOR 异或 两个因式各项相乘&#xff0c;当系数项相乘时&#xff0c;指数相加并mod(255) 合并同类项时&#xff0c;相同项的系数合并为 XOR操作&#xff1b; 伽罗瓦域依旧有些犯懵&…

python贪心算法求删数问题_贪心算法删数问题

删数问题给定n位正整数a&#xff0c;去掉其中任意k个数字后&#xff0c;剩下的数字按原次序排列组成一个新的正整数。对于给定的n和k&#xff0c;设计一个算法&#xff0c;找出剩下数字组成的新数最少的删数方案。输入示例&#xff1a; 178543 4输出&#xff1a; 13输入示例&am…

二维码-纠错码生成(js)

概要 本文主要为计算&#xff0c;而非对伽罗瓦域等数学内容的深入解析&#xff0c;在知道消息多项式以及纠错数量的情况下通过程序生成对应的纠错码。详细的二维码生成原理参考一个详细全面的二维码生成解析 效果 数据码: 长度16的示例数据码&#xff08;正常获取的是示例的…

一步一步学python爬虫_初学Python之爬虫的简单入门

初学Python之爬虫的简单入门一、什么是爬虫&#xff1f;1.简单介绍爬虫爬虫的全称为网络爬虫&#xff0c;简称爬虫&#xff0c;别名有网络机器人&#xff0c;网络蜘蛛等等。网络爬虫是一种自动获取网页内容的程序&#xff0c;为搜索引擎提供了重要的数据支撑。搜索引擎通过网络…

实现二维码-完整三种编码流程加代码解析(javascript)

效果 输入内容&#xff1a;XXXwedewed生日//&sss乐❤XXXwedewed生日//&sss乐❤ 完整的演示效果为&#xff0c;输入内容后会将解码绘制的每一步都展示&#xff08;有点长就不全截图了&#xff0c;可以直接移至最后复制代码到本地运行&#xff09;&#xff1a; 原理…