Вдосконалюємо гру Match Game

Незважаючи на те що перший зразок програми Match Game, безсумнівно, працює, він вимагає певної естетичної доопрацювання По-перше, користувачеві доводиться задовольнятися тим зображенням, яке ми поклали в керуючий елемент Image, коли проектували форму Було б куди краще, якби батьки, наприклад, могли завантажити будь-яку, на свій смак, картинку, перед тим як давати своїй дитині пограти в нашу гру Також було б непогано, якби кнопки могли зявлятися при кожному новому запуску програми в новому порядку У другій версії Match Game ми спробуємо розправитися з цими проблемами

Оригінальний текст другої версії програми Match Game можна знайти на компакт-диску

Давайте вирішувати проблеми по мірі їх надходження – спочатку подбаємо, щоб користувач міг динамічно завантажувати картинки в елемент Image під час виконання Додайте у форму головне меню (main menu), поклавши його на форму, відкриту в редакторі форм Додайте в головне меню пункт Файл з двома підпунктами – Вибрати картинку і Вихід На завершення перейдіть на вкладку Dialogs в палітрі компонентів (Component Palette) і перетягніть звідти на форму компонент Open Dialog (вікно діалогу відкриття файлу) Це той самий діалог, який ми збираємося використовувати, щоб дозволити користувачеві вибирати файл з растровим малюнком для відображення в ігровому полі

Додайте обробник для команди меню Вибрати картинку і додайте в нього наступні рядки: void __ fastcall TForm1 :: SelectImageClick (TObject * Sender)

{

OpenDialog-&gtFilter =

” Файли растрових малюнків (* Bmp) | * Bmp ; if (OpenDialog-> Execute ())

{

TPicture *pPicture = new TPicture

pPicture-&gtLoadFromFile( OpenDialog-&gtFileName ) Image1-&gtPicture = pPicture

}

}

В описі цього нехитрого, загалом, методу, присутні проте дві цікаві речі По-перше, ви побачили, як обмежувати файли заданим розширенням або типом Встановивши властивість Filter обєкта OpenDialog в тип, який ви хочете використовувати, ви обмежуєте список файлів, який відображається у вікні діалогу, файлами з відповідним розширенням Формат рядка має наступний загальний синтаксис:

Name|Type

де Name – Це той текст, який побачить користувач в випадаючому списку фільтрів Властивість Name зазвичай має структуру Опис (* ext), де ext – це розширення потрібних файлів У нашому випадку опис буде виглядати, як «Файли растрових малюнків», а розширення – bmp

