php实现的生成迷宫与迷宫寻址算法完整实例


Posted in PHP onNovember 06, 2017

本文实例讲述了php实现的生成迷宫与迷宫寻址算法。分享给大家供大家参考,具体如下:

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

<?php
header('Content-Type: text/html; charset=utf-8');
error_reporting(E_ALL);
//n宫格迷宫
define('M', 39);//宫数
define("S", 20);//迷宫格大小
$_posArr = array(array(0, -1), array(1, 0), array(0, 1), array(-1, 0));//当前点寻址的四个xy方向 上右下左
//生成迷宫
$maze = array();
$mazeUnit = array(1, 1, 1, 1);//上右下左
for($x=0; $x<=M; $x++){
  for($y=0; $y<=M; $y++){
    $maze[$x][$y] = $mazeUnit;
  }
}
$maze2 = array();//破墙后的已访问格子
$mazeOrder = 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)];
    $maze2[$nx][$ny] = $maze[$nx][$ny];
    if(empty($maze2[$x][$y])) $maze2[$x][$y] = $maze[$x][$y];
    $pos = array($nx - $x, $ny - $y);
    foreach($_posArr as $key=>$val){//循环四个方向,找出需要破的墙
      if($pos == $val) {
        $maze2[$x][$y][$key] = 0;//原格子破墙
        $maze2[$nx][$ny][($key+2)%4] = 0;//新格子破墙
      }
    }
    //设置新的当前格后返回继续while循环
    $x = $nx;
    $y = $ny;
    $mazeOrder[] = array($x, $y);
    unset($maze[$x][$y]);//去掉已破墙的格子
    if(empty($maze[$x])) unset($maze[$x]);
  }else{//当前xy周围不存在未破墙的格子,返回上一个格子继续破墙
    array_pop($mazeOrder);
    if($mazeOrder) list($x, $y) = $mazeOrder[count($mazeOrder) - 1];
  }
}
//留出出口
$maze = $maze2;
$maze[0][0][3] = 0;
$maze[M][M][1] = 0;
//寻址
$pathArr = findPath($maze, 0, 0, false);
printMaze($maze, $pathArr);
echo "<img src='maze.png'> <a href='javascript:;' onclick='location.reload();'>刷新</a>";
//打印迷宫和寻址结果
function printMaze($maze, $pathArr){
  $im = ImageCreate((M + 1) * S + 1, (M + 1) * S + 1);
  $bg = ImageColorAllocate($im, 236, 233, 216);
  $pathColor=ImageColorAllocate($im, 255, 0, 0);
  $exitColor=ImageColorAllocate($im, 134, 255, 0);
  $borderColor = ImageColorAllocate($im, 0, 0, 0);
  ImageRectangle($im, 0, 0, (M + 1) * S, (M + 1) * S, $borderColor);//包边
  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, $borderColor);//下有线
      if($unit[3]) ImageLine($im, $x * S, $y * S, $x * S, ($y + 1) * S, $borderColor);//左有线
      //if(in_array(array($x, $y), $pathArr)) ImageFilledEllipse($im, $x * S + S/2, $y * S + S/2, S, S, $pathColor);//寻址格
      if(in_array(array($x, $y), $pathArr)) ImageString($im, 1, $x * S + S/5, $y * S + S/5, array_search(array($x, $y), $pathArr), $pathColor);//寻址格
    }
  }
  ImagePNG($im, 'maze.png');
  ImageDestroy($im);
}
//寻址函数
function findPath($maze, $x, $y, $fromxy){
  global $_posArr;
  if($x == M && $y == M){//到达出口
    Return array(array($x, $y));
  }
  foreach($_posArr as $key=>$val){
    if($maze[$x][$y][$key]) continue;//为1则不通
    $nx = $x + $val[0];
    $ny = $y + $val[1];
    if(!isset($maze[$nx][$ny]) || $fromxy == array($nx, $ny)) continue;//边界超出或为来源点
    if($pathArr = findPath($maze, $nx, $ny, array($x, $y))) {
      array_unshift($pathArr, array($x, $y));
      Return $pathArr;//能到达出口
    }
  }
  Return false;
}
?>

运行结果如下:

php实现的生成迷宫与迷宫寻址算法完整实例

PHP 相关文章推荐
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
php计算当前程序执行时间示例
Apr 24 PHP
PHP编写RESTful接口
Feb 23 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
php实现留言板功能
Mar 05 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
Oct 20 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
PHP编程一定要改掉的5个不良习惯
Sep 18 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 #PHP
PHP中危险的file_put_contents函数详解
Nov 04 #PHP
PHP回调函数概念与用法实例分析
Nov 03 #PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 #PHP
PHP空值检测函数与方法汇总
Nov 19 #PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 19 #PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 #PHP
You might like
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
js文字横向滚动特效
2015/11/11 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
python Django模板的使用方法
2016/01/14 Python
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
numpy.array 操作使用简单总结
2019/11/08 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
幼儿园新年寄语
2014/04/03 职场文书
大学生交通专业求职信
2014/09/01 职场文书
检讨书格式
2015/01/23 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书