- •Оглавление
- •Введение
- •Глава 1
- •Использование компонентов общего назначения: tLabel, tButton, tEdit, tShape, tTimer, tPanel
- •1.1.1. Проект «Калькулятор»
- •1.1.2. Проект «Таймер»
- •1.1.3. Проект «Светофор»
- •1.1.4. Проект «Движение шарика tShape с отражением»
- •Глава 2
- •2.1. Класс tCanvas, его свойства и методы
- •2.1.1. Рисование узоров
- •2.1.2. Рисование поля для различных игр
- •2.1.3. Рисование координатной сетки
- •2.1.4. Построение графиков элементарных функций
- •2.2. Класс tBitmap и работа с растровыми рисунками
- •2.2.1. Рисование на поле растрового рисунка
- •2.2.2. Движение двоичного образа по фоновой картинке
- •2.3. Компонент tImage и его использование
- •2.3.1. Проект «Движение компонента tImage»
- •2.3.2. Перемещение картинок
- •2.3.3. Проект «Движение компонента tImage
- •Глава 3
- •3.1. События от мыши
- •3.1.1. Проект «Попади в мишень»
- •3.1.2. Проект «Снежинки»
- •3.1.3. Проект «Крестики-нолики»
- •3.1.4. Движение образа по удерживанию левой кнопки мыши
- •3.1.5. Проект «Жизнь клеток»
- •3.2. События от клавиатуры
- •3.2.1. Код клавиши
- •3.2.2. Управляемое движение образа
- •3.2.3. Совмещение управляемого и неуправляемого движений.
- •Глава 4
- •4.1. Проект «Простейший графический редактор»
- •Глава 5
- •5.1. Создание кнопок
- •5.1.1. Проект «Лохотрон»
- •5.1.2. Игра «Пятнадцать»
- •5.2. Создание компонентов tImage
- •5.2.1. Проект «Угадай картинку»
- •5.2.2. Проект «Собери картинку»
- •Глава 6
- •6.1. Компоненты tStringGrid и tDrawGrid
- •6.1.1. Сортировка массива
- •6.1.2. Проект «Таблица успеваемости»
- •6.1.3. Система предварительной продажи билетов
- •6.1.4. Проект «Таблица рисунков»
- •6.1.5. Рисование в таблице tDrawGrid
- •6.2. Компоненты tListBox, tCombobox ,
- •6.2.1. Прорисовка изображений в списке tListBox
- •6.2.2. Проект «Зоомагазин»
- •6.2.3. Проект «Шуточная игра»
- •6.2.4. Проект «Редактирование списка вопросов»
- •Глава 7
- •7.1. Тест «Знаете ли вы загадки?»
- •7.2. Проект «Исторические даты»
- •Глава 8
- •8.1. Компоненты tOpenDialog, tSaveDialog – диалоги
- •8.1.1. Просмотр текстовых файлов
- •8.2. Добавление и удаление записей в файл и из файла
- •8.2.1. Проект «Журнал группы»
- •8.3. Файлы для проекта «Судоку»
- •Глава 9
- •9.1. Просмотр видеофильма с использованием
- •9.2. Простейшая мультипликация
- •Глава 10
- •10.1. Пример использования try… except
- •Глава 11
- •11.1. Оформление проекта
- •11.1.1. Проект «Бегущая строка»
- •11.1.2. Проект «Титры»
- •11.1.3. Общие рекомендации по оформлению
- •11.2. Рекомендации для отчета по проекту
- •11.3. Темы проектов
- •11.3.1. Головоломка «Сквэрворд»
- •11.3.2. Задача «Путешествие по маршруту»
- •11.3.3. Головоломка «Ходом коня»
- •11.3.4. Задача «Извилистый путь»
- •11.3.5. Головоломка «Фишки на поле»
- •Список литературы
- •630058, Новосибирск, ул. Русская, 35
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. Положите таймер и сделайте на форме свой таймер с тем, чтобы на сборку картинки установить ограничение по времени.