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

Тема: створення нескладної комп’ютерної гри з використанням змінних величин мовою C++.

Мета: навчитися складати та виконувати алгоритми з величинами числового типу мовою програмування C++. Після виконання роботи учень

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

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

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

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

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

Примітка. При використанні у написах на формі літер кирилиці чи іншої абетки, відмінної від латиниці, потрібно:

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

Клод Гаспар Баше де Мезеріак (Claude Gaspard Bachet de Méziriac, 1581–1638) — французький математик, поет і перекладач, який запропонував розглянуту далі гру у книзі «Цікаві і приємні числові завдання». Книжка вийшла в 1612 року, а туди вона потрапила з твору Леонарда Пізанського 1202 року.

Гра Баше. У початковий момент в купці є n предметів. Два гравці по черзі забирають з цієї купки предмети — від 1 до p включно, де 1 < p. Переможцем вважають того, хто зробить останній хід.

Є інший (альтернативний) варіант гри: переможцем вважати того, хто примусить суперника зробити останній хід.

Гра Баше — один з найпростіших і найвідоміших прикладів гри:

Для таких ігор є розроблена теорія пошуку виграшної стратегії — правил поведінки, що гарантує виграш у грі. Розглянемо елементи цієї теорії.

Запровадимо поняття графа гри, який складається з:

Для гри Баше хід з позиції A в позицію B дозволено, якщо справджуються нерівності: 0 < ABp.

Вершину, на яку не вказує жодна дуга, назвемо початковою позицією або початком гри.

Вершину, з якої не виходить жодна дуга (порожню множину) назвемо кінцевою позицією або кінцем гри.

Означимо поняття виграшної і програшної позицій (для того, чия черга ходити).

Для кінцевої позиції виграшність позиції визначається згідно з правилами гри:

Для решти (не кінцевих) позицій:

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

Схема аналізу графа гри

  1. Визначити всі кінцеві позиції і визначити, виграшні вони чи програшні згідно з правилами гри.

  2. Визначити виграшні позиції, з яких визначені раніше програшні позиції досягаються за 1 хід.

  3. Визначити програшні позиції, з яких визначені раніше виграшні позиції досягаються за 1 хід.

  4. Повторювати виконання пунктів 2−3 до встановлення, якими є всі позиції.

Таким чином за скінчену кількість кроків проводять аналіз усіх позицій гри. Аналіз завершується, якщо кроки 2−3 не дають ніякої нової інформації щодо виграшності чи програшності позицій.

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


Завдання 1. Встановити для обох варіантів гри Баше, які позиції є виграшними, а які є програшними.

Вказівки до виконання: проаналізувати граф гри для p = 3 й узагальнити на випадок усіх натуральних p. Порівняти з очікуваним.

Завдання 2. Створити програму для гри Баше для двох гравців-людей, яка до натискання кнопки з написом «Почати гру» вибирає випадкові значення:

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































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

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

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

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

    • Title — Гра Баше (основний варіант)
    • Width — 325;
    • Height — 155.
  4. Отримати форму для гри такого вигляду,

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

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

      LabelПравила
      гри…
      Поточна
      кількість
      предметів
      0p =0Забрати
      предметів
      X 5 5190220240 5
      Y 5100100100100120
      Width 315180 3020 20120
      Height 90 20 2020 20 20

      Примітка. У таблиці вище словами: «Правила гри…» позначено такі речення: «Правила гри. У початковий момент в купці є додатна кількість предметів. Два гравці по черзі забирають з цієї купки предмети — від 1 до p включно, де 1 < p. Переможцем вважають того, хто зробить останній хід».

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

    Text 0
    X130
    Y120
    Width 20
    Height20

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

    LabelПочати гру
    X200
    Y120
    Width 90
    Height 30
  5. Зробити контекстну заміну "_(" на "wxT(" у коді функції Bashetframe програми BashetMain.cpp для рядків-аргументів з кирилічними літерами для того, щоб отримати правильне відображення кирилічної абетки під час виконання пректу.

  6. Перевірити правильність відображення всіх елементів форми. Для цього на панелі інструментів середовища CodeBlocks натиснути (у вказаному порядку) такі кнопки:

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

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

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

  7. Отримати такий вид форми під час виконання проекту.

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

  8. Створити обробник події натискання кнопки:

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

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

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



  9. Описати глобальні змінні перед кодом обробника події натискання кнопки — функції OnButton1Click програми BashetMain.cpp.

    int i=0,/* Стан гри: 0 - вибір початкової кількості предметів
                         1 - ходить гравець 1
                         2 - ходить гравець 2 */
        n,  // кількість предметів
        p;  // верхня межа кількості предметів, які беруть за один хід
  10. Створити код обробника події натискання кнопки — функції OnButton1Click програми BashetMain, програмно втіливши правила гри Баше (основний варіант). Порівняти з очікуваним.

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

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

7. Домашнє завдання
У разі потреби доробити завдання. Створити аналогічний проект для альтернативного варіанту гри Баше. Додатково для охочих: створити аналогічний проект мовою C++ для іншої гри з використанням змінних величин, попередньо узгодивши зміст (правила) гри з учителем.


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