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

#define FieldSize 20
#define TimeMax 20

/*フィールドの初期化 (ファイルの読み込み)*/
void init_field(int field[FieldSize][FieldSize], char *fname)
{
    int i, j;
    FILE *fp;

    if((fp = fopen(fname, "r")) == NULL) {
        printf("init_field(): Cannot open \"%s\"\n", fname);
        exit(1);
    }

    for(i = 0; i < FieldSize; i++) {
        for(j = 0; j < FieldSize; j++) {
            fscanf(fp, "%d ", &field[i][j]);
        }
    }
    fclose(fp);
}

int count(int x, int y, int field[FieldSize][FieldSize])
{
    int i, j;
    int sum;

    sum = 0;
    for(i = x-1; i <= x+1; i++) {
        for(j = y-1; j <= y+1; j++) {
            if( i>=0 && i<FieldSize
             && j>=0 && j<FieldSize
             && field[i][j]==1 ){
                sum++;
            }
        }
    }
    return sum;
}

void update_field(int field[FieldSize][FieldSize])
{
    int i, j;
    int around;
    int new_field[FieldSize][FieldSize];

    for(i = 0; i < FieldSize; i++) {
        for(j = 0; j < FieldSize; j++) {
            around = count(i, j, field);
            /* 生死判定の条件 周囲が2つか3つ生きているとき生存 それ以外死亡 */
            if((around >= 2) && (around <= 3)) {
                new_field[i][j] = 1;
            } else {
                new_field[i][j] = 0;
            }
        }
    }
    for(i = 0; i < FieldSize; i++) {
        for(j = 0; j < FieldSize; j++) {
            field[i][j] = new_field[i][j];
        }
    }
}


void display(int field[FieldSize][FieldSize])
{
    int i, j;

    for(i = 0; i < FieldSize; i++) {
        for(j = 0; j < FieldSize; j++) {
            if(field[i][j] == 1) {
                printf("■");
            } else {
                printf("□");
            }
        }
        printf("\n");
    }

}

int main(int argc, char *argv[])
{
    int t;
    int field[FieldSize][FieldSize];

    if(argc != 2) {
        printf("実行方法 : ./a.out 初期状態のファイル\n");
        exit(1);
    }
    //system("clear");
    init_field(field, argv[1]);
    display(field);
    //sleep(1);
    system("clear");
    for(t = 0; t < TimeMax; t++) {
        update_field(field);
        display(field);
        sleep(1);
        system("clear");
    }

    return 0;
}
