2013-05-21 23 views
1

我正在研究一個元胞自動機,其中發生變化的每一輪。顯然,我爲它做了一個循環 - 幸運的是,它基本上是有效的,但如果我想在地圖上添加另一種類型的單元格,一種單元格可以工作,但另一種單元格不起作用:遊戲開始並且例如在這個例子中,康威自動機開始增長,但紅色測試單元只是沒有任何改變。調用的函數清除前一個的變化

#define fldwidth 110 
#define fldheight 140 

typedef struct tiles 
{ 
    unsigned char red, green, blue; 
}tiles; 

const tiles TEST_ALIVE = {255,0,0}; 
const tiles TEST_DEAD = {50,0,0}; 
const tiles CONWAY_ALIVE = {0,255,0}; 
const tiles CONWAY_DEAD = {0,50,0}; 

//Maes módszere a struktúrák egyenlőségének vizsgálatára 
bool equality(tiles* a, const tiles* b) 
{ 
    if (a->red == b->red && a->green == b->green && a->blue == b->blue) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 



//sejttípus 1.: tesztsejt: minden magányos vagy túlbuzgó sejt meghal 
void Test(tiles arra[fldwidth][fldheight], tiles arrb[fldwidth][fldheight]) 
{ 
    int a,b,i,j,counter; 

    for (j=1;j<fldheight-1;j++) 
    { 
     for (i=1;i<fldwidth-1;i++) 
     { 
      if (equality(&arra[i][j], &TEST_ALIVE) == true) 
      { 
      counter = -1; 
      } else { 
       counter = 0; 
      } 
      for (b=j-1;b<=j+1;b++) 
      { 
       for (a=i-1;a<=i+1;a++) 
       { 
        if (equality(&arra[a][b], &TEST_ALIVE) == true) 
        { 
         counter+=1; 
        } 
       } 
      } 
      arrb[i][j] = arra[i][j]; 
      //itt a sejtek szabályai jönnek; mindig a születést tesszük előre, utána a halált! 
      if (equality(&arra[i][j], &TEST_ALIVE) == false && counter >= 2) 
      { 
       arrb[i][j] = TEST_ALIVE; 
      } 

      if (equality(&arra[i][j], &TEST_ALIVE) == true && (counter == 0 || counter > 6)) 
      { 
       arrb[i][j] = TEST_DEAD; 
      } 
     } 
    } 

} 

//sejttípus 2.: Conway életjátéka 
void Conway(tiles arra[fldwidth][fldheight], tiles arrb[fldwidth][fldheight]) 
{ 
    int a,b,i,j,counter; 

    for (j=1;j<fldheight-1;j++) 
    { 
     for (i=1;i<fldwidth-1;i++) 
     { 
      if (equality(&arra[i][j], &CONWAY_ALIVE) == true) 
      { 
      counter = -1; 
      } else { 
       counter = 0; 
      } 
      for (b=j-1;b<=j+1;b++) 
      { 
       for (a=i-1;a<=i+1;a++) 
       { 
        if (equality(&arra[a][b], &CONWAY_ALIVE) == true) 
        { 
         counter+=1; 
        } 
       } 
      } 
      arrb[i][j] = arra[i][j]; 
      //itt a sejtek szabályai jönnek; mindig a születést tesszük előre, utána a halált! 
      if (equality(&arra[i][j], &CONWAY_ALIVE) == false && counter == 3) 
      { 
       arrb[i][j] = CONWAY_ALIVE; 
      } 

      if (equality(&arra[i][j], &CONWAY_ALIVE) == true && (counter != 2 && counter != 3)) 
      { 
       arrb[i][j] = CONWAY_DEAD; 
      } 
     } 
    } 
} 

這是循環的內容:

Test(fielda,fieldb); 
Conway(fielda,fieldb); 
end = false; 
round++; 
for (j = 0; j < fldheight; j++) 
    { 
     for (i = 0; i < fldwidth; i++) 
     { 
      fielda[i][j] = fieldb[i][j]; 
     } 
    } 

正如我所提到的,在這個例子中,康威細胞生長,但測試的細胞只是停留。如何讓他們同時工作?

(我用快板庫,所以如果有一些對於這個問題,請隨時與我分享!)

回答

0

Test(fielda,fieldb);臺基於FIELDA的當前值fieldb的每一個細胞。然後Conway(fielda,fieldb);根據fielda的當前值設置fieldb的每個單元格,覆蓋fieldb,以便Test所做的一切都消失了。解決這個問題的方法之一是你的循環更改爲:

Test(fielda,fieldb); 
Conway(fieldb,fielda); //switched the parameters 
end = false; 
round++; 
//there is no need to copy fieldb to fielda here because Conway already did 

但是這可能不是取決於你想要究竟是如何測試和康威相互交互的正確定位。

+0

它的工作原理!謝謝!無論如何,Test和Conway不必互相影響,但解決這個問題對於我能夠添加更多種類的細胞非常重要。目前,我唯一想補充的是某種「牆細胞」,它阻止了康威,但並沒有阻止其他東西。 –

相關問題