begin
comment Game of Life;
integer array table[0:2,0:2];
procedure initialisetable (table, M,N);
integer array table;
integer M,N;
begin
integer i,j;
for i:=0 step 1 until (M-1) do
for j:=0 step 1 until (N-1) do
begin
if (i != j) then
table[i,j]:= 0
else
table[i,j]:=1;
end
end;
procedure printtable (table,M,N);
integer array table;
integer M,N;
begin
integer i,j;
for i:=0 step 1 until M-1 do
begin
for j:=0 step 1 until N-1 do
begin
outinteger(1, table[i,j]);
end;
outstring(1, "\n")
end
end;
procedure applyRules (table, M,N);
integer array table;
integer M,N;
begin
integer Neighbours,actual,i,j;
integer array prevGen[0:2,0:2];
copytable(prevGen,table,M,N);
for i:=0 step 1 until M-1 do
begin
for j:=0 step 1 until N-1 do
begin
actual := prevGen[i,j];
countNeighboursAlive (prevGen,M,N,i,j,Neighbours);
if (actual = 1) then
begin
if (Neighbours < 2) then
table[i,j]:=0
else
if (Neighbours <= 3) then
table[i,j]:=1
else
table[i,j]:=0;
end
else
if (Neighbours = 3) then table[i,j]:=1;
end;
end
end;
procedure countNeighboursAlive (table, M,N, x,y, Neighbours);
value M,N,x,y;
integer array table;
integer M,N,x,y,Neighbours;
begin
boolean isNeighbour;
integer i,j;
Neighbours := 0;
for i:=(x-1) step 1 until (x+1) do
begin
for j:=(y-1) step 1 until (y+1) do
begin
isNeighbour := ( (i>=0) and (j>=0) and (i<M) and (j<N) and ( (x != i) or (y != j) ) );
if isNeighbour then
begin
if (table[i,j] = 1) then Neighbours := Neighbours +1
end
end;
end
end;
procedure copytable (prevGen,table,M,N);
begin
integer i,j;
for i:=0 step 1 until (M-1) do
for j:=0 step 1 until (N-1) do
prevGen[i,j]:= table[i,j];
end;
initialisetable(table,3,3);
printtable(table,3,3);
applyRules(table,3,3);
printtable(table,3,3);
end