【问题标题】:Temporary Array [closed]临时阵列[关闭]
【发布时间】:2012-11-29 21:56:48
【问题描述】:

我正在编写一个基于 John Conway 的生命游戏的程序。经过几天的不间断工作,我得到了编译甚至运行。但是,它打印出来的结果是错误的……

这是我的代码(不包括main方法)

 //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);

这种方法实际上会生成下一代的模拟。 它应该使用作为“当前”代传递给它的二维数组网格。它应该创造第二个, 将保存“下一代”的临时二维数组。您将需要创建这个临时矩阵才能工作 因为您无法更改当前矩阵,因为您可能会丢失所需的所有信息 为了成功地创造下一代。”

  1. 我创建了一个临时数组
  2. 我将当前数组复制到临时数组
  3. 我后来像指令所说的那样将临时复制回当前数组。

所以我不太确定我做错了什么。

已经快凌晨 3 点了,从中午开始一直盯着我的 Vim 屏幕。任何帮助将不胜感激。

【问题讨论】:

  • 一目了然,正确地遵循 Java 的命名约定。 TempGrid 应该是 tempGrid。
  • “已经快凌晨 3 点了,从中午一直盯着 Vim 屏幕。” 起床时别忘了加个问题。 ;)

标签: java arrays conways-game-of-life


【解决方案1】:

除了没有真正创建一个新的临时数组,而只是获取对旧临时数组的引用,正如其他答案中所说:您将tempGrid 单元格复制到您计算它的同一循环中的grid 单元格中。所以下一次循环迭代将使用新的计算值,而不是网格中当前的“旧”值。

您需要先计算整个tempGrid,然后将其复制到grid。或者比复制更好,将网格设置为指向 tempGrid 的数组,但这可能超出了您的作业范围(您必须从 genNextGrid() 返回 tempGrid 并将其分配给原始网格参考)。

需要tempGrid 而不仅仅是单个临时单元格的全部意义在于,在计算下一代时需要grid 中的上一代。

【讨论】:

  • @Amadan 请参阅genNextGrid 的内循环中的grid[row][col] = TempGrid[row][col]; 行(当然对于有问题的原始代码,grid 和 tempGrid 引用了相同的数组,这是一个无操作)。跨度>
  • 哦,对了,我以为你在谈论 if 之前的不必要的分配。补偿+1! :)
  • 耶!!!现在让它工作。看来我只需要睡个好觉就可以再次清晰地思考。谢谢大家。
【解决方案2】:

最明显的问题在这里:

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

TempGrid 只是指向grid。您需要创建一个单独的数组:

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

【讨论】:

【解决方案3】:
boolean[][] TempGrid = grid;

将使用相同的数组,只是名称不同。您必须分配一些新内存。查看您的代码,这应该可以解决问题:

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

(如果你用常量替换那些18s 会更好)

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2020-07-17
    • 2023-01-27
    相关资源
    最近更新 更多