我正在使用 malloc'd 陣列作為 0 和 1 的網格來實作 Conway 的生命游戲,在任何地方0列印代表“死”單元格的白色背景空間,在任何地方1列印代表“活著”的黑色背景空間“ 細胞。
我在每個周期更新單元格時遇到了一些麻煩。我的方法是有一個getState()函式,它只檢查網格條目是否為0或1,然后相應地回傳一個值。我還有一個countN()通過網格計算數字的函式——考慮角、邊緣和中心的情況。我已經用幾個例子對它們進行了徹底的測驗,它們正在按照我的期望作業,對于給定的網格坐標,它總是回傳正確的狀態和存活鄰居的數量。
這就是我試圖做的(偽代碼):
void updateGrid(int **grid, int r, int c) {
copyGrid = grid;
for (i = 0; i < r; i )
for (j = 0; j < c; j ) {
alive->getState(grid, i, j)
neighbours->countN(grid, i, j)
if (alive) {
if (neighbour < 2 || neigbour > 3)
copyGrid[i][j] = 0;
else
copyGrid[i][j] = 1;
} else {
if (neighbour == 3)
copyGrid[i][j] = 1;
else
copyGrid[i][j] = 0;
}
}
grid = copyGrid;
printGrid(grid, r, c)
}
有一個簡單的呼叫函式,它只是從輸入檔案生成一個初始網格,清除螢屏,然后updateGrid()在每個周期后呼叫并休眠,直到一定數量的周期。初始網格是我期望的樣子,鄰居和活動函式回傳正確的值,但網格更新不正確,輸出非常失真。
例如,使用 1 和 0:
Input: Expected Output: Actual Output
0 0 0 0 1 0 0 1 1
1 1 1 0 1 0 1 0 1
0 0 0 0 1 0 0 0 0
任何提示將非常感謝!
uj5u.com熱心網友回復:
您將網格副本復制回的方法grid不起作用:copyGrid = grid;不grid = copyGrid;要這樣做,第一個會覆寫全域指標copyGrid,這會導致更新的單元格被寫入原始網格,第二個什么都不做,因為兩個指標都已經指向到同一個區域。
您必須洗掉該copyGrid = grid;陳述句。所有更新的單元格都被計算并存盤到copyGrid其中,因此無需復制原始單元格。一旦計算出新的一代,您必須將其復制回原來的grid:假設copyGrid具有相同的幾何形狀grid,一個指向整數陣列的r指標陣列c,您必須使用回圈來復制這個間接二維陣列。
另一種方法是使用 2 個全域陣列并在計算每一代后交換指標。
這是修改后的版本:
int **copyGrid; // assuming this pointer points to an allocated grid
void updateGrid(int **grid, int r, int c) {
// compute the new grid value in copyGrid
for (int i = 0; i < r; i ) {
for (int j = 0; j < c; j ) {
int alive = getState(grid, i, j);
int neighbours = countN(grid, i, j);
if (alive) {
if (neighbours < 2 || neighbours > 3)
copyGrid[i][j] = 0;
else
copyGrid[i][j] = 1;
} else {
if (neighbour == 3)
copyGrid[i][j] = 1;
else
copyGrid[i][j] = 0;
}
}
}
// copy the new grid value from copyGrid back to grid
for (int i = 0; i < r; i ) {
for (int j = 0; j < c; j ) {
grid[i][j] = copyGrid[i][j];
}
}
printGrid(grid, r, c);
}
uj5u.com熱心網友回復:
如果你寫copyGrid = grid你的副本將指向相同的記憶體位置,所以你實際上沒有副本。你必須使用
for(int i=0;i<r;i )
memcpy(copyGrid[i],grid[i],sizeof(int)*c)
這樣做的原因是您使用指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/489415.html
