|
|
7be447 |
unit Unit1;
|
|
|
7be447 |
|
|
|
7be447 |
{$mode objfpc}{$H+}
|
|
|
7be447 |
|
|
|
7be447 |
interface
|
|
|
7be447 |
|
|
|
7be447 |
uses
|
|
|
7be447 |
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|
|
7be447 |
ExtCtrls;
|
|
|
7be447 |
|
|
|
7be447 |
type
|
|
|
7be447 |
|
|
|
7be447 |
{ TForm1 }
|
|
|
7be447 |
|
|
|
7be447 |
TForm1 = class(TForm)
|
|
|
7be447 |
Button1: TButton;
|
|
|
7be447 |
Timer1: TTimer;
|
|
|
7be447 |
procedure Button1Click(Sender: TObject);
|
|
|
7be447 |
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
|
|
|
7be447 |
Shift: TShiftState; X, Y: Integer);
|
|
|
7be447 |
procedure FormPaint(Sender: TObject);
|
|
|
7be447 |
procedure Timer1Timer(Sender: TObject);
|
|
|
7be447 |
private
|
|
|
7be447 |
{ private declarations }
|
|
|
7be447 |
public
|
|
|
7be447 |
{ public declarations }
|
|
|
7be447 |
end;
|
|
|
7be447 |
|
|
|
7be447 |
const
|
|
|
7be447 |
rows = 20;
|
|
|
7be447 |
cols = 30;
|
|
|
7be447 |
size = 20;
|
|
|
7be447 |
var
|
|
|
7be447 |
Form1: TForm1;
|
|
|
7be447 |
field1, field2: array [0..cols, 0..rows] of boolean;
|
|
|
7be447 |
|
|
|
7be447 |
implementation
|
|
|
7be447 |
|
|
|
7be447 |
{$R *.lfm}
|
|
|
7be447 |
|
|
|
7be447 |
function getCell(x, y: integer): integer;
|
|
|
7be447 |
begin
|
|
|
7be447 |
Result := 0;
|
|
|
7be447 |
x := (x + cols) mod cols;
|
|
|
7be447 |
y := (y + rows) mod rows;
|
|
|
7be447 |
if field1[x, y] then Result := 1;
|
|
|
7be447 |
end;
|
|
|
7be447 |
|
|
|
7be447 |
procedure TForm1.FormPaint(Sender: TObject);
|
|
|
7be447 |
var
|
|
|
7be447 |
i, j: integer;
|
|
|
7be447 |
begin
|
|
|
7be447 |
Canvas.Brush.Color := clBlack;
|
|
|
7be447 |
for i := 0 to cols-1 do begin
|
|
|
7be447 |
for j := 0 to rows-1 do begin
|
|
|
7be447 |
Canvas.MoveTo(i*size, (j+1)*size);
|
|
|
7be447 |
Canvas.LineTo((i+1)*size, (j+1)*size);
|
|
|
7be447 |
Canvas.LineTo((i+1)*size, j*size);
|
|
|
7be447 |
if field1[i, j] then Canvas.Ellipse(i*size, j*size, (i+1)*size, (j+1)*size);
|
|
|
7be447 |
end;
|
|
|
7be447 |
end;
|
|
|
7be447 |
end;
|
|
|
7be447 |
|
|
|
7be447 |
procedure TForm1.Button1Click(Sender: TObject);
|
|
|
7be447 |
begin
|
|
|
7be447 |
Timer1.Enabled := not Timer1.Enabled;
|
|
|
7be447 |
end;
|
|
|
7be447 |
|
|
|
7be447 |
procedure TForm1.Timer1Timer(Sender: TObject);
|
|
|
7be447 |
var
|
|
|
7be447 |
i, j, count: integer;
|
|
|
7be447 |
begin
|
|
|
7be447 |
for i := 0 to cols-1 do begin
|
|
|
7be447 |
for j := 0 to rows-1 do begin
|
|
|
7be447 |
count := 0;
|
|
|
7be447 |
count := count + getCell(i-1, j-1);
|
|
|
7be447 |
count := count + getCell(i-1, j);
|
|
|
7be447 |
count := count + getCell(i-1, j+1);
|
|
|
7be447 |
count := count + getCell(i, j-1);
|
|
|
7be447 |
count := count + getCell(i, j+1);
|
|
|
7be447 |
count := count + getCell(i+1, j-1);
|
|
|
7be447 |
count := count + getCell(i+1, j);
|
|
|
7be447 |
count := count + getCell(i+1, j+1);
|
|
|
7be447 |
if field1[i, j] then begin
|
|
|
7be447 |
field2[i, j] := (count=2) or (count=3);
|
|
|
7be447 |
end else begin
|
|
|
7be447 |
field2[i, j] := count=3;
|
|
|
7be447 |
end;
|
|
|
7be447 |
end;
|
|
|
7be447 |
end;
|
|
|
7be447 |
field1 := field2;
|
|
|
7be447 |
Refresh;
|
|
|
7be447 |
end;
|
|
|
7be447 |
|
|
|
7be447 |
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
|
|
|
7be447 |
Shift: TShiftState; X, Y: Integer);
|
|
|
7be447 |
var
|
|
|
7be447 |
i, j: integer;
|
|
|
7be447 |
begin
|
|
|
7be447 |
i := x div size;
|
|
|
7be447 |
j := y div size;
|
|
|
7be447 |
if (i < cols) and (j < rows) then field1[i, j] := not field1[i, j];
|
|
|
7be447 |
refresh;
|
|
|
7be447 |
end;
|
|
|
7be447 |
|
|
|
7be447 |
end.
|
|
|
7be447 |
|