about summary refs log tree commit diff
path: root/examples/game_of_life.rh
blob: 118effbf232dbe1d0aad5dcebcf65ca67cc83294 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
FIELD_WIDTH = 15;
FIELD_HEIGHT = 15;

create_empty_field := fn {
    empty_row := [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    [
        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
    ]
};

field = create_empty_field();

# 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 = create_empty_field();

    # 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;
    field_str = "";
    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;
        };
        field_str = "{field_str}{row}\n";
        y = y + 1;
    };

    print field_str;

    field = new_field;
};