最近看到一篇博客,也是制作迷宫的,我仔细看了一下,里面涉及一个算法--并查集(不相交集合),没有听过,就打算练习一下,由于最近又在使用LayaAir,就打算用它来写。

先看我之前看的那两篇文章:链接1链接2

我使用的是LayaAir2.2.0beta4

效果图:

1、创建工程,新建场景

新建一个脚本,脚本继承Laya.Script,把该脚本添加到场景里

2、画地图、画蓝色方块、红色方块

//画地图
this.m_lineBox = new Laya.Sprite();
this.setPos(this.m_lineBox,0,0);
this.setzOrder(this.m_lineBox,0);
this.owner.addChild(this.m_lineBox);
for (let i = 0; i < 16; i++) {this.m_lineBox.graphics.drawLine(100,100+30*i,550,100+30*i,"#ffffff",2);this.m_lineBox.graphics.drawLine(100+30*i,100,100+30*i,550,"#ffffff",2);
}
//画蓝色方块
this.m_blue = new Laya.Sprite();
this.m_blue.size(20,20);
this.setPos(this.m_blue,105,105);
this.setzOrder(this.m_blue,1);
this.owner.addChild(this.m_blue);
this.m_blue.graphics.drawRect(0,0,20,20,"#003dff","#003dff",1);
//画红色色方块
this.m_red = new Laya.Sprite();
this.m_red.size(20,20);
this.setPos(this.m_red,105+420,105+420);
this.setzOrder(this.m_red,0);
this.owner.addChild(this.m_red);
this.m_red.graphics.drawRect(0,0,20,20,"#ff0400","#ff0400",1);
//设置位置
private setPos(object:Laya.Sprite,x:number,y:number):void{object.pos(x,y);
}
//设置层级
private setzOrder(object:Laya.Sprite,value:number):void{object.zOrder = value;
}

3、移动蓝色方块

//键盘控制
onKeyDown(e:Laya.Event){//蓝色方块移动switch (e.keyCode) {case 37:this.moveObject(this.m_blue,-30,0);     break;case 38:this.moveObject(this.m_blue,0,-30);break;case 39:this.moveObject(this.m_blue,30,0);break;case 40:this.moveObject(this.m_blue,0,30);break;}
}
//移动对象
private moveObject(object:Laya.Sprite,x:number,y:number):void{//判断能否移动if(this.judgeMove(object,x,y)){let toX = object.x+x;let toY = object.y+y;this.setPos(object,toX,toY);//判断是否到达终点--于红色方块重合if(this.m_blue.x==this.m_red.x&&this.m_blue.y==this.m_red.y){console.log("过关了!");//初始化蓝色方块this.setPos(this.m_blue,105,105);//清理地图this.m_lineBox.graphics.clear();//重画地图for (let i = 0; i < 16; i++) {this.m_lineBox.graphics.drawLine(100,100+30*i,550,100+30*i,"#ffffff",2);this.m_lineBox.graphics.drawLine(100+30*i,100,100+30*i,550,"#ffffff",2);}//初始化节点数组this.m_mapInfoAry.forEach(e => {e.value = -1;e.parent = null;e.up = false;e.down = false;e.left = false;e.right = false;});//初始化起始点、终止点this.m_begin = new Laya.Point(this.m_blue.x-105,this.m_blue.y-105);this.m_end = new Laya.Point(this.m_red.x-105,this.m_red.y-105);//创建迷宫this.createMaze(this.m_begin,this.m_end);}}
}
//判断移动
private judgeMove(object:Laya.Sprite,valueX:number,valueY:number):boolean{let toX:number = object.x+valueX;let toY:number = object.y+valueY;//判断是否出界if(toX>=105&&toX<=525&&toY>=105&&toY<=525){let nowX = Math.floor((object.x-105) / 30);let nowY = Math.floor((object.y-105) / 30);let nowNodeInfo = this.m_mapInfoAry[nowY*15+nowX];//判断是否相通if(valueX>0&&nowNodeInfo.right){return true;}else if(valueX<0&&nowNodeInfo.left){return true;}else if(valueY>0&&nowNodeInfo.down){return true;}else if(valueY<0&&nowNodeInfo.up){return true;}return false;}else{return false;}
}

4、创建节点类,创建节点数组,初始化起始点、终止点

