about summary refs log tree commit diff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/game_of_life.rh85
1 files changed, 85 insertions, 0 deletions
diff --git a/examples/game_of_life.rh b/examples/game_of_life.rh
new file mode 100644
index 0000000..4d6f9bb
--- /dev/null
+++ b/examples/game_of_life.rh
@@ -0,0 +1,85 @@
+FIELD_WIDTH = 15;
+FIELD_HEIGHT = 15;
+
+empty_row := [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+
+field = [
+    empty_row, empty_row, empty_row,
+    empty_row, empty_row, empty_row,
+    empty_row, empty_row, empty_row,
+    empty_row, empty_row, empty_row,
+    empty_row, empty_row, empty_row
+];
+
+# Place a glider on the field.
+field[1][2] = 1;
+field[2][3] = 1;
+field[3][1] = 1;
+field[3][2] = 1;
+field[3][3] = 1;
+
+loop {
+    new_field = [
+        empty_row, empty_row, empty_row,
+        empty_row, empty_row, empty_row,
+        empty_row, empty_row, empty_row,
+        empty_row, empty_row, empty_row,
+        empty_row, empty_row, empty_row
+    ];
+
+    # Compute new field.
+    y = 0;
+    loop if y < FIELD_HEIGHT {
+        x = 0;
+        loop if x < FIELD_WIDTH {
+            
+            top := if y == 0 { 0 } else { field[y - 1][x] };
+            top_left := if x == 0 || y == 0 { 0 } else { field[y - 1][x - 1] };
+            top_right := if x == FIELD_WIDTH - 1 || y == 0 { 0 } else { field[y - 1][x + 1] };
+
+            bottom := if y == FIELD_HEIGHT - 1 { 0 } else { field[y + 1][x] };
+            bottom_left := if x == 0 || y == FIELD_HEIGHT - 1 { 0 } else { field[y + 1][x - 1] };
+            bottom_right := if x == FIELD_WIDTH - 1 || y == FIELD_HEIGHT - 1 { 0 } else { field[y + 1][x + 1] };
+
+            left := if x == 0 { 0 } else { field[y][x - 1] };
+            right := if x == FIELD_WIDTH - 1 { 0 } else { field[y][x + 1] };
+
+            neighbors := top + top_left + top_right + bottom + bottom_left + bottom_right + left + right;
+
+            if field[y][x] == 0 {
+                if neighbors == 3 {
+                    new_field[y][x] = 1;
+                };
+            } else {
+                if neighbors == 2 || neighbors == 3 {
+                    new_field[y][x] = 1;
+                };
+            };
+
+            x = x + 1;
+        };
+        y = y + 1;
+    };
+
+    # Print field.
+    y = 0;
+    loop if y < FIELD_HEIGHT {
+        row = "";
+
+        x = 0;
+        loop if x < FIELD_WIDTH {
+            if field[y][x] == 1 {
+                row = row + "#";
+            } else {
+                row = row + ".";
+            };
+            x = x + 1;
+        };
+        print row;
+        y = y + 1;
+    };
+
+    print "";
+
+    field = new_field;
+};
\ No newline at end of file