3

つまり、基本的に、私はこの Game of Life PHP スクリプトを書いてきました。私の出力はおかしくて、私はそれを理解することはできません! スキーム全体は $world と呼ばれる 2 次元配列で構成され、各値は 1 または 0 (生きているか死んでいるか) の 2 状態のセルに対応します。各セルには 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 ある間の振動です。ルールが正しく適用されていないようです。

4

3 に答える 3

3

紙の上を歩いて、それがどのようになっているのかを見てください。数回ループすると、正しく計算されていない場所がわかります。

于 2011-12-13T22:45:28.097 に答える
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_plusetc 変数をどのように作成したかを示していないため、問題が何であるかを正確に伝えることはできません。

于 2011-12-13T22:56:11.453 に答える
1

コードでは、何も問題がないように見えます... if ステートメントを 1 つにまとめることができますが、それでも詳細はわかりません。したがって、$j_minus、$i_right などの値が実際に期待どおりであることを確認してください。どの時点でも newworld = world になっていないことを確認してください (ここではそのようには見えませんが、world を更新する場所に存在するループは見えません)。提案されているように、手で例を作成すると、プログラムがどこでうまくいかないかがわかります。最後に、これが正しい答えではないことを確認してください...人生のゲームでは、人生が停滞することがあります。

于 2011-12-13T22:54:52.983 に答える