Blame lazarus/life/unit1.pas

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