0

私はコンウェイの人生ゲームを書いている最中ですが、セル座標 [36 ][22] から [36][24] まで。反復の私の更新方法は次のとおりです。

private void nextGeneration() {
    for (int i = 0; i < cell.length; i++) {
        for (int j = 0; j < cell[i].length; j++) {
            if(i>0 && i<79 && j>0 && j<99){
                if(cell[i][j].getAlive()){
                    cell[i][j].calcNeighbors(cell, i, j);
                    if(cell[i][j].getNeighbors() < 2){
                        cell[i][j].setAlive(false);
                    }
                    if(cell[i][j].getNeighbors() == 2 || cell[i][j].getNeighbors() == 3 && cell[i][j].getAlive()){
                        cell[i][j].setAlive(true);
                    }
                    if(cell[i][j].getNeighbors() > 3){
                        cell[i][j].setAlive(false);
                    }
                }
                else {
                    cell[i][j].calcNeighborsForNull(cell, i, j);
                    if (cell[i][j].getNeighborsForNull() == 3) {
                        cell[i][j].setAlive(true);
                    }
                }
            }
        }
    }
}

nextGeneration() は 1 秒ごとに呼び出され、 cell[][] はクラス Cell の配列です

このコードを使用してセルを検出します。

myNeighbors = 0;
        if(cell[i-1][j-1].myAlive){
            myNeighbors++;
            System.out.println("top left");
        }
        if(cell[i-1][j].myAlive){
            myNeighbors++;
            System.out.println("top center");
        }
        if(cell[i-1][j+1].myAlive){
            myNeighbors++;
            System.out.println("top right");
        }
        if(cell[i][j-1].myAlive){
            myNeighbors++;
            System.out.println("mid left");
        }
        if(cell[i][j+1].myAlive){
            myNeighbors++;
            System.out.println("mid right");
        }
        if(cell[i+1][j-1].myAlive){
            myNeighbors++;
            System.out.println("lower left");
        }
        if(cell[i+1][j].myAlive){
            myNeighbors++;
            System.out.println("lower center");
        }
        if(cell[i+1][j+1].myAlive){
            myNeighbors++;
            System.out.println("lower right");
        }
        System.out.println(myNeighbors +" at " + j + "," + -i);

コードを実行すると、次のコンソール出力が得られます。

top right
mid right
2 at 22,-36
top center
top right
mid left
mid right
4 at 23,-36
top left 
top center
2 at 24,-36
mid right
lower left
lower right
3 at 23,-35
mid left
lower center
2 at 24,-35
top right
1 at 22,-36
top left
top center
mid left
3 at 24,-36
mid right
lower center
lower right
3 at 23,-35

コンパイラは、ライブ セルの上にあるデッド セルもライブであると見なします。誰かが私が間違っていることを見ることができますか? ありがとう。

4

1 に答える 1

1

SetAlive メソッドの動作方法によっては、死んでいるはずのセルが実際には生きているように設定されている可能性があります。前学期の授業でライフ ゲームのシミュレーションを書かなければなりませんでしたが、そのコツは 2 つの「ボード」を使用することです。「ボード」全体が一度に更新されることになっているため、この方法を使用すると予期しない結果が生じる可能性があります。各セルを繰り返しますが、結果を 2 番目のボードに送信して、現在のステップでのセルの状態と次のステップでのセルの状態が重複しないようにします。テキストで説明するのはちょっと難しいですが、これがあなたの問題だと思うので、さらに助けが必要な場合はお知らせください.

于 2012-08-02T20:27:24.903 に答える