簡體   English   中英

康威的生命游戲問題更新板

[英]Conway's Game of Life issue updating board

所以我正在為學校開發一個assignmmnet,它涉及在程序集中編寫這個更新函數以使用給我們的C代碼。 它只是Conway生命游戲的一個簡單版本,可生成隨機電路板配置,然后根據規則使用新值進行更新。 我想我會先用C編寫函數,所以我知道在匯編時要做什么。 我遇到了一些困難,我認為這些困難源於沒有完全理解雙指針在C中是如何工作的。有些地方在給我們的代碼中,生命游戲的主板使用如下的malloc調用初始化:

int **board;
board = malloc(sizeof(int *) * height);
for(i = 0; i < height; i++){
    board[i] = malloc(sizeof(int) * width);
}

每個單元格如果存活則給定1或者如果它已經死亡則為0。

現在我們應該寫的更新函數將** board作為參數。 我只使用常規二維數組,但如果我正確理解它,那么這個雙指針的行為應該類似於二維數組。 無論如何這里是我寫的c代碼:

void update(int **board, int width, int height)
{
int neighborCount = 0; //keeps count of live neighbors
int row = 0;
int col;

int tempBoard[height][width]; //holds updated board temporarily

for(; row < height; row++)
{
    col = 0;

    for(; col < width ; col++)
    {
        //If tests to check if out of bounds.  If not than adds value of cell
        //to neighbor count.  Continues for each possible neighbor
        if ((row - 1) >= 0 && (col - 1) >= 0)
        {
            neighborCount = neighborCount + board[row - 1][col - 1];
        }
        if ((row - 1) >= 0)
        {
            neighborCount = neighborCount + board[row - 1][col];
        }
        if ((row - 1) >= 0 && (col + 1) < width)
        {
            neighborCount = neighborCount + board[row - 1][col + 1];
        }
        if ((col - 1) >= 0)
        {
            neighborCount = neighborCount + board[row][col - 1];
        }
        if ((col + 1) < width)
        {
            neighborCount = neighborCount + board[row][col + 1];
        }
        if ((row + 1) < height && (col - 1) >= 0)
        {
            neighborCount = neighborCount + board[row + 1][col - 1];
        }
        if ((row + 1) < height)
        {
            neighborCount = neighborCount + board[row + 1][col];
        }
        if ((row + 1) < height && (col + 1) < width)
        {
            neighborCount = neighborCount + board[row + 1][col + 1];
        }

        //save new value in temp board based on neighbor count
        if (board[row][col] == 1)
        {
            if (neighborCount == 2 || neighborCount == 3)
            {
                tempBoard[row][col] = 1;
            }
            else
            {
                tempBoard[row][col] = 0;
            }
        }
        else
        {
            if (neighborCount == 3)
            {
                tempBoard[row][col] = 1;
            }
            else
            {
                tempBoard[row][col] = 0;
            }
        }

        neighborCount = 0;
    }
}

//update board with new values from temp board
for(; row < height; row++)
{
    for(; col < width ; col++)
    {
        board[row][col] = tempBoard[row][col];
    }
}

}

我的問題是在函數結束時,我試圖用我在tempBoard中保存的新值更新**板中的值。 我確定這是我對雙指針的理解不足,但是我無法弄清楚為什么當我從函數返回后重新打印自己時,它與原始狀態相同。 我猜我只是更新**板的本地副本,當我退出我的功能時我失去了我的更改,但我完全迷失了我應該如何確保我的更改在此之外被看到功能。

我會非常感激任何幫助,我一直在盡我所能來解決這個問題,但我現在只是堅持做什么。 如果您需要我的信息,請告訴我。

rowcol正在兩個不同的循環中使用,並且它們的值不會在循環之間重置。 因此,當您將臨時板復制到主板時, row已經等於height並且循環立即中斷。

這樣做:

//update board with new values from temp board
for(row = 0; row < height; row++)
{
    for(col = 0; col < width ; col++)
    {
        board[row][col] = tempBoard[row][col];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM