aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2021-10-25 00:03:17 +0200
committerMel <einebeere@gmail.com>2021-10-25 00:03:17 +0200
commit03c7532413cb1a2f00f407fc1be454bed1ebe079 (patch)
tree7d609ce01bb7b23548865bcc12a2c2d87bc1b848
parent31901291f3fdb7d5e98fea37dda0064188dd0961 (diff)
downloadrabbithole-03c7532413cb1a2f00f407fc1be454bed1ebe079.tar.zst
rabbithole-03c7532413cb1a2f00f407fc1be454bed1ebe079.zip
Add Game of Life example.
-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