|
|
1.1 root 1: cell = cluster is new, set_neighbors, set_test_list,
2: clear,
3: get_x, get_y,
4: set_generation, get_generation,
5: set_alive, get_alive,
6: born_neighbor, dead_neighbor,
7: get_died, get_born,
8: generate, affect_neighbors
9:
10: cells = sequence[cell]
11: acell = array[cell]
12:
13: rep = record[
14: Alive_Last: bool,
15: Alive_Now: bool,
16: Generation: int,
17: Neighbors: cells,
18: Neigh_Count: int,
19: Test_List: acell,
20: X: int,
21: Y: int
22: ]
23:
24: New = proc (X: int, Y: int) returns (cvt)
25: return (rep${
26: Alive_Last: false,
27: Alive_Now: false,
28: Generation: -1,
29: Neighbors: _cvt[null, cells](nil),
30: Neigh_Count: 0,
31: Test_List: _cvt[null, acell](nil),
32: X: X,
33: Y: Y
34: })
35: end New
36:
37: Set_Neighbors = proc (C: cvt, Ns: cells)
38: C.Neighbors := Ns
39: end Set_Neighbors
40:
41: Set_Test_List = proc (C: cvt, TL: acell);
42: C.Test_List := TL
43: end Set_Test_List;
44:
45: Clear = proc (C: cvt, G: int);
46: C.Alive_Last := false
47: C.Alive_Now := false
48: C.Generation := G
49: C.Neigh_Count := 0
50: end Clear;
51:
52: Get_X = proc (C: cvt) returns (int);
53: return (C.X)
54: end Get_X;
55:
56: Get_Y = proc (C: cvt) returns (int);
57: return (C.Y)
58: end Get_Y;
59:
60: Set_Generation = proc (C: cvt, G: int);
61: C.Generation := G
62: end Set_Generation;
63:
64: Get_Generation = proc (C: cvt) returns (int);
65: return (C.Generation)
66: end Get_Generation;
67:
68: Set_Alive = proc (C: cvt, Al: bool, Generation: int) returns (bool)
69: C.Alive_Last := C.Alive_Now
70: C.Alive_Now := Al
71: Changed: bool := C.Alive_Last ~= Al
72: if (Changed cand
73: (C.Generation ~= Generation))
74: then acell$AddH(C.Test_List, up(C))
75: C.Generation := Generation
76: end
77: return (Changed)
78: end Set_Alive
79:
80: Get_Alive = proc (C: cvt) returns (bool);
81: return (C.Alive_Now)
82: end Get_Alive;
83:
84: Born_Neighbor = proc (C: cvt)
85: C.Neigh_Count := C.Neigh_Count + 1
86: end Born_Neighbor
87:
88: Dead_Neighbor = proc (C: cvt)
89: C.Neigh_Count := C.Neigh_Count - 1
90: end Dead_Neighbor
91:
92: Get_Died = proc (C: cvt) returns (bool)
93: return (C.Alive_Last cand ~ C.Alive_Now)
94: end Get_Died
95:
96: Get_Born = proc (C: cvt) returns (bool)
97: return (C.Alive_Now cand ~ C.Alive_Last)
98: end Get_Born
99:
100: Generate = proc (C: cvt) returns (bool)
101: C.Alive_Last := C.Alive_Now
102: Count: int := C.Neigh_Count
103: if ((Count < 2) cor (Count > 3))
104: then C.Alive_Now := false
105: elseif (Count = 3)
106: then C.Alive_Now := true
107: end
108: return (C.Alive_Now ~= C.Alive_Last)
109: end Generate
110:
111: Affect_Neighbors = proc (C: cvt, Generation: int)
112: if (C.Alive_Last)
113: then if (~ C.Alive_Now)
114: then for N: cell in cells$Elements(C.Neighbors) do
115: NR: rep := down(N)
116: NR.Neigh_Count := NR.Neigh_Count - 1
117: if (NR.Generation ~= Generation)
118: then acell$AddH(NR.Test_List, N)
119: NR.Generation := Generation
120: end
121: end
122: if (C.Generation ~= Generation)
123: then acell$AddH(C.Test_List, up(C))
124: C.Generation := Generation
125: end
126: end
127: else if (C.Alive_Now)
128: then for N: cell in cells$Elements(C.Neighbors) do
129: NR: rep := down(N)
130: NR.Neigh_Count := NR.Neigh_Count + 1
131: if (NR.Generation ~= Generation)
132: then acell$AddH(NR.Test_List, N)
133: NR.Generation := Generation
134: end
135: end
136: if (C.Generation ~= Generation)
137: then acell$AddH(C.Test_List, up(C))
138: C.Generation := Generation
139: end
140: end
141: end
142: end Affect_Neighbors
143: end cell
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.