3

所以,基本上,我一直在编写这个 Game of Life PHP 脚本。我的输出很古怪,我无法弄清楚!整个方案由一个名为 $world 的二维数组组成,其中每个值对应于一个 2 状态单元格,该单元格可以是 1 或 0(活着或死去)。每个单元格有 8 个邻居。计算系统下一个状态的规则如下:

  1. 如果您有 2-3 个活着的邻居(1 个),那么您在下一回合还活着。
  2. 否则你就死定了。

我的实现如下:(注意:$j_minus,$i_plus等指的是$j-1, 等但考虑到边缘)

for($i=0;$i<$size;$i++)
{ 
    for($j=0;$j<$size;$j++) 
    {

            if( ($world[$j_minus][$i] + $world[$j_plus][$i] + $world[$j][$i_minus] + $world[$j][$i_plus]+$world[$j_minus][$i_minus]+$world[$j_minus][$i_plus]+$world[$j_plus][$i_minus]+$world[$j_plus][$i_plus]) > 3 )
            {
                $new_world[$j][$i]=0;

            }

            else if( ($world[$j_minus][$i] + $world[$j_plus][$i] + $world[$j][$i_minus] + $world[$j][$i_plus]+$world[$j_minus][$i_minus]+$world[$j_minus][$i_plus]+$world[$j_plus][$i_minus]+$world[$j_plus][$i_plus])>= 2 )
            {
                $new_world[$j][$i]=1;

            }
            else {$new_world[$j][$i]=0;}
        }

}

应用这些规则后,使 $new_world 成为系统的新状态,我将数组打印到屏幕上:

for($i=0;$i<$size;$i++)
{ 
    for($j=0;$j<$size;$j++) 
    {

        echo $new_world[$i][$j]." ";
    }
        echo "</p>";
}

无论 的初始状态如何,我得到的$world要么是充满线条和大块的完全停滞状态,要么是 2-3 个此类状态之间的振荡。规则似乎没有正确应用!

4

3 回答 3

3

在纸上浏览它,看看结果如何。您应该能够在几个循环后知道它没有正确计算的地方。

于 2011-12-13T22:45:28.097 回答
3

从纯粹的可读性的角度来看,我认为你最好这样写:

for ($i=0; $i < $size; $i++) {

    for ($j = 0; $j < $size; $j++) {

        $liveNeighbours = $world[$j_minus][$i]
                        + $world[$j_plus][$i]
                        + $world[$j][$i_minus]
                        + $world[$j][$i_plus]
                        + $world[$j_minus][$i_minus]
                        + $world[$j_minus][$i_plus]
                        + $world[$j_plus][$i_minus]
                        + $world[$j_plus][$i_plus];

        if ($liveNeighbours == 2 || $liveNeighbours == 3) {
            $new_world[$j][$i] = 1;
        } else {
            $new_world[$j][$i] = 0;
        }

    }

}

正确地间隔代码可以极大地帮助您发现逻辑中的错误。我不能确切地告诉你问题出在哪里,因为你没有向我们展示你是如何创建$j_plusetc 变量的。

于 2011-12-13T22:56:11.453 回答
1

在代码中,您没有显示任何错误......您可以将 if 语句组合成一个但仍然是次要的细节。因此,查看并确保 $j_minus、$i_right 等值实际上是您所期望的。确保在任何时候都不是 newworld = world (这里看起来不像,但我们看不到它存在于你更新世界的循环中)。正如建议的那样,手工制作一个例子,你应该看到你的程序哪里出错了。最后确保这不是正确的答案……有时生活在生活的游戏中停滞不前。

于 2011-12-13T22:54:52.983 回答