2015-06-18 45 views
1

我一直在尋找這一段時間,迄今爲止重寫了三次代碼,這是我有什麼,我不明白。生活的遊戲,C檢查生活狀況

我有一種方法,通過各種打印線和我的跑步通過它檢查鄰域,這個工程。

int getLiveCellCount(Generation *currentGeneration, int i, int j) 
{ 
int liveCellCount = 0; 
// check top row 
if(i > 0) 
{ 
    if(j > 0 && currentGeneration->generation[i-1][j-1] == 'X') 
    { 
     liveCellCount++; 
    } 
    if(currentGeneration->generation[i-1][j] == 'X') 
    { 
     liveCellCount++; 
    } 
    if(j < currentCols && currentGeneration->generation[i-1][j+1] == 'X') 
    { 
     liveCellCount++; 
    } 

} 

// check mid row 
if(j > 0 && currentGeneration->generation[i][j-1] == 'X') 
{ 
    liveCellCount++; 
} 
if(j < currentCols && currentGeneration->generation[i][j+1] == 'X') 
{ 
    liveCellCount++; 
} 

// check bottom row 
if(i < currentRows) 
{ 
    if(j > 0 && universe[i+1][j-1] == 'X') 
    { 
     liveCellCount++; 
    } 
    if(currentGeneration->generation[i+1][j] == 'X') 
    { 
     liveCellCount++; 
    } 
    if(j < currentCols && currentGeneration->generation[i+1][j+1] == 'X') 
    { 
     liveCellCount++; 
    } 
} 

return liveCellCount; 
} 

我在其中的細胞生命或死亡,活細胞含有X和死細胞是空白的具體條件。

If the cell is alive: 
    it dies if it has 0, 1, 4 or more living neighbours (starvation), or 
    it lives if it has 2 or 3 living neighbours (balance). 
If the cell is dead: 
    it springs to life if it has exactly 3 neighbours (procreation). 

我實現的代碼如下:

for(i=0; i<currentRows; i++) 
     { 
      for(j=0; j<currentCols; j++) 
      { 
       int livingCells = 0; 
       livingCells = getLiveCellCount(currentGeneration, i,j); 
       if(universe[i][j] == 'X') 
       { 
        if(livingCells == 2 || livingCells == 3) 
        { 
         universe[i][j] = 'X'; 
        } 
        else 
        { 
         universe[i][j] = ' '; 
        } 
       } 
       else 
       { 
        if(livingCells == 3) 
        { 
         universe[i][j] = 'X'; 
        } 
       } 
      } 
     } 

要知道,universe[][]是一個文件範圍的變量,我這種想法的代碼讀取在初始狀態爲universe,這個工程。我將這個數組複製到一個結構數組中(稍後存儲並且當前註釋掉)。我掃描universe並檢查每個單元格是否存在於其鄰域中的活動單元格,其依據的是上述規則,並以逐個元素爲基礎編輯universe。 我在這裏遺漏了什麼?某處某個條件未被我正確讀取,我看不到它。

我想感謝大家給我的幫助!就像你提到的許多我看過的小細節,宇宙中的每個單元必須同時更新!正如我所提到的,我將Universe的當前狀態複製到結構中的二維數組中,並將其存儲在數組中以供將來使用,使用Universe的當前快照對單元計數進行計數,然後編輯完美的Universe!非常感謝!

+1

你應該包括一個小例子來說明你看到的問題。你應該考慮到你掃描桌子的方式會影響你的遊戲狀態。你同時殺死和復活細胞,所以一個細胞可能在x,y位置死亡,這會影響x + 1,j + 1是否存活或死亡,因爲當你到達第二個細胞時已經更新了x,y。它有一種單轉級聯效應。也許這就是你想要的。 –

+1

在'getLiveCellCount'中,你不能防止超出上限。 – ooga

+0

'getLiveCellCount'只能在我的for循環中調用,那些應該覆蓋上限? –

回答

4

我覺得你有兩個問題與您的代碼:

  1. 正如@ogga說在註釋中你是不是檢查在getlivecellcounts上限。在檢查i和j大於0時檢查了下限,但是您也需要對上限進行檢查(只檢查它是否大於數組的大小以檢查單元是否死活)。

  2. 在您的for循環中,我認爲您正在計算實時細胞計數。這種方法的問題是當你在某個單元格[x] [y]上並且它是活的並且它有一些z個鄰居時,你將它改變爲死單元格,然後移動到下一個單元格。這會給你在cell [x] [y + 1]處的鄰居數量不正確,因爲你已經將cell x y的狀態已經改變爲現在已經死亡並且還活着的新一代。

*更換單元應該在同一代中完成。

其他方式可以是你製作一個不同的二維數組,並保存新版本或新一代數據,然後在完成後複製到上一版本。這樣你就可以一次改變幾代人。

+0

如果我理解正確,我可以創建第二個2d數組來存儲當前的Universe狀態,掃描此數組,並基於單元格鄰居更新Universe中的單元格。然後重複。 –

+0

是的,這是有道理的。 – shunya

+0

謝謝你,在閱讀你的文章後,我回到了人生規則頁面,看到'第一代是通過同時將上述規則應用於種子中的每個細胞而創建的,因爲它會滿足這個條件。 –

0

在一般情況下,

1)檢查用於相鄰小區的狀態必須總是 檢查該被檢查的小區是2D陣列的邊界內。

2)相同的數組不能用於更新目標單元格的內容,因爲它可以改變某個鄰居單元格成爲目標單元格時的鄰居數量。解決方法是保留兩個二維數組,並在所有更新應用後使用指針切換到最新版本。

+0

所以這意味着我可以將宇宙複製到臨時二維數組中,掃描臨時數組並基於單元鄰域更新原始宇宙? –