- •Оглавление
- •Введение
- •Глава 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.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;
Задание. Организуйте проверку, получилось ли выигрышное расположение. Также для удобства положите на форму кнопку «Начать заново» и напишите соответствующий код.