0

これが正しい方法であるかどうかはわかりません。すべての「静物」セル配置で機能するコードを作成しました。ビーハイブ、ブロック、ボート、ローフ。しかし、細胞の死と誕生を伴う操作を想定したアレンジには問題があります。

現在、最初にセルを作成してから、ルールに該当するセルをすべて削除しています (周囲の隣接セルの合計が 1 以下、4 以上の場合)。

私が今行っていることは、想定どおりに機能しません。コードの下にいくつかの画像を含めます。

public class Untitled {
    public static void main(String[] params){
        Life life = new Life();
        String[][] list = life.readGame();

        life.print(list);
        System.out.println();

        for(int i = 1; i <= 5; i++){
            list = life.run(list);
            life.print(list);
            System.out.println();
        }
    }
}

class Life {
    public String[][] readGame(){
        String[][] array = {
                { "-","-", "-", "-", "-", "-","-"},
                { "-","-", "-", "-", "-", "-","-"},
                { "-","-", "-", "x", "-", "-","-"},
                { "-","-", "-", "x", "-", "-","-"},
                { "-","-", "-", "x", "-", "-","-"},
                { "-","-", "-", "-", "-", "-","-"},
                { "-","-", "-", "-", "-", "-","-"}
        };
        return array;
    }

    public void print(String[][] array){
        for(int x = 0; x < array.length; x++){
            for(int y = 0; y < array[x].length; y++){
                System.out.print(array[x][y]);
            }
            System.out.println();
        }
    }

    public String[][] run(String[][] array){
        populateCells(array);
        System.out.println("Populated:\n");
        print(array);
        killCells(array);
        System.out.println("Killed:\n");
        print(array);
        return array;
    }

    public int amountOfNeighbors(String[][] array, int x, int y){
        int amount = 0;

        for(int x1 = -1; x1 <= 1; x1++){
            if(x + x1 >= 0 && x + x1 < array.length){
                for(int y1 = -1; y1 <= 1; y1++){
                    if(y + y1 >= 0 && y + y1 < array[x1 + x].length){
                        if(!(x1 == 0 && y1 == 0) && !array[x1 + x][y1 + y].equals("-")){ 
                            amount++;
                        }
                    }
                }
            }
        }
        return amount;
    }

    public void populateCells(String[][] array){
        int neighbours;

        for(int x = 0; x < array.length; x++){
            for(int y = 0; y < array[x].length; y++){
                neighbours = amountOfNeighbors(array,x,y);

                if(neighbours == 3){
                    array[x][y] = "x";
                }
            }
        }
    }

    public void killCells(String[][] array){
        int neighbours;

        for(int x = 0; x < array.length; x++){
            for(int y = 0; y < array[x].length; y++){
                neighbours = amountOfNeighbors(array,x,y);

                if(neighbours <= 1 || neighbours >= 4){
                    array[x][y] = "-";
                }
            }
        }
    }
}

画像に関しては、単純なブリンカー構造と、セルの作成と削除の後に何が起こるかを次に示します。

1

2

3

4

1 に答える 1

4

呼び出すたびrun()に、元のボードのコピーを作成し、元のボードのセルを変更するときにそのコピーを使用して各セルの状態を確認する必要があります。

そうしないと、セルを更新するたびに、その周りのセルの状態が誤って変更されてしまいます。

これは、Game of Life のようなゲーム ボードが関係するシミュレーションではかなり一般的なバグです。

于 2013-02-20T21:27:45.397 に答える