Как вы думаете, какие самые игры: WarCraft, Quake? Нет! Минёр, тетрис, «шарики» – вот игры всех времён и народов. В «серьёзные» игры играют не все, а в тетрис на компьютере играл каждый!
Сегодня мы напишем одну из таких “ZBestGame” – “Пятнашки”.Смысл игры: выбранная пользователем картинка разбивается на 16 кусочков, перемешивается и её ,естессно, надо собрать.
Сначала займёмся интерфейсом. Поместите на форму компонент ToolBar1, и в нём разместите 5 кнопок Toolbutton.
Вот какие функции они будут выполнять:
ToolButton1-Новая игра
ToolButton2-Показать/Спрятать оригинал
ToolButton3-Заново перемешать картинку
ToolButton4-О программе
ToolButton5-Выход
Задайте кнопкам соответствующие картинки. Для этого создайте компонент ImageList, добавьте в него иконки, и пропишите его в свойстве Imagesкомпонента ToolBar. Ещё нам понадобится компонент OpenPictureDialog и 3 компонента Image.В их свойства Widthи Heightпоставьте 200. Один из них назовите Mapи поместите на форме слева – здесь появится разрезанная картинка. Второй Imageназовите Originalи поместите правее первого. В нём будет оригинал картинки. Третий Imageназовите StrechImageи
сделайте его невидимым – это служебный Imageи пользователю его видеть не положено :)).
Теперь приступим к кодерству. Объявите глобальные переменные:
pic: array[1..16] of TBitMap;
mass: array [1..4, 1..4] of smallint;
orig:boolean;
В массиве picу на будут храниться кусочки мозайки, а в mass – индексы картинок..
Эта процедура загружает выбранную пользователем картинку в Original, а затем с помощью метода StrechDrawкопирует в StrechImageуже в том разрешении,которое нам и нужно: 200x200. Дальше сжатая картинка разбивается на 16 кусков, которые последовательно записываются в массив pic. Pic[16]
затирается – это будет пустая ячейка, благодаря которой можно перемещать остальные кусочки.
Теперь сделаем процедуру, которая в случайном порядке введёт индексы кусочков мозайки в массив mass.
procedure TMain.Restart;
var i, j: smallint;
f: boolean;
bool: array [1..16] of boolean;
begin
For i:= 1 to 16 do bool[i]:=false;
For j:= 1 to 4 do
begin
For i:= 1 to 4 do
begin
f:=true;
while f=true do
begin
mass[i, j]:=random(16)+1;
If bool[mass[i, j]]=false then
begin
bool[mass[i, j]]:=true;
f:=false;
end;
end;
end;
end;
Draw;
end;
Посутиделамыперемешаликусочкимозайки. Теперь их нужно нарисовать, для этого создадим процедуру Draw.
procedure TMain.Draw;
var i, j, x, y: smallint;
begin
x:=0;
y:=0;
For j:= 1 to 4 do
begin
For i:= 1 to 4 do
begin
Map.canvas.draw(x, y, pic[mass[i, j]]);
x:=x+50;
end;
x:=0;
y:=y+50;
end;
end;
Всё, с «самопальными» процедурами закончено, начнём прописывать события, связанные с интерфейсом.
procedure TMain.FormCreate(Sender: TObject);
var i:smallint;
begin
orig:=true;
for i:= 1 to 16 do
begin
pic[i]:=TBitMap.create; //Выделяем в памяти место под наши картинки
Здесь остановимся подробнее. При запуске программы оригинал картинки виден. При этом длина моей формы – 436. При нажатии кнопки «Спрятать оригинал» форма должна уменьшить свою длину, спрятав оригинал. Когда моя форма укорочена, её длина равна 223. У вас скорее всего будут другие результаты! Поэтому «померьте» свою форму в «суженном» и «расширенном» состояниях, пропишите в процедуре ToolButton2ClickСВОИ ЗНАЧЕНИЯ!
Теперь самое интересное – процедура обработки кликлв мышки на компоненте map.
Процедура довольно громоздкая, но ничего страшного в ней нет!
В переменных posXи posYмы вычисляем на каком по номеру кусочке мозаики щёлкнул пользователь,и если справа, слева, сверху или снизу есть пустой квадратик – меняет их местами.
Напоследок давайте сделаем небольшой чит-код(Разработчики называют их «Eastereggs» - “Пасхальные яйца”). При нажатии клавиши «w» с зажатым Shift’ом, картинка будет складываться сама ;))
procedure TMain.FormKeyPress(Sender: TObject; var Key: Char);
var i, j: smallint;
begin
If (key='W') and (Map.Enabled=true) then
begin
For j:= 1 to 4 do
begin
For i:= 1 to 4 do mass[i, j]:=(4*j) - (4-i);
end;
Draw;
end;
end;
//Включаем генератор случайных чисел
initialization
randomize;
По своему усмотрению прикрутите к проге секундомер, подсчёт сделанных «телодвижений» и вуаля – вполне работоспособная игрушка готова!