class NodeInfo{public value:number;//孩子数public parent:NodeInfo;//父亲public up:boolean;//上面是否打通public down:boolean;//下面是否打通public left:boolean;//左面是否打通public right:boolean;//右面是否打通constructor(value:number){this.value = value;this.parent = null;this.up = false;this.down = false;this.left = false;this.right = false;}
}
//初始化起始点、终止点
this.m_begin = new Laya.Point(this.m_blue.x-105,this.m_blue.y-105);
this.m_end = new Laya.Point(this.m_red.x-105,this.m_red.y-105);
//初始化节点数组
for (let i = 0; i < 225; i++) {this.m_mapInfoAry.push(new NodeInfo(-1));
}

4、画迷宫(用到了并查集)

private createMaze(begin:Laya.Point,end:Laya.Point):void{begin.x = Math.floor(begin.x / 30);begin.y = Math.floor(begin.y / 30);end.x = Math.floor(end.x / 30);end.y = Math.floor(end.y / 30);let beginNode:NodeInfo = this.m_mapInfoAry[begin.y*15+begin.x];let endNode:NodeInfo = this.m_mapInfoAry[end.y*15+end.x];while(true){let R_Num = Tool.GetRandomInt(0,224);let R_NodeInfo = this.m_mapInfoAry[R_Num];let dAry:Array<number> = [];if(R_Num%15>0&&this.limitABUnion(R_Num-1,R_NodeInfo)){dAry.push(1);}if(R_Num%15<14&&this.limitABUnion(R_Num+1,R_NodeInfo)){dAry.push(2);}if(Math.floor(R_Num/15)>0&&this.limitABUnion(R_Num-15,R_NodeInfo)){dAry.push(3);}if(Math.floor(R_Num/15)<14&&this.limitABUnion(R_Num+15,R_NodeInfo)){dAry.push(4);}if(dAry.length!=0){let dValue = Tool.GetRandomInt(0,dAry.length-1);let tempNode:NodeInfo;switch (dAry[dValue]) {case 1:tempNode = this.m_mapInfoAry[R_Num-1];R_NodeInfo.left = true;tempNode.right = true;break;case 2:tempNode = this.m_mapInfoAry[R_Num+1];R_NodeInfo.right = true;tempNode.left = true;break;case 3:tempNode = this.m_mapInfoAry[R_Num-15];R_NodeInfo.up = true;tempNode.down = true;break;case 4:tempNode = this.m_mapInfoAry[R_Num+15];R_NodeInfo.down = true;tempNode.up = true;break;}this.mopLine(R_Num%15*30+100,Math.floor(R_Num/15)*30+100,dAry[dValue]);this.willABUnion(R_NodeInfo,tempNode,null);if(this.judgeABUnion(beginNode, endNode))break;}}
}
//擦线
private mopLine(x:number,y:number,value:number){switch (value) {case 1:this.m_lineBox.graphics.drawLine(x,y,x,y+30,"#000000",2);break;case 2:this.m_lineBox.graphics.drawLine(x+30,y,x+30,y+30,"#000000",2);break;case 3:this.m_lineBox.graphics.drawLine(x,y,x+30,y,"#000000",2);break;case 4:this.m_lineBox.graphics.drawLine(x,y+30,x+30,y+30,"#000000",2);break;}
}
//限制AB联盟
private limitABUnion(Aindex:number,_B:NodeInfo):boolean{let A = this.m_mapInfoAry[Aindex];let B = _B;if(!this.judgeABUnion(A,B))return true;else return false;
}
//将AB联盟
private willABUnion(A:NodeInfo,B:NodeInfo,C:NodeInfo):void{if(A.parent!=null){if(B.parent!=null){this.willABUnion(A.parent,B.parent,B);}else{this.willABUnion(A.parent,B,B);}}else{if(B.parent!=null){this.willABUnion(A,B.parent,B);}else{if(A.value==B.value){A.parent = B;B.value += A.value; }else{if(A.value<B.value){B.parent = A;A.value += B.value; }else{A.parent = B;B.value += A.value;}}}}
}
//判断AB联盟
private judgeABUnion(A:NodeInfo,B:NodeInfo):boolean{if(A.parent!=null){if(B.parent!=null){return this.judgeABUnion(A.parent,B.parent);}else{return this.judgeABUnion(A.parent,B);}}else{if(B.parent!=null){return this.judgeABUnion(A,B.parent);}else{if(A==B)return true;else return false;}}
}
//随机数
public static GetRandomInt(min: number, max: number): number
{var Gap = max - min;var Rand = Math.random();return(min + Math.round(Rand * Gap));
}

到此为止迷宫就做完了