Type – Це те дійсне розширення, яке ви хочете ввести Символ `| (трубопровід)

між цими двома частинами необхідний, його обовязково треба ввести

Наступна цікава річ стосується використання обєкта TPicture Ми ще не стикалися з TPicture, Так що варто познайомитися з ним ближче Обєкт TPicture використовується для зберігання растрових малюнків, іконок та інших графічних образів TPicture може бути відображений так само, як ми відображали растрові малюнки у другому розділі Крім того, ви можете завантажити обєкт TPicture безпосередньо з диска, використовуючи метод LoadFromFile, А також завантажити його з файлу ресурсів, про що ми до цих пір не говорили

Після того як ви отримали обєкт TPicture із завантаженою з файлу, обраного користувачем, картинкою, просто надайте цю картинку властивості Picture керуючого елемента Image Ось, власне, і все Керуючий елемент сам відобразить картинку в своєму полі

Отже, перша проблема дозволена Дозвіл другої проблеми трохи менш очевидно Ми хочемо, щоб заголовки на кнопках зявлялися у випадковому порядку На наше щастя бібліотека функцій CBuilder містить функцію, звану random, якій передається деяке значення, а вона повертає випадковим чином вибране число з проміжку від 0 до заданого значення Ми використовуємо цю функцію для виконання нашого завдання Ось код для нового методу FormCreate:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

char strings_1[MaxStringCount*2][ 20 ] char strings_2[MaxStringCount*2][ 20 ]

/ / Спочатку копіюємо всі рядки в масив

for ( int i=0 i&ltMaxStringCount*2-1 ++i )

{

strcpy ( strings_1[i], strNames[i])

strcpy ( strings_1[i+MaxStrCount], strNames[i])

}

/ / Тепер запамятаємо їх у довільному порядку

for ( int i=MaxStringCount*2-1 i&gt=0 –i )

{

int nInd = random( i)

/ / Кладемо цей рядок у другій масив

strcpy ( strings_2[i], strings_1[nInd] )

/ / Копіюємо останній рядок в цю позицію

strcpy ( strings_1[nInd], strings_1[i] )

}

int nStringIndex = 0

for ( int i=0 i&ltControlCount ++i )

{

TButton *pButton = dynamic_cast&ltTButton *&gt(Controls[i]) if ( pButton )

{

pButton-&gtCaption = strings_2[ nStringIndex ] if ( nStringIndex &lt MaxStringCount*2-1 ) nStringIndex ++

}

}

}

Крім того, оскільки я весь час повторюю про неприпустимість використання в програмі

«Магічних» (ключових) значень, додайте в початок файлу наступний опис:

const MaxStringCount = 8

У даному випадку ключовим значенням є кількість рядків, які ми збираємося використовувати

Процес розміщення заголовків в довільному порядку складається з трьох етапів Спочатку ми копіюємо всі рядки в одновимірний масив, розмір якого дорівнює подвоєному кількості рядків, з якими ми маємо справу До речі, тут виявляється ще одна перевага, повязане із зберіганням кількості рядків у вигляді константи Якщо ми коли-небудь вирішимо змінити кількість кнопок на формі і кількість рядків, які ми використовуємо для їх заповнення, все інше саме по собі зміниться відповідним чином

Після приміщення рядків у масив ми проходимо по масиву в зворотному порядку, на кожному кроці вибираючи випадковим чином рядок з наявних за допомогою функції random, яку ми до цього обговорили Кожен раз, коли ми вибираємо рядок в першому масиві, ми копіюємо останній рядок масиву в обрану позицію, видаляючи старе значення Обрана рядок (рядок в обраній позиції) копіюється у другій масив, в якому містяться рядки в тому порядку, в якому вони вибиралися Цей другий масив ми і будемо використовувати для визначення заголовків кнопках нашої форми

Заключна частина – це вже знайоме нам по минулій версії програми привласнення кожній кнопці нового заголовка Якщо ви тепер запустите програму Match Game 2, ви побачите щось схоже на вікно, зображене на рис 33

Отже, тепер у вас є цілком працездатна гра, в яку ваші діти можуть грати до нестями Правда, якщо ви, звичайно, не хочете виростити з дітей фанатів шоу Star Trek, вам краще змінити текст заголовків на що-небудь більш відповідне їм за віком

Незважаючи на те що ми непогано розважилися, а попутно і дізналися дещо про TPicture і TImageControls, Ви поки не багато дізналися про графік, вбудованої в CBuilder У наступному невеликому прикладі ви дещо дізнаєтеся про деякі особливості внутрішнього устрою системи

Приклад номер два: хрестики-нулики

Рис 33 Вікно оновленої програми Match Game

Хоча в прикладі ми і говорили весь час про використання TButton, в прикладі, що знаходиться на компакт-диску, я, насправді, використовував TBitBtn TBitBtn – клас, що успадковує від TButton, який може відображати (нести на кнопці) не тільки текст, а й зображення Якщо у вас діти настільки малі, що не вміють читати, можете спробувати докласти руку до зміни програми Match Game 2, так щоб використовувати малюнки замість тексту Все буде написано насправді практично так само, тільки замість властивості Caption (заголовок) вам доведеться використовувати властивість TBitBtn, яке називається Glyph (Характерний малюнок, «іконка» кнопки) Крім того, вам доведеться створити обєкти TPicture для кожного зображення, яке збираєтеся використовувати (так само, як ми це робили у процедурі завантаження картинки для ігрового поля) Разом з CBuilder поставляються непогані картинки, які ви можете знайти в директорії CBuilder \ Images вашого дерева каталогів

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*