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>

Prime算法生成迷宫相关推荐

  1. Prim算法生成迷宫

    初始化地图 function initMaze(r,c){let row = new Array(2 * r + 1)for(let i = 0; i < row.length; i++){le ...

  2. C 语言 随机prim算法 生成迷宫

    使用 随机prim算法生成迷宫,效果如下: 随机prim迷宫生成算法思想: 1.普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不 ...

  3. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  4. Python Prim 算法 生成迷宫

    之前,我们在另外一篇文章中使用Prim算法生成了一个完美迷宫,利用的是遍历网格的方法,这一次,我们要教教大家用遍历墙的方法生成,上一篇文章链接:Python Prim 算法 生成迷宫_Leleprog ...

  5. 随机Prim算法生成迷宫

    前言 以前写过一篇博客,用栈走迷宫,然后就想着自己生成迷宫,自己走,就上网查了查自动生成迷宫的算法,也是研究了好一会,才用代码实现了这个算法,采用的就是常见的随机Prim算法. 原理 参考博客:htt ...

  6. 实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)

    目录 实验要求: 算法简介: prim算法: A*算法: 实验要求: 该项目的主要要求是:首先生成一个迷宫,要求随机生成.而生成迷宫有深度优先算法.prim算法.递归分割算法等.老师说建议使用prim ...

  7. 实验三:基于A*算法的迷宫

    实验要求: 1.迷宫随机生成 2.玩家走迷宫,留下足迹: 3.系统用A*算法寻路,输出路径 解决问题: 1.如何显示迷宫的图形界面: 2.如何生成随机的迷宫: 3.怎样移动游戏中走迷宫的"玩 ...

  8. 基于深度优先算法和A*算法的迷宫游戏开发(Java实现)

    先上图 文章目录 一.实验内容 二.深度优先算法生成迷宫 三.A*算法走迷宫 四.结果测试 五.源代码 六.参考文献 一.实验内容 1.要求: 1)迷宫随机生成 2)系统用A*算法寻路,输出路径 3) ...

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

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

最新文章

  1. python学习笔记(八)类(classes)
  2. Mysql数据库设计规范之四数据库操作行为规范
  3. 中文 WordPress 工具箱(1.2)与WP-Stats(2.2)冲突的解决办法
  4. C#获取网页内容的三种方式
  5. 汇编语言源程序基础分析--跑马灯
  6. 微信小程序轮播图禁止滚动
  7. html——陆海网站练习
  8. 设置表格单元格的背景颜色
  9. 谷歌大脑2017技术研究总结 | Jeff Dean执笔(附论文 数据集)
  10. OutMan——Foundation框架中的集合类(三)
  11. [数据库笔记] SQL50题11 - 30
  12. java populate_BeanUtils.populate()的用法
  13. win101909要不要更新_win101909版本千万别更新?win10 1909值得升级吗要不要更新
  14. 除了中国知网和谷歌文学还有哪些好的有权威的资源站?
  15. 相片打印机原理_照片打印机有哪些特点 照片打印机多少钱【详解】
  16. android camera viewport rect,如何判断元素是否在可视区域ViewPort
  17. 大数据(052)Oozie【Oozie介绍 CDH安装Oozie】
  18. 相应的游戏服务器组件信息不存在,房间创建失败
  19. 关于 Intel Realsense 深度图像处理.1(C++)
  20. 计算机一级ps知识,计算机等级考试一级ps练习题及答案

热门文章

  1. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 21丨报告系统状态的连续日期【难度困难】​
  2. ❤️《10个超级常用Python方法总结》复制即用丨小白捷径【文末赠书2本】❤️
  3. 8个最高效的Python爬虫框架,你用过几个?
  4. C++学习之路 | PTA乙级—— 1018 锤子剪刀布 (20分)(精简)
  5. 滤波器开发之三:基于算数平均的阶进平滑滤波器
  6. 无源码情况下动态调试混淆的java程序
  7. 基于matlab的频域辨识,基于Lab VIEW的控制系统频域分析研究
  8. 现代程序设计 作业6 - 简单而有意义的题目
  9. 徐海学院计算机专业好吗,2019中国矿业大学徐海学院专业排名
  10. java禁止数据库写入事务_Java -- JDBC 事务处理, 事务的隔离级别 脏读 不可重复读 等......