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

5.2.2. Проект «Собери картинку»

Постановка задачи. Данная программа релизует известную игру Puzzle и направлена на освоение типов TBitmap, TRect, метода CopyRect и навыков работы с двумерными массивами. Вид картинки до сборки и после перемешивания показан на рис. 32. Цель работы с приложением – собрать картинку.

Рис. 32. Проект «Собери картинку»

Реализация. Подберите фотографию и сохраните ее в папке проекта как растровый рисунок типа bmp. Положите на форму два компонента TPaintBox, один TImage и две кнопки «Показать картинку» и «Перемешать картинку». При создании формы (процедура FormCreate) создайте компонент Puzzle класса TBitmap, загрузите в него картинку из файла, установите размер формы, равный двум Puzzle.Width + 30 (30 пикселей на зазоры), установите размер компонентов PaintBox1 и PaintBox2, равным размеру Puzzle.

Картинку будем «резать» на 16 клеток (4 х 4). Размер одного фрагмента обозначим dx и dy.

dx:= Puzzle.Width div 4;

dy:= Puzzle.Height div 4;

Для хранения одного фрагмента картинки используйте компонент TImage. Сделайте его размер равным размеру фрагмента, т. е. dx и dy. Сделайте Image1 невидимым.

Также задайте начальное значение переменной click1, которая подсчитывает число «кликов»:

click1 := 1; {Номер "клика": первый клик и далее нечетный клик выбирает первый фрагмент, второй – четный, выбирает второй фрагмент и меняет их местами}

Опишите глобальные переменные:

var

puzzle:TBitmap;

rect1,rect2:Trect;

click1,i,j,dx,dy:integer;

pole: array[1..4,1..4] of integer;

Обработчик кнопки «Показать картинку» выводит исходный рисунок в Paintbox1.

procedure TForm1.Button1Click(Sender: TObject);

begin

paintbox1.Canvas.Draw(0,0,puzzle);

end;

В следующей процедуре создаем перемешанный рисунок. Разбиваем рисунок на 16 квадратных фрагментов и перемешиваем их. «Перемешанный» рисунок помещаем в Paintbox2.

procedure TForm1.Button2Click(Sender: TObject);

var k,n,x,y:integer;

begin

{Заполняем двумерный массив нyлями. С помощью массива будем определять, помещен ли в соответствующую клетку фрагмент рисунка. Если в массиве 0, то это свободное поле, где еще не поставлен фрагмент.}

for i := 1 to 4 do

for j := 1 to 4 do

pole[i,j]:=0; //Весь массив заполнили нулями

for i := 1 to 4 do

for j := 1 to 4 do

begin // Ищем свободное поле

repeat

k:=random(4)+1;

n:=random(4)+1;

until pole[k,n]=0;

pole[k,n]:=1; //Заполняем его единицей

x:=(j-1)*dx; //Координаты фрагмента, который мы

//скопируем из PaintBox1 в Paintbox2

//на случайно выбранное место

y:=(i-1)*dy;

rect1:=bounds(x,y,dx,dy); //Границы этого фрагмента

//сохраняем в переменной rect1

x:=(n-1)*dx; //Координаты случайно выбранного

y:=(k-1)*dy; // фрагмента в Paintbox2

rect2:=bounds(x,y,dx,dy); //Границы этого фрагмента

//сохраняем в переменной rect2

//Копируем фрагмент из Paintbox1 в Paintbox2

paintbox2.Canvas.CopyRect(rect2,paintbox1.Canvas,rect1);

end;

//Чертим клетки на Paintbox2

with paintbox2.Canvas do

begin

pen.Color:=clblack;

pen.Width:=1;

for i:=1 to 3 do

begin

moveto(0, dy*i);

lineto(paintbox2.Width,dy*i);

moveto(dx*i,0);

lineto(dx*i,paintbox2.Height);

end;

end; end;

В обработчике события OnMouseDown на компоненте PaintBox2 напишите следующий код.

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

var u,v:integer; rect3:Trect;

procedure XYtoUV(x,y:integer; var u,v:integer);

//Процедура находит номер строки и столбца, в которых

// находится фрагмент c координатами Х и Y

begin

u:=(x div dx)*dx;

v:=(y div dy)*dy;

end;

begin

XYtoUV(x,y,u,v);

rect2:=bounds(0,0,dx,dy); //Границы фрагмента,

// скопированного в Image1

// Если это нечетный "клик",

if click1 mod 2=1 then

begin

//Копируем фрагмент в Image1.

rect1:=bounds(u,v,dx,dy);

image1.Canvas.CopyRect(rect2,paintbox2.Canvas,rect1);

end

else

// Если это четный "клик"

begin

//Меняем местами два фрагмента

rect3:=bounds(u,v,dx,dy);

paintbox2.Canvas.CopyRect(rect1,paintbox2.Canvas,rect3);

paintbox2.Canvas.CopyRect(rect3,Image1.Canvas,rect2);

end;

click1:=click1+1;

end;

Задание 1. На титульном листе сделайте меню, в котором заведите позиции «Помощь играющему» и «Выбор картинки из файлов». Предложите на выбор около 5 картинок.

Задание 2. Сделайте программную проверку правильности сборки картинки с положительной похвалой.

Задание 3. Можно завести таблицу рекордов, в которую помещать минимальные количества кликов, необходимых для сборки картинки.

Задание 4. Положите таймер и сделайте на форме свой таймер с тем, чтобы на сборку картинки установить ограничение по времени.