aboutsummaryrefslogtreecommitdiff
path: root/examples/cgol.sloth
blob: a0e1878c72505a8f66a72e0caf36a0947b35df87 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
fn populate() [Int]
{
	# Initialize life vector
	var life: [Int] = [0];
	vpopi(life);

	# Fill the vector with random values
	var i: Int = 0;
	while i < 57600 
  {
		var n: Int = randGen(0,1);
		vpushi(life, n);
		i = i+1;
	}

	return life;
}

fn coord(x: Int, y: Int) Int 
{
	var res: Int = -1;
	# Calculate index based on coordinates
	if x >= 0 && y >= 0 
  {
		res = y*240+ x;
	}
	# if coordinate is invalid, return -1
	return res;
}

fn cval(x: Int, y: Int, life: [Int]) Int 
{
	# Check to make sure index exists before returning
	var res: Int = 0;
	var c: Int = coord(x, y);
	if c >= 0 {
		res = vgeti(life, c);
	}
	return res;
}

fn gol(total: Int, alive: Bool) Int
{
  
  if !alive && total == 3 {
    return 1;
  }
  if alive && ()
  return 0;
}

fn update(life: [Int], new: [Int])
{
	# Iterate through life
	for x in 0..64 
  {
		for y in 0..240 
    {
			# Calculate total score around selected cell
			var total: Int = 
                cval(x-1, y-1, life) + # Top Left
                cval(x-1, y  , life) + 
                cval(x-1, y+1, life) + 
                cval(x  , y-1, life) + 
                cval(x  , y+1, life) + 
                cval(x+1, y-1, life) + 
                cval(x+1, y  , life) + 
                cval(x+1, y+1, life);

			# Apply game of life rules
            
      var idx: Int = coord(x, y);

      if cval(x, y, life) == 1
      {
        if total < 2 || total > 3
        {
          vseti(new, idx, 0);
        }
        else
        {
          vseti(new, idx, 1);
        }
      }
      else
      {
        if total == 3
        {
          vseti(new, idx, 1);
        }
        else
        {
          vseti(new, idx, 0);
        }
      }
		}
	}
}

fn display(life: [Int]) {
	# Iterate through life
	for x in 3..62 {
		for y in 0..240 {
			termpos(x-3, y);
			if cval(x-3, y, life) == 1 {
				print("█");
			} else {
				print(" ");
			}
		}
	}
}

fn main() Int {
	# Populate
	var life: [Int] = populate();
	display(life);
    curshide();
	# Play forever
	while true {
    var new: [Int] = populate();
		update(life, new);
		display(new);
    life = new;
		wait(100);
	}
	return 0;
}