Blame lazarus/life/unit1.pas

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