ハチロク世代のskypeチャットでライフゲームの実装が話題に
どう書く?.orgで出題されていたライフゲームの実装のがハチロク世代のskypeチャットで話題にあがったので何も考えず勢いで書いてみた。風呂で。
微妙にお題に沿わないので、投稿せずにここに書いておく。
/* life.c compile: $ gcc -o life life.c usage: $ ./life < data <ctrl>-c to exit data format: example) 6 8 00100001 10010110 01101000 10100101 00010101 01011010 [EOF] */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { int row, column; int i, j; int c; int arround; int up, right, down, left; int population=0, generation=0; int **cell, **new_cell, **temp; scanf("%d %d ", &row, &column); cell = (int**)malloc(sizeof(int*)*row); new_cell = (int**)malloc(sizeof(int*)*row); for(i=0;i<row;i++) { cell[i] = (int*)malloc(sizeof(int)*column); new_cell[i] = (int*)malloc(sizeof(int)*column); for(j=0;j<column;j++) { c = getchar()-'0'; if(c) { cell[i][j] = 1; population++; } else { cell[i][j] = 0; } } getchar(); } for(i=0;i<=row;i++) { printf("\n"); } while(1) { printf("\033[%dA", row+1); for(i=0;i<row;i++) { for(j=0;j<column;j++) { if(cell[i][j]) { printf("■ "); } else { printf(" "); } } printf("\n"); } printf("\033[0mlife game generation: %d population: %d\r\n", generation, population); sleep(1); population = 0; for(i=0;i<row;i++) { up = (i+row-1) % row; down = (i+row+1) % row; for(j=0;j<column;j++) { left = (j+column-1) % column; right = (j+column+1) % column; arround = 0; arround += cell[up][j]; arround += cell[up][right]; arround += cell[i][right]; arround += cell[down][right]; arround += cell[down][j]; arround += cell[down][left]; arround += cell[i][left]; arround += cell[up][left]; if(cell[i][j]) { if(arround==3 || arround==2) { new_cell[i][j] = 1; population++; } else { new_cell[i][j] = 0; } } else { if(arround==3) { new_cell[i][j] = 1; population++; } else { new_cell[i][j] = 0; } } } } temp = cell; cell = new_cell; new_cell = temp; generation++; } for(i=0;i<row;i++) { free(cell[i]); free(new_cell[i]); } free(cell); free(new_cell); return 0; }