Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

5.1.2. Игра «Пятнадцать»

Постановка задачи. Реализуйте известную игру «Пятнадцать», используя двумерный массив. Изначально числа расположены на 15 кнопках случайно. Результат работы после необходимых перестановок приведен на рис. 29. Надо учесть, что в данной игре не при всяком случайном расположении чисел возможен выигрыш.

Реализация. Опишем массив кнопок типа TButton и массив целых чисел. Глобальные данные:

const

n=4;

h=40; // Размер кнопки

x0=10; // Координаты левого верхнего угла поля

y0=10;

var a : array [1..n,1..n] of integer;

bt : array [1..n,1..n] of TButton;

i0, k0:integer; // Координаты пустого места

Рис. 29. Выигрыш в игре «Пятнадцать»

Процедура zapolnenie заполняет массив числами от 1 до 15, располагая их в случайные клетки поля.

procedure zapolnenie;

var i,j,k,m:integer;

zap:boolean;

begin

for i:=1 to n do

for j:=1 to n do

a[i,j]:=0;

for i:=1 to n*n-1 do

begin

zap:=false;

repeat

k:=random(n)+1;

m:=random(n)+1;

if a[k,m]=0 then

begin

a[k,m]:=i;

zap:=true;

end;

until zap;

end;

end;

Процедура swap() меняет значения двух переменных.

procedure swap(var a,b:integer);

var r:integer;

begin

r:=b;

b:=a;

a:=r;

end;

Метод FMD нажатия на кнопку находит координаты нажатой кнопки, проверяет, свободно ли рядом, и если свободно, то меняет число с пустой кнопкой. В процедуре FMD числа i0, k0 – это координаты пустой кнопки.

procedure TForm1.FMD(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var i,k:integer;

begin

k:=((Sender as TControl).Left-x0) div h +1;

i:=((Sender as TControl).Top-y0 )div h +1;

if ((abs(i-i0)=1)and(k=k0))or((abs(k-k0)=1)and(i=i0))then

begin // Рядом свободно

swap(a[i,k],a[i0,k0]);

bt[i,k].Caption:=' ';

bt[i0,k0].Caption:=inttostr(a[i0,k0]);

i0:=i;

k0:=k;

end;

end;

Наконец, обработчик TForm1.FormCreate заполняет массив чисел от 1 до 15 в случайном порядке, создает массив кнопок, задает размеры кнопок, устанавливает свойства шрифта, размещает кнопки на форме в виде таблицы.

procedure TForm1.FormCreate(Sender: TObject);

var i,j:integer;

begin

randomize;

zapolnenie;

// Создадим массив кнопок

for i:=1 to n do

for j:=1 to n do

begin

bt[i,j]:=TButton.Create(Form1);

bt[i,j].Parent:=Form1;

bt[i,j].Width:=h;

bt[i,j].Height:=h;

bt[i,j].Left:=x0+(j-1)*h;

bt[i,j].Top:=y0+(i-1)*h;

bt[i,j].Font.Size:=18;

bt[i,j].Font.Style:=[fsBold];

if a[i,j]<>0 then

bt[i,j].Caption:=inttostr(a[i,j])

else

begin // Запомним кнопку, где пусто

i0:=i;

k0:=j;

end;

bt[i,j].Visible:=True;

bt[i,j].OnMouseDown:=FMD;

end;

end;

Задание. Организуйте проверку, получилось ли выигрышное расположение. Также для удобства положите на форму кнопку «Начать заново» и напишите соответствующий код.