1

John Conway の Game of Life に基づいたプログラムを書いています。何日もノンストップで作業した後、コンパイルして実行することさえできました。しかし、それが印刷している結果は間違っています...

これは私のコードです(メインメソッドは含まれていません)

 //clears the grid
public static void clearGrid ( boolean[][] grid )
{

    for(int row = 0; row < 18; row++){
       for(int col = 0; col < 18; col++){
          grid[row][col]= false;
       }
    }
    //set all index in array to false
}

//generate the next generation
public static void genNextGrid ( boolean[][] grid )
{
    int n; //number of neighbors

    boolean[][] TempGrid = grid;// a temporary array
    for(int row = 0; row < 18; row++)
    {
        for(int col = 0; col < 18; col++)
        {
            TempGrid[row][col] = grid[row][col];
            n = countNeighbors(grid, row, col);

            if(grid[row][col] == true)
            {
                if(n != 2 && n != 3)
                {
                    TempGrid[row][col] = false;
                }
                else
                    TempGrid[row][col] = true;
            }

            else
            {
                if(n == 3)
                {
                    TempGrid[row][col] = true;
                }
                else
                    TempGrid[row][col] = false;
            }
            grid[row][col] = TempGrid[row][col];
        }
    }
}

 //count how many neighbors surrounding any speicific cell
public static int countNeighbors ( final boolean[][] grid, final int row, final int col )
{
    int n = 0;
    for (int TempRow = row - 1; TempRow <= row + 1; TempRow++)
    {
        if (TempRow >= 0 && TempRow < 18)
        {
            for (int TempCol = col - 1; TempCol <= col + 1; TempCol++)
            {
                if (TempCol >= 0 && TempCol < 18 && (TempRow != row || TempCol != col))
                {
                    if (grid[TempRow][TempCol])
                    {
                        n++;
                    }
                }
            }
        }
    }
    return n;
 }

私のgenNextGridメソッド内で問題が発生していると確信しています。

課題シート付属

public static void genNextGrid (boolean[][] grid);

このメソッドは、実際に次世代のシミュレーションを生成します。「現在の」世代として渡される 2 次元配列グリッドを使用する必要があります。「次の」世代を保持する 2 番目の一時的な 2 次元配列を作成する必要があります。次世代をうまく作成するために必要なすべての情報を失う危険性があるため、現在のマトリックスに変更を加えることはできないため、作業するにはこの一時的なマトリックスを作成する必要があります。」

  1. 一時配列を作成しました
  2. 現在の配列を一時的にコピーしました
  3. 命令が言ったように、後で一時を現在の配列にコピーしました。

だから私は何が間違っていたのかよくわかりません。

もうすぐ午前 3 時です。正午から Vim の画面を見つめています。どんな助けでも大いに感謝します。

4

3 に答える 3

5
boolean[][] TempGrid = grid;

同じ配列を別の名前で使用します。代わりに、新しいメモリを割り当てる必要があります。コードを見ると、これでうまくいくはずです。

boolean TempGrid = new boolean[18][18];

18(ただし、これらを定数に置き換えた方がはるかに良いでしょう)

于 2012-12-12T08:31:41.970 に答える
4

最も明白な問題は次のとおりです。

  boolean[][] TempGrid = grid;// a temporary array

TempGridを指すだけgridです。別の配列を作成する必要があります。

  boolean[][] TempGrid = new boolean[18][18];
于 2012-12-12T08:32:41.130 に答える
3

他の回答で述べたように、新しい一時配列を実際に作成するのではなく、古い配列への参照を取得するだけでなく、セルを計算した同じループ内tempGridのセルにコピーします。gridしたがって、次のループの反復では、グリッド内の現在の「古い」値ではなく、新しく計算された値が使用されます。

tempGrid最初に全体を計算してから、それをコピーする必要がありますgrid。または、コピーするよりも、グリッドを tempGrid の配列を指すように設定することをお勧めしますが、それは宿題の範囲外である可能性があります (元のグリッド参照から戻って割り当てる必要があります) tempGridgenNextGrid()

単一の一時セルだけでなく、次の世代の計算中にtempGrid前の世代が必要になるということです。grid

于 2012-12-12T08:36:24.793 に答える