Game of Life (PHP) - не понимаю мой вывод - PullRequest
3 голосов
/ 14 декабря 2011

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

Ответы [ 3 ]

3 голосов
/ 14 декабря 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 и т. Д.

3 голосов
/ 14 декабря 2011

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

1 голос
/ 14 декабря 2011

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

...