summaryrefslogtreecommitdiff
path: root/files/conway.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'files/conway.cpp')
-rw-r--r--files/conway.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/files/conway.cpp b/files/conway.cpp
new file mode 100644
index 0000000..1e60014
--- /dev/null
+++ b/files/conway.cpp
@@ -0,0 +1,95 @@
+/* ======================================================================= */
+/* CONWAY.CPP */
+/* ======================================================================= */
+
+#include "assert.h"
+#include "iostream.h"
+#include "conio.h"
+#include "clheir.h"
+#include "screen.h"
+#include "conway.h"
+
+#define max(x,y) ((x > y) ? x : y)
+#define min(x,y) ((x > y) ? y : x)
+
+const int num_rows = min(50, NUM_ROWS);
+const int num_columns = 40;
+
+class site *field_of_play[num_rows][num_columns];
+
+int site::total_surrounding(void)
+ {
+ int i, j, imin, imax, jmin, jmax, total;
+
+ total = 0;
+ imin = max(0, x - 1);
+ imax = min(num_rows - 1, x + 1);
+ jmin = max(0, y - 1);
+ jmax = min(num_columns - 1, y + 1);
+
+ for (i = imin; i <= imax; i++)
+ for (j = jmin; j <= jmax; j++)
+ if (field_of_play[i][j]->read()) total++;
+ if (alive) total--;
+ return total;
+ }
+
+void display(void)
+ {
+ int i, j;
+
+ for (i = 0; i < num_rows; i++)
+ for (j = 0; j < num_columns; j++)
+ {
+ if (field_of_play[i][j]->read()) write_xyc(2*j, i, 'X');
+ else write_xyc(2*j, i, '.');
+ }
+ hide_cursor();
+ }
+
+void glider(int x, int y)
+ {
+ field_of_play[x - 1][y + 0]->set();
+ field_of_play[x - 1][y + 1]->set();
+ field_of_play[x + 0][y - 1]->set();
+ field_of_play[x + 0][y + 0]->set();
+ field_of_play[x + 1][y + 1]->set();
+ }
+
+void traffic_light(int x, int y)
+ {
+ field_of_play[x - 1][y]->set();
+ field_of_play[x + 0][y]->set();
+ field_of_play[x + 1][y]->set();
+ }
+
+
+void main(void)
+ {
+ int i, j, c;
+
+ init_registry();
+
+ for (i = 0; i < num_rows; i++)
+ for (j = 0; j < num_columns; j++)
+ field_of_play[i][j] = new site(i, j);
+
+start_over:
+ traffic_light(num_rows/2 - 8, num_columns/2 - 8);
+ glider(num_rows/2 + 8, num_columns/2 + 8);
+
+ clear_screen();
+ while (1)
+ {
+ display();
+ if ((c = getch()) == 'q') { clear_screen(); return; }
+ if (c == 'i')
+ {
+ for (i = 0; i < num_rows; i++)
+ for (j = 0; j < num_columns; j++)
+ field_of_play[i][j]->clear();
+ goto start_over;
+ }
+ step_everybody();
+ }
+ }