宝哥软件园

一个完整的用php实现生成迷宫和迷宫寻址算法的例子

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

本文描述了用php实现的生成迷宫和迷宫寻址算法。分享给大家参考,如下:

与之前的相比,终于有所改善。生成迷宫的算法其实和寻址算法是一样的。只有一个使用遍历,另一个使用递归。参考互联网上迈克戈尔德的算法。

?phpheader(' Content-type : text/html;charset=utf-8 ');错误报告;//n宫格迷宫定义(‘M’,39);//宫数定义(‘S’,20);//迷宫格大小$_posArr=array(array(0,-1),array(1,0),array(0,1),array(-1,0));//当前点寻址的四个正常男性染色体组型方向上右下左//生成迷宫$迷宫=array();$ mazunit=array(1,1,1,1);//上右下左for($ x=0;$ x=M;$ x){ for($ y=0;$ y=M;$ y){ $ maze[$ x][$ y]=$ maz unit;} } $ maze 2=array();//破墙后的已访问格子$ maz order=array();//破墙顺序$ x=$ y=0;//初始入口while(count($ maze)0){ $ tmpArr=array();foreach($ _ posArr as $ val){ $ NX=$ x $ val[0];$ ny=$ y $ val[1];if(isset($ maze[$ NX][$ ny]){//未破墙过的格子$tmpArr[]=array($nx,$ ny);} } if($tmpArr){//有未破墙的格子,随机出一个,破墙list($nx,$ ny)=$ tmpArr[array _ rand($ tmpArr)];$ maze 2[$ NX][$ ny]=$ maze[$ NX][$ ny];如果(空($ maze 2[$ x][$ y])$ maze 2[$ x][$ y]=$ maze[$ x][$ y];$pos=array($nx - $x,$ ny-$ y);foreach($ _ posArr as $ key=$ val){//循环四个方向,找出需要破的墙if($ pos==$ val){ $ maze 2[$ x][$ y][$ key]=0;//原格子破墙$ maze 2[$ NX][$ ny][($ key 2)% 4]=0;//新格子破墙} } //设置新的当前格后返回继续正在…循环$ x=$ NX $ y=$ ny $ maz order[]=array($ x,$ y);unset($ maze[$ x][$ y]);//去掉已破墙的格子如果(空($ maze[$ x])未设置($ maze[$ x]);}else{//当前正常男性染色体组型周围不存在未破墙的格子,返回上一个格子继续破墙array _ pop($ maz order);if($ mazorder)list($ x,$ y)=$ maz order[count($ maz order)-1];}}//留出出口$ maze=$ maze 2 $ maze[0][0][3]=0;$ maze[M][M][1]=0;//寻址$ pathar=find path($ maze,0,0,false);printMaze($maze,$ pathArrecho ' img src=' maze。png ' a href=' JavaScript :onclick='位置。reload();'刷新/a ';//打印迷宫和寻址结果函数printMaze($maze,$ pathar){ $ im=image create((m . ^ 1)* s . ^ 1、(m . ^ 1)* s . ^ 1);$bg=ImageColorAllocate($im,236,233,216);$ PathColor=imageColorAllocate($ im,255,0,0);$ exit color=ImageColorAllocate($ im,134,255,0);$ borderColor=ImageColorAllocate($ im,0,0,0);ImageRectangle($im,0,0),(M ^ 1)* S,(M ^ 1)* S,$ border color);//包边ImageLine($im,0,0,0,S,$ BG);//右上边开口ImageLine($im),(m . ^ 1)* s,M * S,(m . ^ 1)* s,(m . ^ 1)* s,$ BG);//左下边开口foreach($maze as $x=$xarr){//生成格子foreach($ xarr as $ y=$ unit){ if($ unit[0])ImageLine($ im,$x * S,$y * S,($x 1) * S,$y * S,$ borderColor);//上有线if($unit[1]) ImageLine($im,($x 1) * S,$y * S,($x 1) * S,($y 1) * S,$ borderColor);//右有线if($unit[2]) ImageLine($im,$x * S,($ y ^ 1)* S,($ x ^ 1)* S,($ y ^ 1)* S,$ border color);//下有线if($unit[3]) ImageLine($im,$x * S,$y * S,$x * S,($ y * 1)* S,$ borderColor);//左有线//if(in_array(array($x,$y),$ path arr))imagefildellipse($ im,$ x * S/2,$ y * S/2,S,S,$ path color);//寻址格if(in_array(array($x,$y),$ pathar))ImageString($ im,1,$ x * S/5,$y * S/5,array_search(array($x,$y),$ pathar),$ path color);//寻址格} } ImagePNG($im,' maze。png ');图像销毁($ im);}//寻址函数函数findPath($maze,$x,$y,$ from xy){ global $ _ posArr;if($x==M $y==M){//到达出口返回数组(数组($x,$ y));} foreach($ _ posArr as $ key=$ val){ if($ maze[$ x][$ y][$ key])继续;//为一则不通$ NX=$ x $ val[0];$ ny=$ y $ val[1];if(!isset($ maze[$ NX][$ny])| | $ froxy==array($ NX,$ ny))继续;//边界超出或为来源点if($ pathar=find path($ maze,$nx,$ny,array($x,$ y)){ array _ unshift($ pathar,array($x,$ y));返回$ pathArr//能到达出口} }返回false}?运行结果如下:

PS:这里再为大家推荐另一款本站基于射流研究…的迷宫在线游戏供大家参考:

在线迷宫小游戏:http://工具。JB 51。网络/游戏/米红

更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》、0103010

希望本文对PHP编程有所帮助。

更多资讯
游戏推荐
更多+