unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Image2: TImage;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Mriezka;
    procedure Rozkuskuj;
    procedure Rozhadz(Sender: TObject);
    procedure Nahlad(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    function Dnu(x,y,ind:Integer):Boolean;
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TBmp=record
    na:Trect;
    x,y:Integer;
    z:Trect;
  end;

var
  x1,x2,y1,y2:Integer;
  dex:Integer;
  Form1: TForm1;
  f,g:TCanvas;
  Obrazok:TBitmap;
  Bmp:array[1..20] of TBmp;
  mbLeft:Boolean;
  nah:Boolean;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  nah:=false;
  g:=Image1.Canvas;
  f:=Image2.Canvas;
  g.Pen.Color:=clBlack;
  g.Brush.Color:=clBtnFace;
  f.Pen.Color:=clBlack;
  f.Brush.Color:=clBtnFace;
  f.Rectangle(0,0,Image2.Width,Image2.Height);
  g.Rectangle(0,0,Image1.Width,Image1.Height);
  Obrazok:=TBitmap.Create;
  Obrazok.LoadFromFile('pozadie.bmp');
  f.StretchDraw(Rect(50,50,Image1.Width-50,Image1.Height-50),obrazok);
  Mriezka;
end;

procedure TForm1.Mriezka;
var
  i,j:Integer;
begin
 for i:=0 to 4 do
  for j:=0 to 3 do
   begin
     g.Rectangle(i*100+50,j*100+50,(i+1)*100+50,(j+1)*100+50);
   end;
end;

procedure TForm1.Rozkuskuj;
var
  i,j,xx,yy,ind:Integer;
begin
  randomize;
  for i:=0 to 4 do
   for j:=0 to 3 do
    begin
      ind:=i*4+j+1;
      bmp[ind].x:=random(500);
      bmp[ind].y:=random(400);
      bmp[ind].na:=Rect(bmp[ind].x,bmp[ind].y,bmp[ind].x+100,bmp[ind].y+100);
      bmp[ind].z:=Rect(i*100+50,j*100+50,(i+1)*100+50,(j+1)*100+50);
    end;
end;

procedure TForm1.Rozhadz(Sender: TObject);
var
  i:Integer;
begin
  g.Rectangle(0,0,Image1.Width,Image1.Height);
  Mriezka;
  rozkuskuj;
  nah:=true;
  Image1.Visible:=True;
  Image2.Visible:=False;
  for i:=1 to 20 do
   begin
     g.CopyRect(bmp[i].na,f,bmp[i].z);
   end;
end;

procedure TForm1.Nahlad(Sender: TObject);
begin
 if nah then
  begin
    Image1.Visible:=not(Image1.Visible);
    Image2.Visible:=not(Image2.Visible);
  end
  else
   begin
     Image1.Visible:=not(Image1.Visible);
    Image2.Visible:=not(Image2.Visible);
   end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pom:TBmp;
  ind:Integer;
  ozn:Boolean;
begin
  ozn:=False;
  ind:=20;
  repeat
   if Dnu(x,y,ind) and not(ozn) then
    begin
    ozn:=True;
    mbLeft:=True;
    end;
  dec(ind);
  until (ind=0) or (ozn);

end;

function Tform1.Dnu(x,y,ind:Integer):boolean;
begin
  if x-bmp[ind].x<100 then
   if x-bmp[ind].x>0 then
    if y-bmp[ind].y<100 then
     if y-bmp[ind].y>0 then
      begin
        x1:=x;
        y1:=y;
        result:=True;
        dex:=ind;
      end
     else Result:=False;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i:integer;
begin

  if mbLeft then
   begin
     g.Rectangle(0,0,600,500);
     Mriezka;
     for i:=1 to 20 do
       begin
         if not(i=dex) then
          g.CopyRect(bmp[i].na,f,bmp[i].z);
       end;
     for i:=1 to 20 do
      if i=dex then
       begin
         x2:=bmp[dex].x-x1+x;
         y2:=bmp[dex].y-y1+y;
         bmp[dex].na:=Rect(x2,y2,x2+100,y2+100);
         g.CopyRect(bmp[dex].na,f,bmp[dex].z);
       end;

   end;
end;

 procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i,j:Integer;
begin

  mbLeft:=False;
  bmp[dex].x:=x2;
  bmp[dex].y:=y2;
  for i:=0 to 4 do
   for j:=0 to 3 do
    begin
    if (abs(bmp[dex].x-(i*100+50))<10) and (abs(bmp[dex].y-(j*100+50))<10) then
     begin
       bmp[dex].x:=i*100+50;
       bmp[dex].y:=j*100+50;
       bmp[dex].na:=Rect(bmp[dex].x,bmp[dex].y,bmp[dex].x+100,bmp[dex].y+100);
     end;
    end;
    g.Rectangle(0,0,600,500);
    Mriezka;
   for i:=1 to 20 do
   g.CopyRect(bmp[i].na,f,bmp[i].z);
end;

end.