unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

const
  count = 20;
  speed = 10;
  br = 10;
  pr = 20;

var
  Form1: TForm1;
  score: integer;
  maxScore: integer;
  px, py: integer;
  bx, by: array[0..count] of integer;

implementation

{$R *.lfm}

procedure DrawPlayer(clear: boolean);
begin
  Form1.Canvas.Pen.Style := psClear;
  Form1.Canvas.Brush.Color := clBlue;
  if clear then Form1.Canvas.Brush.Color := Form1.Color;
  Form1.Canvas.Ellipse(px-pr, py-pr, px+pr, py+pr);
end;

procedure DrawBall(clear: boolean; i: integer);
begin
  Form1.Canvas.Pen.Style := psClear;
  Form1.Canvas.Brush.Color := clBlack;
  if clear then Form1.Canvas.Brush.Color := Form1.Color;
  Form1.Canvas.Ellipse(bx[i]-br, by[i]-br, bx[i]+br, by[i]+br);
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  score := 0;
  px := ClientWidth div 2;
  py := ClientHeight div 2;
  for i := 0 to count-1 do begin
    bx[i] := random(ClientWidth);
    by[i] := -random(ClientHeight);
  end;
  refresh;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  DrawPlayer(true);
  px := x;
  py := y;
  DrawPlayer(false);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to count-1 do begin
    DrawBall(true, i);
    by[i] := by[i] + speed;
    if by[i] > ClientHeight then begin
      bx[i] := random(ClientWidth);
      by[i] := -br;
    end;
    DrawBall(false, i);
  end;

  DrawPlayer(false);

  for i := 0 to count-1 do begin
    if sqr(br+pr) > sqr(bx[i]-px) + sqr(by[i]-py) then begin
      FormCreate(nil);
    end;
  end;

  score := score + 1;
  if score > maxScore then maxScore := score;
  Label1.Caption := IntToStr(score);
  Label2.Caption := IntToStr(maxScore);
end;

end.

