fork(2) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. #define FieldSize 20
  6. #define TimeMax 20
  7.  
  8. /*フィールドの初期化 (ファイルの読み込み)*/
  9. void init_field(int field[FieldSize][FieldSize], char *fname)
  10. {
  11. int i, j;
  12. FILE *fp;
  13.  
  14. if((fp = fopen(fname, "r")) == NULL) {
  15. printf("init_field(): Cannot open \"%s\"\n", fname);
  16. exit(1);
  17. }
  18.  
  19. for(i = 0; i < FieldSize; i++) {
  20. for(j = 0; j < FieldSize; j++) {
  21. fscanf(fp, "%d ", &field[i][j]);
  22. }
  23. }
  24. fclose(fp);
  25. }
  26.  
  27. int count(int x, int y, int field[FieldSize][FieldSize])
  28. {
  29. int i, j;
  30. int sum;
  31.  
  32. sum = 0;
  33. for(i = x-1; i <= x+1; i++) {
  34. for(j = y-1; j <= y+1; j++) {
  35. if( i>=0 && i<FieldSize
  36. && j>=0 && j<FieldSize
  37. && field[i][j]==1 ){
  38. sum++;
  39. }
  40. }
  41. }
  42. return sum;
  43. }
  44.  
  45. void update_field(int field[FieldSize][FieldSize])
  46. {
  47. int i, j;
  48. int around;
  49. int new_field[FieldSize][FieldSize];
  50.  
  51. for(i = 0; i < FieldSize; i++) {
  52. for(j = 0; j < FieldSize; j++) {
  53. around = count(i, j, field);
  54. /* 生死判定の条件 周囲が2つか3つ生きているとき生存 それ以外死亡 */
  55. if((around >= 2) && (around <= 3)) {
  56. new_field[i][j] = 1;
  57. } else {
  58. new_field[i][j] = 0;
  59. }
  60. }
  61. }
  62. for(i = 0; i < FieldSize; i++) {
  63. for(j = 0; j < FieldSize; j++) {
  64. field[i][j] = new_field[i][j];
  65. }
  66. }
  67. }
  68.  
  69.  
  70. void display(int field[FieldSize][FieldSize])
  71. {
  72. int i, j;
  73.  
  74. for(i = 0; i < FieldSize; i++) {
  75. for(j = 0; j < FieldSize; j++) {
  76. if(field[i][j] == 1) {
  77. printf("■");
  78. } else {
  79. printf("□");
  80. }
  81. }
  82. printf("\n");
  83. }
  84.  
  85. }
  86.  
  87. int main(int argc, char *argv[])
  88. {
  89. int t;
  90. int field[FieldSize][FieldSize];
  91.  
  92. if(argc != 2) {
  93. printf("実行方法 : ./a.out 初期状態のファイル\n");
  94. exit(1);
  95. }
  96. //system("clear");
  97. init_field(field, argv[1]);
  98. display(field);
  99. //sleep(1);
  100. system("clear");
  101. for(t = 0; t < TimeMax; t++) {
  102. update_field(field);
  103. display(field);
  104. sleep(1);
  105. system("clear");
  106. }
  107.  
  108. return 0;
  109. }
  110.  
Runtime error #stdin #stdout 0.01s 1720KB
stdin
Standard input is empty
stdout
実行方法 : ./a.out 初期状態のファイル