2016-11-04 49 views
-1

再次解決康威的生命遊戲。平面方法工作得很好。這是非常困擾我的環形方法。我一直在審查我的代碼幾個小時了,但我找不到任何gliches。我將發佈兩個函數來計算我們數組中每個元素的鄰居數量。該數組是一個具有兩個字段的結構:Val(當前值)和Next(下一個值,取決於元素所具有的鄰居數量)。 我也應該說,每個函數都會評估位於第一行和第一行以及第一列和最後一列(包括邊)的元素。 感謝所有審閱此代碼的人,我知道這並不簡單。康威生命的遊戲 - 環形的方法 - 邊緣和角落

void verifica_lin(int i,int j,int n,int m,int &cnt,matrice a[MAX][MAX]){ 
    if(i==1){ 
     if(j==1){ 
      if(a[i+1][j].Val==1) 
       ++cnt; 
      if(a[i+1][j+1].Val==1) 
       ++cnt; 
      if(a[2][m].Val==1) 
       ++cnt; 
      if(a[n][1].Val==1) 
       ++cnt; 
      if(a[n][2].Val==1) 
       ++cnt; 
      if(a[n][m].Val==1) 
       ++cnt; 
      if(a[1][m].Val==1) 
       ++cnt; 
      if(a[i][j+1].Val==1) 
       ++cnt; 
     } 
     else 
      if(j==m){ 
       if(a[i+1][j].Val==1) 
        ++cnt; 
       if(a[1][2].Val==1) 
        ++cnt; 
       if(a[i+1][j-1].Val==1) 
        ++cnt; 
       if(a[n][m].Val==1) 
        ++cnt; 
       if(a[n][1].Val==1) 
        ++cnt; 
       if(a[n][m-1].Val==1) 
        ++cnt; 
       if(a[i][j-1].Val==1) 
        ++cnt; 
       if(a[1][1].Val==1) 
        ++cnt; 
      } 
      else{ 
       if(a[i+1][j].Val==1) 
        ++cnt; 
       if(a[i+1][j+1].Val==1) 
        ++cnt; 
       if(a[i+1][j-1].Val==1) 
        ++cnt; 
       if(a[n][j].Val==1) 
        ++cnt; 
       if(a[n][j+1].Val==1) 
        ++cnt; 
       if(a[n][j-1].Val==1) 
        ++cnt; 
       if(a[i][j-1].Val==1) 
        ++cnt; 
       if(a[i][j+1].Val==1) 
        ++cnt; 
      } 
    } 
    else 
     if(i==n){ 
      if(j==1){ 
       if(a[1][1].Val==1) 
        ++cnt; 
       if(a[1][2].Val==1) 
        ++cnt; 
       if(a[1][m].Val==1) 
        ++cnt; 
       if(a[i-1][j].Val==1) 
        ++cnt; 
       if(a[i-1][j+1].Val==1) 
        ++cnt; 
       if(a[n-1][m].Val==1) 
        ++cnt; 
       if(a[n][m].Val==1) 
        ++cnt; 
       if(a[i][j+1].Val==1) 
        ++cnt; 
      } 
      else 
       if(j==m){ 
        if(a[1][m].Val==1) 
         ++cnt; 
        if(a[1][1].Val==1) 
         ++cnt; 
        if(a[1][m-1].Val==1) 
         ++cnt; 
        if(a[i-1][j].Val==1) 
         ++cnt; 
        if(a[n-1][m].Val==1) 
         ++cnt; 
        if(a[i-1][j-1].Val==1) 
         ++cnt; 
        if(a[i][j-1].Val==1) 
         ++cnt; 
        if(a[n][1].Val==1) 
         ++cnt; 
       } 
       else{ 
        if(a[1][j].Val==1) 
         ++cnt; 
        if(a[1][j+1].Val==1) 
         ++cnt; 
        if(a[1][j-1].Val==1) 
         ++cnt; 
        if(a[i-1][j].Val==1) 
         ++cnt; 
        if(a[i-1][j+1].Val==1) 
         ++cnt; 
        if(a[i-1][j-1].Val==1) 
         ++cnt; 
        if(a[i][j-1].Val==1) 
         ++cnt; 
        if(a[i][j+1].Val==1) 
         ++cnt; 
       } 
     } 
    if(a[i][j].Val==1){ 
     if(cnt==2||cnt==3) 
      a[i][j].Next=1; 
     else 
      if(cnt==0||cnt>3) 
       a[i][j].Next=0; 
    } 
    else 
     if(cnt==3) 
      a[i][j].Next=1; 
} 
void verify_col(int i,int j,int n,int m,int &cnt,matrice a[MAX][MAX]){ 
    if(j==1){ 
     if(i==1){ 
      if(a[i+1][j].Val==1) 
       ++cnt; 
      if(a[i+1][j+1].Val==1) 
       ++cnt; 
      if(a[2][m].Val==1) 
       ++cnt; 
      if(a[n][1].Val==1) 
       ++cnt; 
      if(a[n][2].Val==1) 
       ++cnt; 
      if(a[n][m].Val==1) 
       ++cnt; 
      if(a[1][m].Val==1) 
       ++cnt; 
      if(a[i][j+1].Val==1) 
       ++cnt; 
     } 
     else 
      if(i==n){ 
       if(a[1][1].Val==1) 
        ++cnt; 
       if(a[1][2].Val==1) 
        ++cnt; 
       if(a[1][m].Val==1) 
        ++cnt; 
       if(a[i-1][j].Val==1) 
        ++cnt; 
       if(a[i-1][j+1].Val==1) 
        ++cnt; 
       if(a[n-1][m].Val==1) 
        ++cnt; 
       if(a[n][m].Val==1) 
        ++cnt; 
       if(a[i][j+1].Val==1) 
        ++cnt; 
      } 
      else{ 
       if(a[i+1][j].Val==1) 
        ++cnt; 
       if(a[i+1][j+1].Val==1) 
        ++cnt; 
       if(a[i+1][m].Val==1) 
        ++cnt; 
       if(a[i-1][j].Val==1) 
        ++cnt; 
       if(a[i-1][j+1].Val==1) 
        ++cnt; 
       if(a[i-1][m].Val==1) 
        ++cnt; 
       if(a[i][m].Val==1) 
        ++cnt; 
       if(a[i][j+1].Val==1) 
        ++cnt; 
      } 
    } 
    else 
     if(j==m){ 
      if(i==1){ 
       if(a[i+1][j].Val==1) 
        ++cnt; 
       if(a[1][2].Val==1) 
        ++cnt; 
       if(a[i+1][j-1].Val==1) 
        ++cnt; 
       if(a[n][m].Val==1) 
        ++cnt; 
       if(a[n][1].Val==1) 
        ++cnt; 
       if(a[n][m-1].Val==1) 
        ++cnt; 
       if(a[i][j-1].Val==1) 
        ++cnt; 
       if(a[1][1].Val==1) 
        ++cnt; 
      } 
      else 
       if(i==n){ 
        if(a[1][m].Val==1) 
         ++cnt; 
        if(a[1][1].Val==1) 
         ++cnt; 
        if(a[1][m-1].Val==1) 
         ++cnt; 
        if(a[i-1][j].Val==1) 
         ++cnt; 
        if(a[n-1][m].Val==1) 
         ++cnt; 
        if(a[i-1][j-1].Val==1) 
         ++cnt; 
        if(a[i][j-1].Val==1) 
         ++cnt; 
        if(a[n][1].Val==1) 
         ++cnt; 
       } 
       else{ 
        if(a[i+1][j].Val==1) 
         ++cnt; 
        if(a[i+1][1].Val==1) 
         ++cnt; 
        if(a[i+1][j-1].Val==1) 
         ++cnt; 
        if(a[i-1][j].Val==1) 
         ++cnt; 
        if(a[i-1][1].Val==1) 
         ++cnt; 
        if(a[i-1][j-1].Val==1) 
         ++cnt; 
        if(a[i][j-1].Val==1) 
         ++cnt; 
        if(a[i][1].Val==1) 
         ++cnt; 
       } 
     } 
    if(a[i][j].Val==1){ 
     if(cnt==2||cnt==3) 
      a[i][j].Next=1; 
     else 
      if(cnt==0||cnt>3) 
       a[i][j].Next=0; 
    } 
    else 
     if(cnt==3) 
      a[i][j].Next=1; 
} 
+0

