Wack-a-Mole на LabVIEW, частина 1


Сьогодні ще один дописувач ділиться своїми проблемами і просить допомоги у сфері програмування на LabVIEW. Цього разу задача трохи складніша, аніж попередня: нам потрібно реалізувати простий аналог гри Wack-a-Mole (Гримни Крота 🙂 ). Суть гри у тому, що з енної кількості нір на короткий проміжок часу висовуються кроти, а ми маємо встигнути вдарити кожного з них молотком по голові. Отака добра і весела розвага для дітей та любителів тваринок.

У термінах, відмінних від маленьких пухнастих звіряток (між іншим, ви знали, що для крота поняття “проти шерсті” не має сенсу – їх хутро однаково добре лягає у будь-яку сторону?) задача сформулюється трохи інакше. 

Сформувати ігрове поле з 4 об’єктів 2D-picture однакового кольору. Після натискання кнопки “Start” один з цих об’єктів, вибраний випадковим чином, підсвічується і залишається підсвіченим деякий час t. Протягом цього часу користувач має можливість  навести на цей об’єкт курсор миші і  клацнути на ньому. Якщо користувач встиг це зробити, то його рахунок (S) збільшується на 2, якщо ні, то зменшується на один (перед натисканням кнопки Start S=10).

Якщо минув інтервал часу t, або користувач натиснув на підсвічений об’єкт до закінчення цього інтервалу, випадковим чином підсвічується наступний випадково вибраний об’єкт. Якщо рахунок користувача досягнув 20, величина t зменшується на 20%.  Процес триває, поки рахунок S не дійшов до нуля. Після завершення процесу відображається час, який минув від натискання кнопки “Start” до завершення процесу. Під час виконання програми на передній панелі відображаються поточні значення S, t та час, що минув від початку виконання програми.

Задачка цікава і, ніби, не дуже складна, але явно вимагає більше всіляких “наворотів”, тому доведеться розділити її як мінімум на дві статті. У першій (оцій) ми сформулювати ТЗ і зараз організуємо нашим кротам затишні хатинки, а ще навчимо їх обережно виглядати звідтіля. Для того, аби можна було “приласкати” тваринку використаємо знову ж таки обробку подій.

Wack-a-Mole UI

Wack-a-Mole UI

Спочатку накидаємо інтерфейс програми. На лицьовій панелі я розмістив 4 індикатори Picture, в один з яких завантажуватиметься зображення нашого крота. Бити симпатичну тваринку ми не будемо, тому у ролі крота виступатиме злий смайлик. Тут же і контрол для таймера і кнопка “Стоп” – переміщення крота між норами відбувається у циклі.

Wack-a-Mole програма керування кротами

Wack-a-Mole програма керування кротами

Блок-діагарма цієї частини гри пояснень особливих не потребує. Хто не мав справи з індикаторами Picture, може здивуватися тому, що просто подати на цей індикатор шлях до зображення не можна. Але це логічно: спочатку ми використовуємо інструмент, що розкодовує файл (у нашому випадку зображення формату JPG), потім перетворюємо його на карту з пікселів і вже її відображає індикатор. В принципі, можна намалювати крота і програмно – за допомогою графічних примітивів (лінії, кола, прямокутники, тощо). Структура Case служить для того, аби вивести крота на один індикатор, а на всі інші подати “пусту картинку” з константи.

Wack-a-Mole Обробка подій

Wack-a-Mole Обробка подій

Тепер реалізуємо обробку натискання на крота мишкою. Для цього, як я вже казав, згадаємо обробку подій у LabVIEW. Всього у структуру Event закладено обробку 4-х подій: натискання (MouseDown) на одну з чотирьох картинок. Всередині перевіряється умова рівності випадково згенерованого числа, яке керує переміщенням крота, і константи, що відповідає за номер стану. Якщо вони рівні, то відбувається інкремент Score. Як і в попередній задачі, між ітераціями дані передаються через Shift Register.

Тут відразу виникають нюанси синхронізації декременту лічильника Score за часом та інкременту при обробці подій (якщо спробуєте запустити програму, то побачите невеличкі лаги), можливості клацати на пустій норі і чекати, поки туди прийде кріт, тощо. Але рефакторингом займемося пізніше, а я на цьому закінчую статтю, продовження буде…

Почитайте ще оце:

Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *