program conway;
const cellwidth = 4;
      cellheight = 4;
      cols = 40;
      rows = 25;

      WHITE = 1;
      BLACK = 0;

type gridType = array [1..rows, 1..cols] of integer;

var grid:gridType;
    ch:char;

procedure initGrid(var g:gridType);
var x,y:integer;
begin
	randomize;
	for y := 1 to rows do
		for x := 1 to cols do
			if (random and 1024) > 512 then
				grid[y,x] := 1;
end;

procedure updateGrid;
var oldGrid:gridType;
    neighbors:integer;
    x,y:integer;
    wasAlive:boolean;
    isAlive:boolean;
    gen:integer;
begin
	oldGrid := grid;
	for y := 1 to rows do
		for x := 1 to cols do
		begin
			wasAlive := oldGrid[y,x] > 0;
			isAlive := false;

			neighbors := 0;

			if y > 1 then
			begin
				if x > 1 then
					if oldGrid[y-1,x-1] > 0 then neighbors := neighbors + 1;

				if oldGrid[y-1,x] > 0 then neighbors := neighbors + 1;

				if x < cols then
					if oldGrid[y-1,x+1] > 0 then neighbors := neighbors + 1;
			end;

			if x > 1 then
				if oldGrid[y,x-1] > 0 then neighbors := neighbors + 1;
			if x < cols then
				if oldGrid[y,x+1] > 0 then neighbors := neighbors + 1;

			if y < rows then
			begin
				if x > 1 then
					if oldGrid[y+1,x-1] > 0 then neighbors := neighbors + 1;

				if oldGrid[y+1,x] > 0 then neighbors := neighbors + 1;

				if x < cols then
					if oldGrid[y+1,x+1] > 0 then neighbors := neighbors + 1;
			end;

			if wasAlive then
			begin
				if (neighbors = 2) or (neighbors = 3) then
					isAlive := true;
			end
			else
			if neighbors = 3 then
				isAlive := true;
			if isAlive then
			begin
				gen := grid[y,x];
				if gen < 8 then gen := gen + 1;
				grid[y,x] := gen;
			end
			else
				grid[y,x] := 0;
		end;
end;

procedure drawGrid;
var x,y:integer;
    color:integer;
    screenx,screeny:integer;
begin
	for x := 1 to cols do
		for y := 1 to rows do
		begin
			color := grid[y,x];

			screenx := x * cellwidth;
			screeny := y * cellheight;
			putpixel(screenx,screeny,color);
			putpixel(screenx+1,screeny,color);
			putpixel(screenx,screeny+1,color);
			putpixel(screenx+1,screeny+1,color);
		end;
end;

begin
	initGraphics;
	initGrid(grid);
	repeat
		drawGrid;
		updateGrid;
		{ delay(100); }
	until conavail;
	read(ch);
end.
