Игра жизни (PHP) - не понимаю мой вывод
Итак, по сути, я писал этот PHP-скрипт Игры в жизнь. Мой вывод дурацкий, и я не могу в этом разобраться! Вся схема состоит из 2-мерного массива, называемого $world, в котором каждое значение соответствует ячейке с 2 состояниями, которая может быть 1 или 0 (живой или мертвый). У каждой ячейки есть 8 соседей. Правила для вычисления следующего состояния системы следующие:
- Если у вас есть 2-3 живых соседа (1), вы живы на следующем повороте.
- В противном случае вы мертв.
Моя реализация заключается в следующем:
(примечание: $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 такими состояниями. Правила, похоже, не такие правильное применение!
3 answers
В коде, который вы показываете, ничего не выглядит неправильно... вы могли бы объединить операторы if в одну, но все же незначительную деталь. Поэтому посмотрите и убедитесь, что значения $j_minus, $i_right и т.д. На самом деле соответствуют вашим ожиданиям. Убедитесь, что ни в коем случае не newworld = мир (здесь это выглядит не так, но мы не можем видеть цикл, в котором он живет, когда вы обновляете мир). Как и предлагалось, разработайте пример вручную, и вы должны увидеть, где ваша программа идет не так. Наконец убедитесь, что это это неправильный ответ... иногда жизнь застаивается в игре жизни.
Пройдите через это на бумаге и посмотрите, как это получается. Вы должны быть в состоянии определить после нескольких циклов, где он вычисляется неправильно.
С чисто читабельной точки зрения, я думаю, вам было бы лучше написать это так:
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.