2013-02-28 104 views
-1

所以,代碼編譯和運行完美。然而,通常,康威的生命遊戲會在一段時間後穩定下來,而這段代碼無限期地運行而沒有死亡分支,如果有人能夠幫助我找出原因,我很樂意。康威的加工生命遊戲

int[][] world; 
int SCALE_FACTOR = 4; 
float DENSITY = 0.1; 

void setup() { 
    size(500,500); 
    world = new int[width/SCALE_FACTOR][height/SCALE_FACTOR]; 
    for(int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < height/SCALE_FACTOR; j++) { 
     int r = (int)random(100); 
     world[i][j] = r % (int)(1/DENSITY) == 0 ? 1 : 0; 
    } 
    } 
    frameRate(1); 
    stroke(0, 255, 0); 
} 

void draw() { 
    scale(SCALE_FACTOR); 
    background(0); 
    for(int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < height/SCALE_FACTOR; j++) { 
     if (world[i][j] == 1) point(i, j); 
    } 
    } 
    lifeCycle();  
} 

void lifeCycle() { 
    int[][] newworld = new int[width/SCALE_FACTOR][height/SCALE_FACTOR]; 
    for(int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < width/SCALE_FACTOR; j++) { 
     if (world[i][j] == 1) { 
     if (neighbours(i, j) == 3) { 
      newworld[i][j] = 1; 
     } else { 
      newworld[i][j] = 0; 
     } 
     } else { 
     if (neighbours(i, j) == 2 || neighbours(i, j) == 3) { 
      newworld[i][j] = 1; 
     } else { 
      newworld[i][j] = 0; 
     } 
     } 
    } 
    } 
    for (int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < height/SCALE_FACTOR; j++) { 
     world[i][j] = newworld[i][j]; 
    } 
    } 
} 

int neighbours(int x, int y) { 
    int px = (x == width/SCALE_FACTOR - 1) ? 0 : (x+1); 
    int py = (y == height/SCALE_FACTOR - 1) ? 0 : (y+1); 
    int mx = (x == 0) ? (width/SCALE_FACTOR - 1) : (x-1); 
    int my = (y == 0) ? (height/SCALE_FACTOR - 1) : (y-1); 
    return world[mx][my] + world[mx][y] + world[mx][py] 
    + world[x][my] + world[x][py] 
    + world[px][my] + world[px][y] + world[px][py]; 
} 
+0

我想說這更適合http://codereview.stackexchange.com/ – 2013-02-28 19:20:24

+1

一般策略:單元測試它的每一塊。它看起來像if語句的分支在查看當前單元格是否存在或不存在時是落後的。也就是說,一個死細胞應該與三個鄰居一起活着,一個活細胞應該與2/3個鄰居共存。 – bchurchill 2013-02-28 19:21:21

+0

請記住,第一次來這裏,謝謝安德魯 – 2013-02-28 19:28:38

回答

1

嗯,這看起來錯誤的開始:

for (int j = 0; j < width/SCALE_FACTOR; j++) { 

當然這應該是height

接下來是:目前你的邏輯說:「如果廣場之前還活着,如果它有三個鄰居,它只在下一輪活着;如果它以前死過,它在下一輪活着,如果它有兩個或三個鄰居「。這是錯誤的方式。這需要三個活的鄰居創建生活,但只有兩個或三個鄰居維持生活。

這就是我馬上就可以看到這是不對的,但對診斷問題的提示:

  • 我強烈建議保留widthheight遊戲而方面比像素大小,我以爲SCALE_FACTOR是什麼意思。在繪製時將單位向上縮放,但要根據實際網格元素保留所有邏輯。
  • 如果您將UI與「業務邏輯」隔離,您可以輕鬆地對其進行單元測試。
  • 當您使用UI來顯示電路板時,您可能想要給它一個「手動前進」模式,以便您可以更輕鬆地查看到底發生了什麼。
+0

哦,那絕對是,我從實際的遊戲中弄錯了邏輯。感謝有用的建議,但會牢記它們! – 2013-02-28 19:25:46