stify"> Лабораторна робота № 3. Тема: Створення логічної гри
Мета: Вивчення можливостей використання властивості Tag та об'єкта Sender.
Короткі теоретичні відомості.
Метою даної лабораторної роботи є написання наступної програми. Ігрова дошка містить сім клітин. На трьох лівих клітинах стоять червоні фішки, на трьох правих - сині. Центральна клітина порожня. Завдання полягає в тому, щоб, роблячи допустимі ходи, поміняти фішки місцями. Вид робочого вікна гри представлений нижче. <В
Правила ходів такі:
. Червоні фішки можуть ходити тільки вправо, сині - тільки вліво. p align="justify">. Ходити дозволяється тільки на вільне поле. p align="justify">. Можна переміщення на сусіднє поле і В«стрибокВ» через фішку. p align="justify"> У ході вирішення головоломки кнопки будуть рухатися, а вигляд вікна змінюватися. Тому необхідно точно задати геометричні параметри об'єктів. Налаштовувати параметри будемо, змінюючи властивості Top, Left, Height, Width компонентів. Параметри повинні бути наступними:
В
У чому полягає хід у грі? У тому, що одна з фішок-кнопок переноситься на вільне місце. Це означає, що достатньо вказати, який фішкою треба піти. Якщо фішка може зробити хід, то він тільки один. p align="justify"> Отже, користувач може вибрати хід, клацнувши на одній з кнопок. Тобто ми будемо обробляти подія OnClick (При клацанні). p align="justify"> Але ми повинні розрізняти кнопки, а також знати, де вони знаходяться і де знаходиться вільна клітина. Тому ми поступимо так: будемо зберігати додаткові дані прямо у властивостях об'єкта-кнопки. Для цього нам потрібно В«вільнеВ» властивість. Така властивість є: всі компоненти системи Delphi надають властивість Tag, яке програміст може використовувати на свій розсуд. p align="justify"> Властивість Tag може зберігати будь-яке ціле число. Нам потрібно зберігати два числа. По-перше, номер клітки, в якій знаходиться кнопка, а у других, ознака В«кольоруВ» фішки (від нього залежить, в який бік вона може ходити). Ці дані легко В«упакуватиВ» в одне ціле число: помножимо номер клітки на 2 і, якщо фішка синя, додамо до нього одиницю. Таке значення легко В«розібратиВ» назад на складові. Розділимо його на 2. Приватне дасть номер клітини, а залишок буде ознакою кольору фішки. p align="justify"> Хід роботи.
1. Розмістимо на формі компонент Panel (401 x 65). На панелі розташуємо 6 компонентів BitBtn (панель Additional) розміром 49 на 49. Властивість Top всіх компонентів буде дорівнює 8, Left - 64,120,232,288,344. br/>В
. Створіть за допомогою графічного редактора зображення червоного і синього трикутників або будь-яких інших фігур на ваш смак і збережіть їх у форматі bmp. Потім, використовуючи властивість Glyph компонента, помістіть зображення на кнопки. br/>
3. Тепер можна задати значення властивості Tag для всіх кнопок. По черзі виберемо фішки зліва направо і задамо для властивості Tag значення, наведені в таблиці. br/>
Значення свойстваКомментарий2первая клітина, червона фішка4вторая клітина, червона фішка6третья клітина, червона фішка11пятая клітина, синя фішка13шестая клітина, синя фішка15седьмая клітина, синя фішка
. Опишемо глобальну змінну n, в якій будемо зберігати номер порожньої клітки і змінну win, в якій буде міститися кількість ходів. p align="justify"> var1: TForm1;
n: integer = 4;: integer = 24;
Тут ми не тільки описуємо потрібні змінні, але і відразу присвоюємо їм початкове значення. Спочатку у нас порожня четверта клітинка, звідси і вибір цього числа, 24 - максимально можливе число ходів. p align="justify">. Виберемо першу кнопку і створимо обробник OnClick для неї. p align="justify"> procedure TForm1.BitBtn1Click (Sender: TObject); i, c, k, ak: integer; Sender as TBitBtn do: = Tag div 2;: = Tag mod 2;: = ni;: = abs (k); ak <3 then ((c = 0) and (k> 0)) or
((c = 1) and (k <0)) then: = tag +2 * k;: = left +56 * k;: = win-ak;: = i;;; win = 0 then: = Vaw!! ';. Color: = clFuchsia;// міняємо колір панелі
panel1.Enabled: = false;/всі кнопки, що знаходяться на панелі стають недоступними /;;
Зверніть увагу на те, що в процедуру передається параметр - об'єкт Sender. Він представляє саме той об'єкт, який викликав подія, і може дати доступ до його властивостей. Але прямо це не вийде. Програмі треба спеціально вказати, що об'єкт Sender в даному випадку слід вважати кнопкою. Для цього служить ключове слово as. Після нього вказують тип, якому насправді належить об'єкт Sender: Sender as T...