Game of Life (PHP) - не понимаю мой вывод

Итак, в основном, я писал PHP-скрипт Game of Life. Мой вывод не работает, и я не могу понять это! Вся схема состоит из двумерного массива $world, в котором каждое значение соответствует ячейке с двумя состояниями, которая может быть 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 такими состояниями. Правила, кажется, не применяются правильно!


person rocketas    schedule 13.12.2011    source источник


Ответы (3)


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

person hackartist    schedule 13.12.2011
comment
Всем большое спасибо за советы. Очень признателен! - person rocketas; 14.12.2011

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

person Catfish    schedule 13.12.2011

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

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.

person DaveRandom    schedule 13.12.2011