刪除C標記,這不是有效的C代碼 – UnholySheep

+0

也請使用調試器,因爲這是太多的代碼找出具體的問題。 (更不用說,你沒有指定什麼問題,你有編譯器錯誤,運行時崩潰,錯誤的結果,...) – UnholySheep

+0

只是nitpicking:它是_matrix_單數和_matrices_複數,所以_matrice_是不正確的。 – ForceBru

回答

1

環形方法類似於平面方法,但允許數組索引包裹,以便「滑翔機」將從一個邊緣出現並出現在另一側。您必須首先計算所需的數組索引,然後進行模數計算,這也可用於負指數。例如

index = i - 1; 
index = (index + DIMENSION) % DIMENSION; 

編輯:你說「我知道這不是那麼簡單」,但僅僅是因爲你把它很難。你並不需要所有這些不同組的條件下,所有8個鄰居可以做同樣的方式,很簡單,比如這條線

if(a[i+1][j-1].Val == 1) 

我會作出這樣的

if(a[(i + 1) % YDIM] [(j - 1 + XDIM) % XDIM].Val == 1) 

,因此只有8需要測試,而不是您擁有的大量不同的條件。注意:您只需在添加DIMENSION之前取模數,您已扣除。

繼續前進,您的代碼將被所有這些分支放慢。在添加1之前,您不需要測試單元是否爲1。如果單元格內容是01,您只需添加它即可。

cnt += a[(i + 1) % YDIM] [(j - 1 + XDIM) % XDIM].Val;