LayaAir之制作迷宫相关推荐

  1. python制作动图-用Python制作迷宫GIF

    原标题:用Python制作迷宫GIF 安装 可以通过PyPi安装 或者通过Git 为什么你需要这个库? 问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣.我很羡慕别人能够做出生成 ...

  2. Python 制作迷宫游戏(二)——游戏窗口

    Python 制作迷宫游戏(二)--游戏窗口 上一节我们使用prime做了迷宫的底层数组,它的形式是一个二维数组. 这一节我们着手开始制作游戏窗口 使用模块 pygame 在这项迷宫游戏的制作当中需要 ...

  3. Python 制作迷宫游戏(三)——地图精灵

    Python 制作迷宫游戏(三)--地图精灵 上一节我们已经成功的生成了一个游戏窗口 这一节我们将试着把地图的瓦片与地图数组绑定并绘制到窗口中 当然,作为一个迷宫,地图的作用不仅仅是背景板,它最为重要 ...

  4. layaAir引擎制作游戏的图集动画、时间轴动画、和骨骼动画总结二

    一.角色序列帧.ani动画的制作 1.在项目管理器中创建动画文件 2.创建动画模板,编辑动效名称 3.编辑序列帧动画 .ani格式动画的代码控制 1.动画加载loadAnmition() 2.播放与停 ...

  5. python解图片迷宫生成路径_在python中制作迷宫图

    嘿,我正在尝试使用Python中的字典制作图表.我正在使用一个包含迷宫的txt文件(b代表路径的墙壁)我正在尝试制作一个字典,列出迷宫中所有可能的移动(简单步骤,而不是完整路径).关于我应该从哪里开始 ...

  6. 【python教程入门学习】用Python制作迷宫GIF

    安装 可以通过PyPi安装 或者通过Git 为什么你需要这个库? 问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣.我很羡慕别人能够做出生成迷宫的动画.我如何能够用Python自 ...

  7. 用html js制作迷宫,JavaScript生成随机迷宫详解

    本篇教程介绍了JavaScript生成随机迷宫详解,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < #先看生成随机迷宫的代码吧↓ 1 2 3 生成随机迷宫v ...

  8. python设计迷宫_用Python制作迷宫GIF

    安装 可以通过PyPi安装 或者通过Git 为什么你需要这个库? 问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣.我很羡慕别人能够做出生成迷宫的动画.我如何能够用Python自 ...

  9. 9行代码用python制作迷宫gif动画

    如何能够用Python自己做一个迷宫动画,然后把我的成果展示给其他人呢?(我知道tkinter, pyglet 和 pyqt,但是它们很难发布给别人看) 现在,可以使用库gifmaze来做这件事了,它 ...

最新文章

  1. Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败...
  2. echarts formatter_vue使用echarts的方法
  3. count(1),count(*),count(主键) 性能对比及辟谣
  4. matlab动画_弹簧振子振动的matlab动画演示
  5. linux shell变量作用域,Shell变量的作用域:Shell全局变量、环境变量和局部变量
  6. GPIO应用开发方法【ZT】
  7. Mac 登陆Linux云服务器方法
  8. 重建SYSVOL和NETLOGON共享
  9. 嵌入式系统——RS232和RS449
  10. java递归遍历文件夹_java递归遍历获取目录下所有文件
  11. 给大家安利一个买电脑好去处(内有福利)
  12. c语言:【顺序表】静态顺序表的删除指定位置元素Erase、删除指定元素Remove
  13. AS-实践《第一行代码》中的出现的问题
  14. 《数据结构教程》(第5版)学习笔记(一)
  15. mysql 经纬度范围_MySQL之根据经纬度查询多少公里范围内的数据
  16. 常用的DOS命令大全
  17. android源码编译并刷入nexus 6p手机
  18. 动态刷新listview中的数据
  19. Linux Mint (应用软件— 二进制文件编辑器 :bless)
  20. 宁波银行金融科技面试

热门文章

  1. 0days最好的破解网站
  2. excel表格分割线一分为二_Anki+思维导图的两种方法(Anki+表格,Anki+幕布)
  3. HTML5+CSS3 02(表格、表单标签、语义化,字符实体标签)
  4. python读取图片的格式_python读取图片并修改格式与大小的方法
  5. 离线数仓建设及技术选型
  6. 云原生(什么是云原生?云原生的四要素)
  7. Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输
  8. App三种启动场景:冷启动、热启动、温启动
  9. 【C++】Placement New
  10. win10桌面计算机怎么显示器,一台电脑两个显示器如何设置