fork(1) download
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <conio.h>
  7. #include <io.h>
  8.  
  9. #define ROWS 50
  10. #define COLS 80
  11.  
  12. // The total number of generations is really double this number.
  13. int generations = 1000;
  14.  
  15. int civ1[ROWS+2][COLS+2], civ2[ROWS+2][COLS+2];
  16.  
  17. CHAR_INFO disp[ROWS][COLS];
  18. HANDLE console;
  19. COORD size = { COLS, ROWS };
  20. COORD src = { 0, 0};
  21. SMALL_RECT dest = { 0, 0, COLS, ROWS };
  22.  
  23. void ClrScrn(char attrib) {
  24. COORD pos = { 0, 0};
  25. DWORD written;
  26. unsigned size;
  27.  
  28. size = ROWS * COLS;
  29.  
  30. FillConsoleOutputCharacter(console, ' ', size, pos, &written);
  31. FillConsoleOutputAttribute(console, attrib, size, pos, &written);
  32. SetConsoleCursorPosition(console, pos);
  33. }
  34.  
  35. void fill_edges(int civ1[ROWS+2][COLS+2]) {
  36. int i, j;
  37.  
  38. for (i=1; i<=ROWS; ++i) {
  39. civ1[i][0] = civ1[i][COLS];
  40. civ1[i][COLS+1] = civ1[i][1];
  41. }
  42. for (j=1; j<=COLS; ++j) {
  43. civ1[0][j] = civ1[ROWS][j];
  44. civ1[ROWS+1][j] = civ1[1][j];
  45. }
  46. civ1[0][0] = civ1[ROWS][COLS];
  47. civ1[ROWS+1][COLS+1] = civ1[1][1];
  48. civ1[0][COLS+1] = civ1[ROWS][1];
  49. civ1[ROWS+1][0] = civ1[1][COLS];
  50. }
  51.  
  52. void update_generation(int old_gen[ROWS+2][COLS+2],
  53. int new_gen[ROWS+2][COLS+2])
  54. {
  55. int i, j, count;
  56.  
  57. for (i = 1; i <= ROWS; ++i)
  58. {
  59. for (j = 1; j <= COLS; ++j)
  60. {
  61. count = old_gen[i - 1][j - 1] +
  62. old_gen[i - 1][j] +
  63. old_gen[i - 1][j + 1] +
  64. old_gen[i][j - 1] +
  65. old_gen[i][j + 1] +
  66. old_gen[i + 1][j - 1] +
  67. old_gen[i + 1][j] +
  68. old_gen[i + 1][j + 1];
  69.  
  70. switch(count)
  71. {
  72. case 2:
  73. new_gen[i][j] = old_gen[i][j];
  74. break;
  75.  
  76. case 3:
  77. new_gen[i][j] = 1;
  78. disp[i-1][j-1].Char.AsciiChar = '*';
  79. break;
  80. default:
  81. new_gen[i][j] = 0;
  82. disp[i-1][j-1].Char.AsciiChar = ' ';
  83. break;
  84. }
  85. }
  86. }
  87. WriteConsoleOutput(console, (CHAR_INFO *)disp, size, src, &dest);
  88. fill_edges(new_gen);
  89. }
  90.  
  91. void initialize(void)
  92. {
  93. int i, j;
  94.  
  95. ClrScrn(0x71);
  96. srand(((unsigned int)time(NULL))|1);
  97.  
  98. for (i = 1; i <= ROWS; ++i)
  99. {
  100. for (j = 1; j <= COLS; ++j)
  101. {
  102. civ1[i][j] = (int)(((__int64)rand()*2)/RAND_MAX);
  103. disp[i-1][j-1].Char.AsciiChar = civ1[i][j] ? '*' : ' ';
  104. disp[i-1][j-1].Attributes = 0x71;
  105. }
  106. }
  107. WriteConsoleOutput(console, (CHAR_INFO *)disp, size, src, &dest);
  108. fill_edges(civ1);
  109. }
  110.  
  111. int main(int argc, char **argv) {
  112.  
  113. int i;
  114.  
  115. if ( argc != 1)
  116. generations = atoi(argv[1]);
  117.  
  118. console = GetStdHandle(STD_OUTPUT_HANDLE);
  119. initialize();
  120. for (i = 0; i <generations; ++i)
  121. {
  122. update_generation(civ1, civ2);
  123. update_generation(civ2, civ1);
  124. }
  125. return EXIT_SUCCESS;
  126. }
  127.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty