/* 生命游戲 說明: 生命游戲(game of life)為1970年由英國數學家J.H.Conway所提出來,某一細胞的鄰居包括上,下,左,右,左上,左下, 右上,右下相鄰之細胞。游戲規則如下: 孤單死亡:如果細胞的鄰居小於一個,則該細胞在下一次狀態將死亡。 擁擠死亡:如果細胞的鄰居在四個以上,則該細胞在再一次狀態將死亡。 穩定:如果細胞的鄰居為二個或三個,則下一次狀態為穩定存活。 復活:如果某位置原無細胞存活,而該位置的鄰居為三個,則該位置將復活一細胞。 解法: 生命游戲的規則可簡化為以下,並使用case比對即可使用程式操作: 1.鄰居個數為0,1,4,5,6,7,8時則該細胞下次的狀態為死亡。 2.鄰居個數為2時,則該細胞下次狀態為復活。 3.鄰居個數為3時,則該細胞下次狀態為穩定。 */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAXROW 10 #define MAXCOL 25 #define DEAD 0 #define ALIVE 1 int map[MAXROW][MAXCOL], newmap[MAXROW][MAXCOL]; void init(); int neighbors(int , int ); void outputMap(); void copyMap(); int main() { int row, col; char ans; init(); while(1) { outputMap(); for(row = 0; row < MAXROW; row++) { for(col = 0; col < MAXCOL; col++) { switch(neighbors(row, col)) { case 0: case 1: case 4: case 5: case 6: case 7: case 8: newmap[row][col] = DEAD; break; case 2: newmap[row][col] = map[row][col]; break; case 3: newmap[row][col] = ALIVE; break; } } } copyMap(); printf("\nContinue next Generation ? "); getchar(); ans = toupper(getchar()); if(ans != 'y' && ans != 'Y') { break; } } return 0; } void init() { int row, col; for(row = 0; row < MAXROW; row++) { for(col = 0; col < MAXCOL; col++) { map[row][col] = DEAD; } } puts("\n============Game of life Program============"); puts("Enter x, y where x, y is living cell."); printf("0 <= x <= %d, 0 <= y <= %d and ", MAXROW - 1, MAXCOL - 1); puts("terminate with (x, y) = (-1, -1)\n"); printf("Enter: \n"); while(1) { scanf("%d%d", &row, &col); if(0 <= row && row <MAXROW && 0 <= col && col < MAXCOL) { map[row][col] = ALIVE; } else if(row == -1 || col == -1) { break; } else { printf("(x, y) exceeds map ranage !\n"); } } } int neighbors(int row, int col) { int count = 0, c, r; for(r = row - 1; r <= row + 1; r++) { for(c = col - 1; c <= col + 1; c++) { if(r < 0 || r >= MAXROW || c < 0 || c >= MAXCOL) { continue; } if(map[r][c] == ALIVE) { count++; } } } if(map[row][col] == ALIVE) { count--; } return count; } void outputMap() { int row, col; printf("\n\n%20c Game of life cell status\n", '@'); for(row = 0; row < MAXROW; row++) { printf("\n%20c",'@'); for(col = 0; col < MAXCOL; col++) { if(map[row][col] == ALIVE) { putchar('#'); } else { putchar('-'); } } } } void copyMap() { int row, col; for(row = 0; row < MAXROW; row++) { for(col = 0; col < MAXCOL; col++) { map[row][col] = newmap[row][col]; } } } //不完善
運行結果: