加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php生成迷宫和迷宫寻址算法实例

发布时间:2020-12-13 21:22:17 所属栏目:PHP教程 来源:网络整理
导读:较之前的终于有所改善。生成迷宫的算法和寻址算法其实是一样。只是一个用了遍历一个用了递归。参考了网上的Mike Gold的算法。 1 ? php 2 // zairwolf z@cot8.com 3 header ('Content-Type: text/html; charset=utf-8' ); 4 error_reporting ( E_ALL 5 6 n宫

较之前的终于有所改善。生成迷宫的算法和寻址算法其实是一样。只是一个用了遍历一个用了递归。参考了网上的Mike Gold的算法。

  1 <?php
  2 //zairwolf z@cot8.com
  3 header('Content-Type: text/html; charset=utf-8');
  4 error_reporting(E_ALL  5 
  6 n宫格迷宫
  7 define('M',39);宫数
  8 define("S",20);迷宫格大小
  9 $_posArr = array(array(0,-1),array(1,0),1),1)">array(-1,0));当前点寻址的四个xy方向 上右下左
 10 
 11 //生成迷宫
 12 $maze = array();
 13 $mazeUnit = 上右下左
 14 for($x=0; $x<=M; $x++){
 15     $y=0; $y<=M; $y++ 16         $maze[$x][$y] = $mazeUnit;
 17     }
 18 }
 19 $maze2 = array();破墙后的已访问格子
 20 $mazeOrder = 破墙顺序
 21 $x = $y = 0;初始入口
 22 while(count($maze)>0 23     $tmpArr =  24     foreach($_posArr as $val 25         $nx = $x + $val[0];
 26         $ny = $y + $val[1 27         if(isset($nx][$ny])){未破墙过的格子
 28             $tmpArr[] = array($nx,$ny 29         }
 30  31     if($tmpArr){有未破墙的格子,随机出一个,破墙
 32         list($ny) = $tmpArr[array_rand($tmpArr)];
 33         $maze2[$ny] =  34         empty($y])) $y 35         $pos = $nx - $x,1)">$ny -  36         $key=>$val){循环四个方向,找出需要破的墙
 37             $pos == ) {
 38                 $y][$key] = 0;原格子破墙
 39                 $ny][($key+2)%4] = 0;新格子破墙
 40             }
 41  42         设置新的当前格后返回继续while循环
 43         $nx 44         $y =  45         $mazeOrder[] =  46         unset($y]);去掉已破墙的格子
 47         $x])) $x]);
 48     }else{当前xy周围不存在未破墙的格子,返回上一个格子继续破墙
 49         array_pop($mazeOrder 50         $mazeOrder) $y) = $mazeOrder[$mazeOrder) - 1 51  52  53 留出出口
 54 $maze = $maze2 55 $maze[0][0][3] = 0 56 $maze[M][M][1] = 0 57 
 58 寻址
 59 $pathArr = findPath($maze,1)">false 60 printMaze($pathArr 61 
 62 echo "<img src='maze.png'> <a href='javascript:;' onclick='location.reload();'>刷新</a>" 63 
 64 打印迷宫和寻址结果by z@cot8.com
 65 function printMaze( 66     $im = ImageCreate((M + 1) * S + 1,(M + 1) * S + 1 67     $bg = ImageColorAllocate($im,236,233,216 68     $pathColor=ImageColorAllocate( 69     $exitColor=ImageColorAllocate( 70     $borderColor = ImageColorAllocate( 71     ImageRectangle($borderColor);包边
 72     ImageLine($bg);右上边开口
 73     ImageLine(左下边开口
 74     $maze $x=>$xarr){生成格子
 75         $xarr $y=>$unit 76             $unit[0]) ImageLine($x * S,1)">$y * S,($x + 1) * S,1)">上有线
 77             $unit[1]) ImageLine($y + 1) * S,1)">右有线
 78             $unit[2]) ImageLine(下有线
 79             $unit[3]) ImageLine(左有线
 80             //if(in_array(array($x,$y),$pathArr)) ImageFilledEllipse($im,$x * S + S/2,$y * S + S/2,$pathColor);//寻址格
 81             in_array($y),1)">$pathArr)) ImageString($x * S + S/5,1)">$y * S + S/5,1)">array_search($pathArr),1)">$pathColor);寻址格
 82  83  84     ImagePNG( 85     ImageDestroy($im 86  87 
 88 寻址函数 z@cot8.com
 89 function findPath($y,1)">$fromxy 90     global $_posArr 91     $x == M && $y == M){到达出口
 92         Return ));
 93  94      95         $key]) continue;为1则不通
 96          97          98         if(!$ny]) || $fromxy == $ny)) 边界超出或为来源点
 99         $ny,1)">))) {
100             array_unshift($pathArr,1)">101             Return $pathArr;能到达出口
102 103 104     105 }

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读