首页 > 解决方案 > 带循环的 PHP 迷宫生成器

问题描述

我有关于创建迷宫生成器的问题

我有变量 $num = 5,我想要这样的输出:

@ @@@
@   @
@@@ @
@   @
@ @@@

我已经在尝试解决我的问题和这样的输出:

@ @@@
@   @
@@@ @
@   @
@@@ @

如何像我想要的那样使输出正确?我已经像这样在 php 上写了 scipt:

<?php

$num        = 5;
$space      = $num - 2;
$end        = $num - 1;
$left       = true;
$mid        = false;
$right      = false;
$leftCount  = 1;
$rightCount = 0;

for ($i = 0; $i < $num; $i++)
{
    for ($j = 0; $j < $num; $j++)
    {
        if ($left) {
            $line = ($i % 2 == 0 && $j == 1) ? "&nbsp;&nbsp; ":" 1 ";

            ($j == $end) ? $left = false:$mid = true;
            $leftCount  = 0;
            $rightCount = 1;

            echo $line;
        }
        else if ($mid)
        {
            $line = (($i % 2 == 1 && $j == 0) || ($i % 2 == 1 && $j == $end)) ? " 2 ":"&nbsp;&nbsp; ";
            ($j == $end) ? $mid = false:"";
            ($rightCount > $leftCount) ? $right = true:$left = false;
            
            echo $line;
        }
        else if ($right)
        {
            $line = ($i % 2 == 0 && $j == $space) ? "&nbsp;&nbsp; ":" 3 ";

            ($j == $end) ? $mid = true:"";
            $rightCount = 0;
            $leftCount  = 1;

            echo $line;
        }
    }
    echo "<br>";
}

请需要帮助来改进我的代码,这样我就可以像第一个输出一样打印

标签: php

解决方案


它似乎有很多代码基本上可以做三件事,把它分解。

  • 画一条有一个孔的线

    • 选择孔所在的位置rand(1, max-1)
    • 用墙填充其余部分
  • 在交错线上没有墙

    • 用空白空间填充所有内容
  • 包围外墙

    • 是第一个还是最后一个

加入所有行/数组并输出。

例子:

<?php
$maze = [];
for($i=0; $i<=8; $i++) {
    $hole = rand(1, 6);
    $line = [];
    for ($ii=0; $ii<8; $ii++)
        $line[] = $ii === 0 || $ii === 7 ? '@' : ($ii === $hole || $i % 2 ? ' ' : '@');
    $maze[] = join($line).PHP_EOL;
}
echo join($maze);

输出:

@@@@@ @@
@      @
@@@ @@@@
@      @
@@@@@ @@
@      @
@@@ @@@@
@      @
@@@@@@ @

https://3v4l.org/XrWbE

如果$hole = $i % 4 ? 6 : 1;您希望孔与您的示例一样位于同一位置,请使用。

@ @@@@@@
@      @
@@@@@@ @
@      @
@ @@@@@@
@      @
@@@@@@ @
@      @
@ @@@@@@

编辑:

现在改为5

https://3v4l.org/jTbeI

@ @@@
@   @
@@@ @
@   @
@ @@@

推荐阅读