
Delphi 7. Лабораторна робота №8. Тема: Програмування гри «о, щасливчик!».
Мета роботи: Навчитись працювати з файлами.
Хід роботи.
Всі питання, а також правильні і неправильні відповіді будуть зберігатися не в коді програми, а в зовнішньому INI-файлі, в якому всі дані розбиті на розділи.
Створіть в тому ж каталозі, що і майбутня програма, файл з ім'ям lucky.ini і введемо в нього наступний текст:
; початок файлу
[num]
num=3
[Questions]
1=Скільки клавіш на клавіатурі?
2=Основна несправність миші?
3=Основні файлові системи:
[Answers]
1=101
2=забруднення
3=FAT, NTFS
[Wrong]
1=100
11=96
111=116
2 =зависання
22=залипання
222=заїдання
3=AFX, KFX
33=ATF,NFTS
333=TAF,TNFS
Перший рядок - це коментар. Тут можна писати все, що завгодно. Перший розділ num містить тільки один параметр з таким же ім'ям, який вказує на кількість питань в тесті. Цей параметр знадобиться для того, щоб питання задавалися в довільній послідовності. Наступний розділ - Questions. У ньому знаходяться всі питання. У розділі Answers знаходяться правильні відповіді. У розділі Wrong знаходяться неправильні відповіді.
Для того щоб не створювати три розділи, кожен з яких містить неправильний варіант відповіді, використовуємо ідентифікацію за номером питання. Неправильні відповіді до першого питання знаходяться в параметрах 1, 11 і 111, до другого - в параметрах 2, 22 і 222, до п'ятнадцятого - в параметрах 15, 1515, 151 515 і т.д.
Завантажте систему візуального програмування Delphi.
Створіть новий проект програми: виконайте команду меню FileNew Application.
Дайте значення деяким властивостям форми Form1 згідно з таблицею.
Властивості форми гри "О, щасливчик"
Властивість |
Значення |
Пояснення |
BorderStyle |
bsSingle |
Тепер ніхто не зможе змінити розмір вікна і зробити нашу гру не привабливою. |
Caption |
Вітаємо вас на грі "О, счастливчик"! |
Заголовок вікна |
Height |
414 |
Висота |
Width |
380 |
Ширина |
Розмістіть на формі ряд компонентів з вкладки Standard палітри компонентів:
три компоненти Button (кнопка)
- кількість кнопок відповідає загальній кількості запитань (у нашому прикладі - 3);
RadioGroup (група перемикачів)
;
Memo (багаторядкове текстове поле)
;
два компоненти Label (напис)
.
Тепер розмістимо на компоненті RadioGroup1 (не на формі!) Чотири компоненти RadioButton (перемикач)
з тією ж вкладки Standard.
І, нарешті, розмістимо на формі шість компонентів Image (зображення)
з вкладки Additional палітри компонентів.
Змініть властивості перерахованих компонентів згідно з таблицею:
Компонент |
Властивість |
Значення |
Пояснення |
|
|
Buttonl, Button2 |
Caption |
Наступне питання >>>> |
Кнопка використовується для переходу до слідуючого питання |
|
|
Left |
104 |
Відступ зліва |
|
||
Top |
356 |
Відступ зверху |
|
||
Button2 |
Visible |
False |
При запуску програми кнопка відповіді на друге питання не видна |
|
|
RadioGroupl |
Caption |
Варианты ответов |
Заголовок группи перемикачів |
|
|
Font.Style |
[fsBold] |
Шрифт — напівжирний |
|
||
Font.Color |
clBlue |
Колір шрифта — синій |
|
||
Height |
90 |
Висота |
|
||
Left |
12 |
Відступ зліва |
|
||
|
|
|
|
|
|
|
Top |
256 |
Відступ зверху |
|
|
Width |
348 |
Ширина |
|
||
RadioButtonl |
Name |
an1 |
Перший варіант відповіді |
|
|
Caption |
|
Без надпису |
|
||
Font.Style |
[fsBold] |
Шрифт — напівжирний |
|
||
Font.Color |
clNavy |
Шрифт — темно-сиій |
|
||
RadioButtonl |
Left |
24 |
Відступ зліва |
|
|
Top |
280 |
Відступ зверху |
|
||
Width |
160 |
Ширина |
|
||
RadioButton2 |
Name |
an2 |
Другий варіант відповіді |
|
|
Caption |
|
Без надпису |
|
||
Font.Style |
[fsBold] |
Шрифт —напівжирний |
|
||
Font.Color |
clNavy |
Шрифт — темно-синий |
|
||
Left |
192 |
Відступ зліва |
|
||
Top |
280 |
Відступ зверху |
|
||
Width |
160 |
Ширина |
|
||
RadioButton3 |
Name |
an3 |
Третій варіант відповіді |
||
Caption |
|
Без надпису |
|||
Font.Style |
[fsBold] |
Шрифт — напівжирний |
|||
Font.Color |
clNavy |
Шрифт — темно-синий |
|||
Left |
24 |
Відступ зліва |
|||
Top |
312 |
Відступ зверху |
|||
|
|
|
|||
|
Width |
160 |
Ширина |
||
RadioButton4 |
Name |
an4 |
Четвертий варіант відповіді |
||
Caption |
|
Без надпису |
|||
Font.Style |
[fsBold] |
Шрифт — напівжирний |
|||
Font.Color |
clNavy |
Шрифт — темно-синій |
|||
Left |
192 |
Відступ зліва |
|||
Top |
312 |
Відступ зверху |
|||
Width' |
160 |
Ширина |
|||
Memol |
Color |
clActiveBorder |
Замальовуєм поле питання |
||
Height |
90 |
Висота |
|||
Lines |
|
Очистити вміст |
|||
Left |
12 |
Відступ зліва |
|||
Top |
156 |
Відступ зверху |
|||
Readonly |
True |
Заборона на зміну вмісту поля |
|||
Width |
348 |
Ширина |
|||
Label1 |
Caption |
О, счастливчик! |
Назва гри |
||
Align |
a ITop |
Розміщення вздовж верхнього краю форми |
|||
Alignment |
taCenter |
Вирівнювання тексту — по центру |
|||
Font.Style |
[fsBold] |
Шрифт — напівжирний |
|||
Font.Size |
12 |
Размер шрифта — 12 |
|||
Font.Color |
clRed |
Шрифт— червоний |
|||
Label2 |
Caption |
Первый вопрос: |
Відображає номер даного питання |
||
Font.Style |
[fsBold] |
Шрифт — напівжирний |
|||
Left |
16 |
Відступ зліва |
|||
Top |
140 |
Відступ зверху |
Компоненти Image використовуються для відображення малюнків, які відповідають використаним і невикористаним підказок типу "50 на 50", "Дзвінок другу" і "Допомога залу" (три малюнки - для використаних підказок і три - для невикористаних).
Присвойте властивостям кожного з компонентів Image значення згідно таблиці:
Властивість
Значення
Пояснення
AutoSize
True
Розмір компонену вибирається автоматично в залежності від властивостей Picture
Тор
32
Відступ зверху
Cursor
crHelp
При разміщенні над рисунком показник миші набуває форму
?
Тепер присвойте властивості, унікальні для кожного з шести компонентів Image:
Компонент |
Властивість |
Значення |
Пояснення |
Image1 |
Name |
yes50 |
Малюнок, що відповідає не використаній підказці типу "50 на 50" |
Left |
16 |
Відступ зліва |
|
Picture |
|
Відповідний малюнок |
|
Image2 |
Name |
yesZvonok |
Малюнок, що відповідає не використаній підказці типу «Звонок другу» |
Left |
132 |
Відступ зліва |
|
Picture |
|
Відповідний малюнок |
|
Image3 |
Name |
yesZаl |
Малюнок, що відповідає не використаній підказці типу «Помощь зала» |
Left |
252 |
Відступ зліва |
|
Picture |
|
Відповідний малюнок |
|
Image4 |
Name |
no50 |
Малюнок, що відповідає використаній підказці типу "50 на 50" |
Left |
16 |
Відступ зліва |
|
Picture |
|
Відповідний малюнок |
|
Visible |
False |
Спочатку невидимий |
|
Image5 |
Name |
noZvonok |
Малюнок, що відповідає використаній підказці типу «Звонок другу» |
Left |
132 |
Відступ зліва |
|
Picture |
|
Відповідний малюнок |
|
Visible |
False |
Спочатку невидимий |
|
Image6 |
Name |
noZаl |
Малюнок, що відповідає використаній підказці типу «Помощь зала» |
Left |
252 |
Відступ зліва |
|
Picture |
|
Відповідний малюнок |
|
Visible |
False |
Спочатку невидимий |
Розробка програмного коду.
Оголосіть всі змінні, які будуть використані в програмі:
var
Forml: TForml;
rang: boolean; // перевірка на наявність lucky.ini;
ss, dir: string; // для зберігання шляху до робочої папки і до файлу lucky.ini
i, a, n, pd: integer; // i - лічильник масивів;
// А - номер поточного питання;
// N - кількість питань у базі;
// Pd - для підказки 50/50, для того,
// Щоб випадково не прибрали 1 або 3 варіантів
win: TiniFile; // для роботи з ini-файлом
mass: array [1 .. 10] of integer; // масив містить номери питань, які вже були задані, щоб уникнути повторення питань
Перша подія OnCreate форми:
procedure TForml.FormCreate (Sender: TObject);
label ran ; // оголошуємо мітку
begin
Randomize; // дізнаємося поточний каталог, з якого запускається наша програма
dir: = GetCurrentDir;
ss: = dir + '\ lucky.ini'; // розміщення бази даних
// Перевіряємо чи існує файл з питаннями
rang: = FileExists (ss);
if rang = False
then begin // якщо файлу немає виводимо повідомлення про його відсутність
MessageDlg ('Файл не знайдений: lucky.ini!', MtError, [mbok], 0);
halt; // і виходимо з програми
end;
win: = TIniFile.Create (ss);
// З розділу num дізнаємося кількість питань
ss: = win.ReadString ('num', 'num', ss);
n: = strtoint (ss);
ran: / / мітка
a: = random (n) + 1;
for i: = l to n do // порівнюємо з усіма, що були задані раніше
if mass [i] = a then goto ran; //і якщо таке питання вже був заданий, то згенерувати новий
for i: = 1 to n do
if mass [i] = 0 then begin mass [i]: = а; // запам'ятати, що це питання вже задавалося
break;
end;
// Заносимо в Memol випадково згенерований питання
Memol.Text: = win.ReadString ('Questions', IntToStr (a), Memol.text);
// Правильну відповідь
anl.Caption: = win.ReadString ('Answers', IntToStr (a), anl.Caption);
// Перший варіант
an2.Caption: = win.ReadString ('Wrong', IntToStr (a), an2.Caption);
/ / Другий
аn3.Caption: = win.ReadString ('Wrong', IntToStr (a) + IntToStr (a),
аn3.Caption);
/ / І третій
an4.Caption: = win.ReadString ('Wrong', IntToStr (a) + IntToStr (a) + IntToStr (a), an4.Caption);
win.Free;
end;
Для роботи з ini-файлами необхідно підключити модуль IniFiles:
unit Unitl;