2013-05-20 14 views
1

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

這是兩個函數(預定義的事情):

#define fldwidth 110 
#define fldheight 140 

//struktúra, aztán a sejtek definíciója 

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; 
      } 
     } 
    } 
} 

,這是循環本身:

while(!end) 
{ 
al_wait_for_event_timed(event_queue,&asd,0.001); //várakozás 

if(asd.type == ALLEGRO_EVENT_KEY_DOWN) 
{ 
    if(asd.keyboard.keycode == ALLEGRO_KEY_ENTER) 
    { 
    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]; 
      } 
     } 
    } 
} 

for (j = 0; j < fldheight; j++) 
{ 
    for (i = 0; i < fldwidth; i++) 
    { 
     al_draw_filled_rectangle(20 + (4*i), 20 + (4*j), 24 + (4*i), 24 + (4*j), al_map_rgb(fielda[i][j].red, fielda[i][j].green, fielda[i][j].blue)); 
    } 
} 

} 

你能告訴我什麼是錯呢?或者,也許問題不在循環中?

+0

請說明'*整件事不起作用*'的含義。 –

+0

** **如何不起作用?它會崩潰嗎?編譯錯誤?你是否嘗試過在調試器中的代碼? –

+0

程序中沒有調試錯誤。遊戲開始並且例如在這個例子中,康威自動機開始增長,但紅色測試單元只是沒有任何改變。 –

回答

0

您的問題是您調用的第二個函數會顛倒第一個函數所做的所有更改。這就是爲什麼你看到只有一個工作。

最好的方式來獲得它的工作,讓每個功能只在一個色彩通道。 Test使用只有紅色通道(用於讀取和更改),而Conway使用只有的綠色通道。準備好看到不同顏色的細胞:這些都受到兩種功能的影響。

+0

但是後來,當我想要使用更多的顏色(例如橙色,紫色或任何單元格時,我將無法使用它,而且沒有相反的結果,或者我錯了嗎? –

+0

不,請考慮一下:你會如何表示一個根據'Test'存活的單元,但是根據'Conway'死了嗎?這個信息現在直接編碼在顏色通道中,其中只有三個顏色通道,如果你想使用額外的或非基色的顏色,你必須從用於表示它們的顏色中分離活/死信息。 –

相關問題