2011-11-19 94 views
-2

只是覺得我會在康威的生命遊戲中破解一番,但是我正在嚴重掙扎......這是一個驚喜!有人可能暗示算法問題?只是一個小小的推動?這不是功課。C中的生命遊戲

#include <stdio.h> 
#include <stdlib.h> 

#define HEIGHT 10 
#define WIDTH 10 

int *gb[HEIGHT]; 
int *gb2[HEIGHT]; 

void copy() { 
    int i, j; 
    for (i = j = 0; i < HEIGHT; i++) { 
    for (; j < WIDTH; j++) { 
     gb2[i][j] = gb[i][j]; 
    } 
    } 
} 

void init() { 
    int i, j; 
    for (i = 0; i < HEIGHT; i++) { 
    gb [i] = malloc(sizeof(int)*WIDTH); 
    gb2[i] = malloc(sizeof(int)*WIDTH); 
    } 
    for (i = j = 0; i < HEIGHT; i++) { 
    for (; j < WIDTH; j++) { 
     gb [i][j] = 0; 
    } 
    } 
    gb[0][0] = 1; 
    gb[0][1] = 1; 
    gb[1][0] = 1; 
    gb[1][1] = 1; 
    copy(); 
} 

void printg() { 
    int i, j; 
    printf(" "); 
    for (i = 0; i < WIDTH; i++) { 
    printf("%2d ", i); 
    } 
    printf("\n\n"); 
    for (i = 0; i < HEIGHT; i++) { 
    printf("%d ", i); 
    for (j = 0; j < WIDTH; j++) { 
     printf(" %c ", gb2[i][j]?'+':'-'); 
    } 
    printf("\n"); 
    } 
} 

void ckill(int i, int j) { 
    gb2[i][j] = 0; 
} 

void clive(int i, int j) { 
    gb2[i][j] = 1; 
} 

void newgen() { 
    int i, j = i = 1, n = 0; 
    for (; i < HEIGHT-1; i++) { 
    for (j = 0; j < WIDTH-1; j++) { 
     if (gb[i][j+1]) n++; 
     if (gb[i+1][j]) n++; 
     if (gb[i+1][j+1]) n++; 
     if (gb[i-1][j-1]) n++; 
     if (gb[i][j-1]) n++; 
     if (gb[i-1][j]) n++; 
     if (gb[i+1][j-1]) n++; 
     if (gb[i-1][j+1]) n++; 

     if (n < 2) ckill(i, j); 
     else if ((n == 2 || n == 3) && gb[i][j]) clive(i, j); 
     else if (n > 3) ckill(i, j); 
     else if (n == 3 && gb[i][j] == 0) clive(i, j); 
    } 
    } 
} 

int main() { 
    int i; 
    init(); 
    newgen(); 
    printg(); 
    for (i = 0; i < HEIGHT; i++) { 
    free(gb[i]); 
    } 
} 

這需要沒有輸入,但在(0,0),(0,1)與活細胞開始了,(1,0),(1,1)。一代後,它應該保持不變,但相反殺死細胞,所以只有(0,0)和(1,0)是活的。

+0

有什麼具體的,你想我們看看?否則,這可能會因爲不是真正的問題而關閉。在codereview上可能會更好。 – Marlon

+1

你遇到什麼問題?你的意見是什麼?你的預期產出是多少?你的實際產出是多少? –

+3

考慮到你的代表,我以爲你會意識到,解釋什麼是不工作是必要的。 –

回答

5

在函數initcopy中有一個雙循環。內循環的計數器j應該在內循環中初始化,而不是在外循環中。

在函數newgen中,即使單元位於矩陣的邊緣,您也正在檢查相鄰的單元(全部8個單元)。這導致訪問出界數據和未定義的行爲。

小記。儘量做好代碼,不要試圖變得聰明。初始化循環之外的循環計數器試圖變得聰明(但在它失敗)。