您正在使用IPV4(34.230.9.187)访问本站 您本次共访问本站 1 次
 用户名: 密 码: 验证码:     用QQ登录本站
首页 软件 编程 笑话 知识 公告 台风 日历 计算器 行情 简化版
文明驾车我带头,文明行路我带头,礼貌让座我带头      

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元      
[公益] 节省一分零钱 献出一份爱心 温暖世间真情      
2022年 情人节 27
2022年 元宵节 28
2023年 元 旦 348
2022年 春 节 14
 
  • 本类新增
    本类热门文章
    您现在的位置:首页 >> PHP >> 内容
    php实现的生成迷宫与迷宫寻址算法完整实例
    内容摘要: ?phpheader('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,......
    <?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($_posArras$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($_posArras$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"<imgsrc='maze.png'><ahref='javascript:;'onclick='location.reload();'>刷新</a>";

    //打印迷宫和寻址结果

    functionprintMaze($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($mazeas$x=>$xarr){//生成格子

    foreach($xarras$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);

    }

    //寻址函数

    functionfindPath($maze,$x,$y,$fromxy){

    global$_posArr;

    if($x==M&&$y==M){//到达出口

    Returnarray(array($x,$y));

    }

    foreach($_posArras$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;//能到达出口

    }

    }

    Returnfalse;

    }

    ?>

    上一篇:php检测url页面是否使用gzip压缩 下一篇:PHP用函数嵌入网站访问量计数器
    发布日期:2021/12/28
    手机扫二维码直达本页
    发布时间:13:44:09
    点击:294
    录入:齐天大圣
    相关文章
    Baidu
    YiJiaCMS 6.1.0.10988 Build 21.12.28(MSSQL) 闽ICP备05000814号-1
    本空间由腾讯云(轻量应用服务器)提供,百度云加速提供加速防护

    Copyright©2000-2022