写的很简陋。看到有更好的迷宫算法,还没来得及参考。主要是在想迷宫寻址的函数。迷宫寻址函数应该差不多了。很久没来,向唠叨致敬。<?php
header('Content-Type: text/html; charset=utf-8');
error_reporting(E_ALL);//n宫格迷宫■□
define('M', 8);//最笨的迷宫
$xLen = array(0, 1, 0, -1);//当前点寻址的四个x方向
$yLen = array(-1, 0, 1, 0);//当前点寻址的四个y方向$i = 0;
while(1){
$i++;
if($i>10000) {//很傻的做法出迷宫,别笑话哈
echo "ft<br />";
break;
}
//生成迷宫
$maze = array();
for($a=0; $a<=M; $a++){
for($b=0; $b<=M; $b++){
if(rand(0,2) != 1) {
$maze[] = array($a, $b);
}
}
}
//寻址
$pathArr = array();
echo "<hr>";
if(findPath(0, 0, false)) {echo "ok<br>";break;}
}
printMaze($maze, $pathArr);
echo "<br>$i";//寻址函数
function findPath($x, $y, $fromxy){
global $maze, $pathArr, $xLen, $yLen;
if($x == M && $y == M){//到达出口
Return true;
}
for($ii=0; $ii<4; $ii++){
$nx = $x + $xLen[$ii];
$ny = $y + $yLen[$ii];
if($nx >= 0 && $ny >= 0 && $nx <= M && $ny <= M && $fromxy != array($nx, $ny) && in_array(array($nx, $ny), $maze)){
if(findPath($nx, $ny, array($x, $y))) {
$pathArr[] = array($nx, $ny);
Return true;//能到达出口
}
}
}
Return false;
}//打印迷宫和寻址结果
function printMaze($maze, $pathArr){
for($a=0; $a<=M; $a++){
for($b=0; $b<=M; $b++){
if(in_array(array($a, $b), $maze)) {
if(in_array(array($a, $b), $pathArr)){
echo "<font color='red'>□</font>";
}else{
echo "□";
}
}else{
echo "■";
}
}
echo "<br />";
}
}

解决方案 »

  1.   

    经历了很多风波,到石家庄定居了。对php的热忱依旧,钟爱编程。现在正在做一个webgame呢,纯兴趣。:)
      

  2.   

    恭喜定居,现在房子把大部分男人难死了
    建议你了解下Dijkstra  或者 A* ,找到最短路径就退出吧
      

  3.   

    买房子是个很为难的事情,租着呢。不过也是定居了呵呵。不再闯荡徘徊了。Dijkstra昨晚上看到有这方面的资料。不过还没细看。谢谢提醒。正在准备研究生成迷宫的函数。
      

  4.   

    这个寻址函数有bug。由于没有在递归前记录已寻址路径,如果多条通道可通往出口并且互相连通的话,这个程序就可以陷入死循环。
    原来这就是为啥有时候执行这个程序提示打不开网页的原因。但是奇怪的是,看打印出的寻址路径,没有绕弯的。