ライフゲーム

ライフゲーム

碁盤の目の上に、いくつかの石(生命体)を適当に配置する。これらの生命体は、以下に述べる簡単なルールに従って生き続ける。
それを見て楽しむという単純なゲームである。
盤面では、どの場所も縦・横・斜めに8個の場所と隣り合っているが、もしある場所が空いていて、しかもその場所と隣り合うちょうど3個の場所に生命体が存在するならば、次の世代にはその空いた場所に新しい生命体が誕生する。
一方、すでに存在する生命体については、隣り合う場所に住む生命体が1個以下または4個以上になると、過疎または過密のため、次の世代には死んでしまう。
以下ソース

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

#define N   22                      /*  縦方向  */
#define M   78                      /*  横方向  */
char a[N + 2][M + 2], b[N + 2][M + 2];  /*  盤  */


int main(void){
    int i, j, g;

    a[N / 2][M / 2] = a[N / 2 - 1][M / 2] = a[N / 2 + 1][M / 2]
    = a[N / 2][M / 2 - 1] = a[N / 2 - 1][M / 2 + 1] = 1;        /*  初期状態    */
    for(g = 1; g <= 1000; g++){
        printf("Generation %4d\n",g);                           /*  世代        */
        for(i = 1; i <= N; i++){
            for(j = 1; j <= M; j++){
                if(a[i][j]){
                    printf("*");
                    b[i - 1][j - 1]++;  b[i - 1][j]++;  b[i - 1][j + 1]++;
                    b[i    ][j - 1]++;                  b[i    ][j + 1]++;
                    b[i + 1][j - 1]++;  b[i + 1][j]++;  b[i + 1][j + 1]++;
                }else{
                    printf(".");
                }
            }
            printf("\n");
        }
        for(i = 0; i <= N + 1; i++){
            for(j = 0; j <= M + 1; j++){
                if(b[i][j] != 2){
                    a[i][j] = (b[i][j] == 3);
                }
                b[i][j] = 0;
            }
        }
    }
    return 0;
}

実行はぜひ皆さんの方で試してみてほしい