Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою С++.
Мета:
Обладнання: комп'ютери зі встановленими ОС, браузером, середовищем CodeBlocks для програмування мовою С++ з використанням бібліотеки wxWidgets, (дана) інструкція.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
Протлумачити дію вказівок мовою С++ і порівняти з очікуваними відповідями.
3. Вивчення нового матеріалу
Розглянемо таке навчальне завдання.
Завдання. Створити комп'ютерну гру «Сапер»
мовою С++ у середовищі CodeBlocks з використанням бібліотеки wxWidgets для подання графіки.
Правила комп'ютерної гри «Сапер»
Мета гри: знайти всі порожні клітинки, не зачепивши міни.
Рівні складності вказують, обираючи розмір поля.
Початок гри: потрібно клацнути по довільній клітині ігрового поля.
Перебіг гри:
Якщо у відкритій комірці вказано число, воно показує, скільки мін приховано у восьми сусідніх клітинах навколо даної (нуль не вказують). Це число допомагає гравцеві зрозуміти, де розташовано безпечні клітини.
Перед виконанням завдання потрібно ознайомитися з описом роботи з графікою. При розгляді кодів опису звернути увагу лише на останню (в кожному коді) функцію, де власне й подано вказівки опрацювання й виведення графіки. Ці коди передбачають компіляцію таким самим чином, що й демонстраційні приклади (samples) бібліотеки wxWidgets (без середовища CodeBlocks). У розв'язанні завдання потрібно буде створити об'єкт wxPaintDC — нащадок wxPanel.
Для виконання завдання потрібно в обробнику подій визначати координати x, y вказівника миші:
відносно верхнього лівого кута дисплея:
const wxPoint p = wxGetMousePosition(); int x = pt.x; int y = pt.y;
const wxPoint pt = wxGetMousePosition(); int x = pt.x - this -> GetScreenPosition().x; int y = pt.y - this -> GetScreenPosition().y;
4. Інструктаж з ТБ
5. Вироблення практичних навичок
Вказівки до виконання завдання:
У середовищі CodeBlocks у вказаній учителем теці створити проєкт miner з використанням бібліотеки wxWidgets з такими параметрами:
Видалити об'єкти: MenuBar1 і StatusBar1, виділивши їхні зображення (клацнувши на них лівою кнопкою миші) над зображенням форми і натиснувши клавішу Delete.
Надати властивостям форми значення (тут і нижче у тексті вказано лише ті властивості, значення яких потрібно змінити):
розташувавши на формі об'єкти з вкладення Standard (Стандартне):
wxStaticText — 2 написи з такими значеннями властивостей:
Label | Size | % |
X | 1 | 100 |
Y | 4 | 4 |
Width | 48 | 12 |
Height | 24 | 24 |
Text | 10 | 10 | 10 |
X | 33 | 60 | 110 |
Y | 0 | 0 | 0 |
Width | 24 | 24 | 24 |
Height | 27 | 27 | 27 |
Label | New game |
X | 145 |
Y | 0 |
Width | 70 |
Height | 29 |
wxPanel — панель з такими значеннями властивостей:
X | 10 |
Y | 30 |
Width | 300 |
Height | 300 |
Background | (0,128,0) |
Щоб змінити значення Вackground (кольору тла), потрібно клацнути лівою кнопкою миші праворуч від початкового значення, з випадного списку вибрати Custom
у вікні діалогу Choose color задати координати кольору схеми RGB і на натиснути кнопку Гаразд.
Custom — користувацький віджет (покласти на панель) з такими значеннями властивостей:
Creating code | $(THIS) = new $(CLASS)($(PARENT)); |
Include file | wx/dcclient.h |
Var name | z |
Class name | wxPaintDC |
X | 10 |
Y | 10 |
Width | 300 |
Height | 300 |
Щоб змінити значення Creating code (коду породження), потрібно клацнути лівою кнопкою миші праворуч від відповідного значення
і у вікні діалогу Creating code вилучити зайві символи, після чого натиснути на кнопку Гаразд.
Створити обробник події натискання кнопки з написом New game (Нова гра):
виділити кнопку з написом New game, клацнувши на ній лівою кнопкою миші, і перейти до розгляду подій, натиснувши кнопку із зображенням фігурних дужок {};
навести вказівник миші на рядок з написом None (Жодного) праворуч від напису EVT_BUTTON, клацнути лівою кнопкою миші і з випадного меню вибрати Add new handler (Додати новий обробник);
у вікні діалогу New handler (Новий обробник) підтвердити створення обробника OnButton1Click події натискання кнопки Button1, натиснувши кнопку Гаразд.
Описати глобальні структури даних для обліку стану гри і функцію OnButton1Click. Остання має містити таке:
опис об'єкта типу wxPaintDC для малювання меж між клітинами ігрового поля;
розмір форми по горизонталі / вертикалі — сума розміру панелі по горизонталі / вертикалі + 25 / 65;
вивести інформаційне вікно Гра Сапер з повідомленням: "Увага: розпочато нову гру!".
Скористатися такими шаблонами:
this -> SetSize(nx*30+25, ny*30+65); this -> Update(); Panel1-> SetSize(nx*30, ny*30); Panel1 -> Update(); wxMessageDialog *d0 = new wxMessageDialog(NULL,wxT("Увага: розпочато нову гру!"),wxT("«Гра Сапер»"),wxOK); d0->ShowModal();
зобразити межі клітин товщиною 2 пікселі світло-сірого кольору — координати (200, 200, 200) у схемі кольорів RGB;
інакше вивести повідомлення: "Хибні параметри: розмір поля для гри — ціле число від 6 до 50 по горизонталі і від 6 до 30 по вертикалі, а відсоток має бути додатним і не перевищувати 100".
Порівняти створене з очікуваним.
Доповнити початок коду minerMain.cpp викликом потрібних бібліотек і простору назв std.
#include "minerMain.h" #include <wx/msgdlg.h> #include <string> using namespace std;
Перевірити правильність роботи обробника OnButton1Click події натискання кнопки Button1 хоча б щодо створення поля для гри. Для цього на панелі інструментів середовища
CodeBlocks натиснути (у вказаному порядку) такі кнопки:
Save all files (Зберегти всі файли);
Build (Побудувати);
Run (Запустити).
Замість натискання двох останніх кнопок можна натиснути одну:
Build and run (Побудувати і запустити).
Створити обробник OnPanel1LeftDown події натискання лівої кнопки миші на панелі Panel1:
на вкладенні Resources (ресурси) виділити панель Panel1, клацнувши на ній лівою кнопкою миші, і перейти до розгляду подій, натиснувши кнопку із зображенням фігурних дужок {};
навести вказівник миші на рядок з написом None (Жодного) праворуч від напису EVT_LEFT_DOWN, клацнути лівою кнопкою миші і з випадного меню вибрати Add new handler (Додати новий обробник);
у вікні діалогу New handler (Новий обробник) підтвердити створення обробника OnPanel1LeftDown, натиснувши кнопку Гаразд.
Описати функцію OnPanel1LeftDown:
wxColour c[10]; c[0].Set(wxT("#eeeeee"));// білий колір c[1].Set(wxT("#0000ee"));// синій колір c[2].Set(wxT("#008800"));// зелений колір c[3].Set(wxT("#daa520"));// золотарний колір goldenrod c[4].Set(wxT("#800080"));// фіолетовий колір c[5].Set(wxT("#ee0000"));// червоний колір c[6].Set(wxT("#808000"));// оливковий колір c[7].Set(wxT("#4b0082"));// колір індиго c[8].Set(wxT("#8b4513"));// сідельно коричневий колір saddle brown c[9].Set(wxT("#808080"));// сірий колір - для невиявленої міни
wxFont font (20,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD,false,"Ubuntu Calibri"); z.SetFont(font);
якщо клітину досі зафарбовано зеленим, робити таке:
якщо клітина містить міну:
в усіх клітинах на білому тлі вивести кількість мін у сусідніх клітинах або зображення міни, якщо її розташовано у цій клітині;
через 2 секунди вивести вікно з повідомленням про програш;
інакше — при відсутності міни у клітині:
при відсутності мін у сусідніх клітинах:
виявити усі клітини, у які є шлях з початкової клітити через клітини, для яких немає мін у сусідніх клітинах;
в усіх таких виявлених клітинах на білому тлі вивести кількість мін у сусідніх клітинах;
зменшити відповідним чином кількість невідкритих клітин без мін;
інакше — при наявності мін у сусідніх клітинах:
в обраній клітині на білому тлі вивести кількість мін у сусідніх клітинах;
зменшити на 1 кількість невідкритих клітин без мін.
Якщо кількість невідкритих клітин без мін дорівнює нулю, вікно з повідомленням про перемогу.
Порівняти з очікуваним.
Перевірити правильність виконання проекту. У разі потреби внести зміни у код програми.
Повідомити вчителя про завершення роботи над проектом.
6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.
7. Домашнє завдання
У разі потреби доробити завдання. Удосконалити проект, передбачивши можливість задання розмірів клітини, обчислення і зміну цих розмірів при зміні розмірів вікна.
Текст упорядкував Олександр Рудик.