Постановка задачи.Данная программа релизует известную игру 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); //Границы этого фрагмента
Задание 1. На титульном листе сделайте меню, в котором заведите позиции «Помощь играющему» и «Выбор картинки из файлов». Предложите на выбор около 5 картинок.