Розробка уроку — практичної роботи

Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою С++.

Мета:

Обладнання: комп'ютери зі встановленими ОС, браузером, середовищем CodeBlocks для програмування мовою С++ з використанням бібліотеки wxWidgets, (дана) інструкція.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Інструктаж з ТБ.
  5. Вироблення практичних навичок.
  6. Підбиття підсумків уроку.
  7. Домашнє завдання.

Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.

2. Актуалізація опорних знань
Протлумачити дію вказівок мовою С++ і порівняти з очікуваними відповідями.

3. Вивчення нового матеріалу

Розглянемо таке навчальне завдання.

Завдання. Створити комп'ютерну гру «Сапер»

мовою С++ у середовищі CodeBlocks з використанням бібліотеки wxWidgets для подання графіки.

Правила комп'ютерної гри «Сапер»

Мета гри: знайти всі порожні клітинки, не зачепивши міни.
Рівні складності вказують, обираючи розмір поля.
Початок гри: потрібно клацнути по довільній клітині ігрового поля.
Перебіг гри:

Якщо у відкритій комірці вказано число, воно показує, скільки мін приховано у восьми сусідніх клітинах навколо даної (нуль не вказують). Це число допомагає гравцеві зрозуміти, де розташовано безпечні клітини.

Перед виконанням завдання потрібно ознайомитися з описом роботи з графікою. При розгляді кодів опису звернути увагу лише на останню (в кожному коді) функцію, де власне й подано вказівки опрацювання й виведення графіки. Ці коди передбачають компіляцію таким самим чином, що й демонстраційні приклади (samples) бібліотеки wxWidgets (без середовища CodeBlocks). У розв'язанні завдання потрібно буде створити об'єкт wxPaintDC — нащадок wxPanel.

Для виконання завдання потрібно в обробнику подій визначати координати x, y вказівника миші:

4. Інструктаж з ТБ
5. Вироблення практичних навичок


