- Создать новый проект. Установить на форме командную кнопку, задать имя для нее Pole.
  - Объявить массив объектов и переменные:
  
 game:array[0..15] of TButton;
 d,i:integer;
 3. Для формы изменить свойство AutoSize - True, выбрать событие Сreate и ввести код:
 Var
 row,col:integer;
 Begin
 d:=50;// размер кнопки
 For i:=0 to 15 do
 Begin
 game[i] := TButton.Create(pole) ;
 game[i].Parent := Form1;
 game[i].Width :=d ; game[i].Height :=d ;
 game[i].Font.Style :=pole.Font.Style ;
 game[i].Font.Size :=pole.Font.Size ;
 game[i].Caption :=inttostr(i);
 col:=i mod 4; //номер столбца для кнопки
 row:=i div 4; //номер строки для кнопки
 game[i].Top :=d*row;
 game[i].Left :=d*col;
 game[i].OnClick:=GameClick;
 End;
 game[0].Caption :=''; End;
 4. Объявить процедуру
 procedure GameClick( Sender: TObject);
  - Ввести код для этой процедуры:
  
 Procedure TForm1.GameClick(Sender: TObject);
 Var
 x0,y0,x,y,index:integer;
 Begin
 //определение номера нажатой кнопки
 For i:=0 to 15 do
 If game[i].Focused =true Then index:=i;;
 // координаты пустышки
 x0:=game[0].left;
 y0:=game[0].Top;
 //координаты нажатой кнопки
 x:=game[index].left;
 y:=game[index].Top;
 //если соседи по столбцу, то обмен
 If (x0=x) and (abs(y-y0)=d) Then
 Begin
 game[0].Left :=x; game[0].Top:=y;
 game[index].Left :=x0; game[index].Top:=y0;
 End;
 //если соседи по строке, то обмен
 If (y0=y) and (abs(x-x0)=d) Then
 Begin
 game[0].Left :=x; game[0].Top:=y;
 game[index].Left :=x0; game[index].Top:=y0;
 End;
 End;
  - Проверить работу программы.
  - Создать главное меню на форме из двух пунктов: Перемешать и Выход. Для пункта Перемешать ввести следующий код:
  
 randomize ;
 For v:=1 to 20 Do
 Begin
 row:=random(15)+1;
 game[row].SetFocus ;
 gameclick(game[row]);
 End;
  - Предложить способ, как можно определить что задача решена и вывести соответствующее сообщение.