Игра жизни (PHP) - не понимаю мой вывод


Итак, по сути, я писал этот PHP-скрипт Игры в жизнь. Мой вывод дурацкий, и я не могу в этом разобраться! Вся схема состоит из 2-мерного массива, называемого $world, в котором каждое значение соответствует ячейке с 2 состояниями, которая может быть 1 или 0 (живой или мертвый). У каждой ячейки есть 8 соседей. Правила для вычисления следующего состояния системы следующие:

  1. Если у вас есть 2-3 живых соседа (1), вы живы на следующем повороте.
  2. В противном случае вы мертв.

Моя реализация заключается в следующем: (примечание: $j_minus, $i_plus, etc относится к $j-1, etc, но учитывает края)

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 такими состояниями. Правила, похоже, не такие правильное применение!

Author: rocketas, 2011-12-14

3 answers

В коде, который вы показываете, ничего не выглядит неправильно... вы могли бы объединить операторы if в одну, но все же незначительную деталь. Поэтому посмотрите и убедитесь, что значения $j_minus, $i_right и т.д. На самом деле соответствуют вашим ожиданиям. Убедитесь, что ни в коем случае не newworld = мир (здесь это выглядит не так, но мы не можем видеть цикл, в котором он живет, когда вы обновляете мир). Как и предлагалось, разработайте пример вручную, и вы должны увидеть, где ваша программа идет не так. Наконец убедитесь, что это это неправильный ответ... иногда жизнь застаивается в игре жизни.

 1
Author: hackartist, 2011-12-13 22:54:52

Пройдите через это на бумаге и посмотрите, как это получается. Вы должны быть в состоянии определить после нескольких циклов, где он вычисляется неправильно.

 3
Author: Catfish, 2011-12-13 22:45:28

С чисто читабельной точки зрения, я думаю, вам было бы лучше написать это так:

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 etc.

 3
Author: DaveRandom, 2011-12-13 22:56:11