Вказівки до виконання завдання:

  1. У середовищі CodeBlocks у вказаній учителем теці створити проєкт miner з використанням бібліотеки wxWidgets з такими параметрами:

    • Prefered GUI — Builders;
    • Application Type — Frame Based.
  2. Видалити об'єкти: MenuBar1 і StatusBar1, виділивши їхні зображення (клацнувши на них лівою кнопкою миші) над зображенням форми і натиснувши клавішу Delete.

  3. Надати властивостям форми значення (тут і нижче у тексті вказано лише ті властивості, значення яких потрібно змінити):

    • Title — miner;
    • Width — 320;
    • Height — 340.
  4. Отримати форму для гри такого вигляду,

    розташувавши на формі об'єкти з вкладення Standard (Стандартне):

    • wxStaticText — 2 написи з такими значеннями властивостей:

    LabelSize %
    X 1100
    Y 4 4
    Width 48 12
    Height 24 24

    • wxTextCtrl — 3 поля для введення даних з такими значеннями властивостей:

    Text1010 10
    X3360110
    Y 0 0 0
    Width 2424 24
    Height2727 27

    • wxButton — кнопка з такими значеннями властивостей:

    LabelNew game
    X145
    Y 0
    Width 70
    Height 29
    • wxPanel — панель з такими значеннями властивостей:

      X10
      Y30
      Width 300
      Height300
      Background(0,128,0)

      Щоб змінити значення Вackground (кольору тла), потрібно клацнути лівою кнопкою миші праворуч від початкового значення, з випадного списку вибрати Custom

      у вікні діалогу Choose color задати координати кольору схеми RGB і на натиснути кнопку Гаразд.

    • Custom — користувацький віджет (покласти на панель) з такими значеннями властивостей:

    Creating code$(THIS) = new $(CLASS)($(PARENT));
    Include filewx/dcclient.h
    Var namez
    Class namewxPaintDC
    X10
    Y10
    Width 300
    Height300

    Щоб змінити значення Creating code (коду породження), потрібно клацнути лівою кнопкою миші праворуч від відповідного значення

    і у вікні діалогу Creating code вилучити зайві символи, після чого натиснути на кнопку Гаразд.

  5. Створити обробник події натискання кнопки з написом New game (Нова гра):

    • виділити кнопку з написом New game, клацнувши на ній лівою кнопкою миші, і перейти до розгляду подій, натиснувши кнопку із зображенням фігурних дужок {};

    • навести вказівник миші на рядок з написом None (Жодного) праворуч від напису EVT_BUTTON, клацнути лівою кнопкою миші і з випадного меню вибрати Add new handler (Додати новий обробник);

    • у вікні діалогу New handler (Новий обробник) підтвердити створення обробника OnButton1Click події натискання кнопки Button1, натис­нувши кнопку Гаразд.

  6. Описати глобальні структури даних для обліку стану гри і функцію OnButton1Click. Остання має містити таке:

    • опис об'єкта типу wxPaintDC для малювання меж між клітинами ігрового поля;

    • зчитування з полів введення даних:
      • розміри поля nx , ny;
      • відсоток клітин з мінами m;

    • якщо виміри сторін поля лежать у межах:
      • від 6 до 50 по горизонталі;
      • від 6 до 30 по вертикалі,
      а відсоток — додатний і не перевищує 100, робити таке:

      • підрахувати кількість мін;
      • випадковим чином заповнити частину клітин мінами;
      • підрахувати для кожної клітини кількість мін у сусідніх клітинах;
      • надати значення:
        • розміри об'єкта для малювання і панелі по горизонталі / вертикалі — добуток 30 і кількості клітин по горизонталі / вертикалі;

        • розмір форми по горизонталі / вертикалі — сума розміру панелі по горизонталі / вертикалі + 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".

    Порівняти створене з очікуваним.

  7. Доповнити початок коду minerMain.cpp викликом потрібних бібліотек і простору назв std.

    #include "minerMain.h"
    #include <wx/msgdlg.h>
    #include <string>
    using namespace std;
  8. Перевірити правильність роботи обробника OnButton1Click події натискання кнопки Button1 хоча б щодо створення поля для гри. Для цього на панелі інструментів середовища CodeBlocks натиснути (у вказаному порядку) такі кнопки:

    Save all files (Зберегти всі файли);
    Build (Побудувати);
    Run (Запустити).

    Замість натискання двох останніх кнопок можна натиснути одну:

    Build and run (Побудувати і запустити).



  9. Створити обробник OnPanel1LeftDown події натискання лівої кнопки миші на панелі Panel1:

    • на вкладенні Resources (ресурси) виділити панель Panel1, клацнувши на ній лівою кнопкою миші, і перейти до розгляду подій, натиснувши кнопку із зображенням фігурних дужок {};

    • навести вказівник миші на рядок з написом None (Жодного) праворуч від напису EVT_LEFT_DOWN, клацнути лівою кнопкою миші і з випадного меню вибрати Add new handler (Додати новий обробник);

    • у вікні діалогу New handler (Новий обробник) підтвердити створення обробника OnPanel1LeftDown, натиснувши кнопку Гаразд.

  10. Описати функцію OnPanel1LeftDown:

    • створити об'єкт класу wxPaintDC;
    • задати світло-сірий колір контуру (200,200,200);
    • описати кольори для виведення кількостей мін у сусідніх клітинах:
      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 кількість невідкритих клітин без мін.

        Якщо кількість невідкритих клітин без мін дорівнює нулю, вікно з повідомленням про перемогу.

    Порівняти з очікуваним.

  11. Перевірити правильність виконання проекту. У разі потреби внести зміни у код програми.

  12. Повідомити вчителя про завершення роботи над проектом.

6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.

7. Домашнє завдання
У разі потреби доробити завдання. Удосконалити проект, передбачивши можливість задання розмірів клітини, обчислення і зміну цих розмірів при зміні розмірів вікна.


Текст упорядкував Олександр Рудик.