生命游戏(PHP) - 不理解我的输出

时间:2011-12-13 22:41:39

标签: php rules conways-game-of-life

所以,基本上,我一直在写这个生命游戏PHP脚本。我的输出很糟糕,我无法理解! 整个方案由一个名为$ world的二维数组组成,其中每个值对应一个2状态单元,可以是1或0(活着或死亡)。每个小区有8个邻居。 计算系统下一个状态的规则如下:

  1. 如果你有2-3个活着的邻居(1个),那么你下个回合就会活着。
  2. 否则你已经死了。
  3. 我的实施如下: (注意:$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个这样的状态之间的振荡。规则似乎没有正确应用!

3 个答案:

答案 0 :(得分:3)

在纸上走过去看看它是如何发展的。您应该能够在几个循环之后判断它没有正确计算。

答案 1 :(得分: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_plus等变量。

答案 2 :(得分:1)

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