Тема: створення нескладної комп’ютерної гри з використанням змінних величин мовою C++.
Мета: навчитися складати та виконувати алгоритми з величинами числового типу мовою програмування C++. Після виконання роботи учень
складати алгоритми опрацювання величин числового типу;
складати, редагувати, налагоджувати та виконувати програми опрацювання числових величин мовою C++;
аналізувати результати виконання програм опрацювання величин числового типу;
налагоджувати програму та виконувати її у покроковому режимі.
Обладнання: комп'ютери зі встановленими ОС, браузером, середовищем CodeBlocks для програмування мовою С++ з використанням бібліотеки wxWidgets, (дана) інструкція.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
Дати тлумачення вказівок коду мовою С++ з використанням бібліотеки wxWidgets і порівняти з очікуваним.
Примітка. При використанні у написах на формі літер кирилиці чи іншої абетки, відмінної від латиниці, потрібно:
пересвідчитися, що кодування файлу програми *Main.cpp (встановити у середовищі довільного текстового редактора) збігається з кодуванням, передбаченим вбудованим редактором середовища програмування (для CodeBlocks потрібно виконати вказівку меню Settings / Editor… (Налаштування / Редактор) і перейти на вкладення General settings / Encoding settings (Загальні налаштування / Налаштування редактора);
у коді *Main.cpp використовувати функцію wxT() замість _(), яку середовище використовує для усіх рядків-написів при зміні хоча б одного з них через панель інспектора об'єктів.
3. Вивчення нового матеріалу
Клод Гаспар Баше де Мезеріак (Claude Gaspard Bachet de Méziriac, 1581–1638) — французький математик, поет і перекладач, який запропонував розглянуту далі гру у книзі «Цікаві і приємні числові завдання». Книжка вийшла в 1612 року, а туди вона потрапила з твору Леонарда Пізанського 1202 року.
Гра Баше. У початковий момент в купці є n предметів. Два гравці по черзі забирають з цієї купки предмети — від 1 до p включно, де 1 < p. Переможцем вважають того, хто зробить останній хід.
Є інший (альтернативний) варіант гри: переможцем вважати того, хто примусить суперника зробити останній хід.
Гра Баше — один з найпростіших і найвідоміших прикладів гри:
з повною інформацією — обидва гравці знають, які всі зроблені ходи;
без випадкового втручання — стан (позиція) визначається виключно ходами (рішеннями) гравців;
антагоністичної. Інтереси гравців — протилежні, тобто, якщо один виграв, то інший програв. В інших іграх: чим більше грошей (балів) у результаті отримає одни гравець, тим менше отримає інший (отримають інші).
Для таких ігор є розроблена теорія пошуку виграшної стратегії — правил поведінки, що гарантує виграш у грі. Розглянемо елементи цієї теорії.
Запровадимо поняття графа гри, який складається з:
вершин-позицій — невід'ємних цілих чисел — кількостей предметів у купці;
дуг-ходів — впорядкованих пар вершин, які вказують, яку позицію з якої можна отримати за один хід.
Для гри Баше хід з позиції A в позицію B дозволено, якщо справджуються нерівності:
0 < A − B ≤ p.
Вершину, на яку не вказує жодна дуга, назвемо початковою позицією або початком гри.
Вершину, з якої не виходить жодна дуга (порожню множину) назвемо кінцевою позицією або кінцем гри.
Означимо поняття виграшної і програшної позицій (для того, чия черга ходити).
Для кінцевої позиції виграшність позиції визначається згідно з правилами гри:
Для решти (не кінцевих) позицій:
Інакше кажучи, у виграшній позиції гравець, чия черга ходу, може вибрати хід у програшну позицію, що забезпечує йому перемогу за умови відповідного вибору й надалі. У програшній позиції гравець завжди робить хід у виграшну позицію, тобто він не може позбавити суперника можливості виграти. Для нього виграш можливий лише, якщо суперник припуститься помилки і зробить хід у виграшну позицію.
Схема аналізу графа гри
Визначити виграшні позиції, з яких визначені раніше програшні позиції досягаються за 1 хід.
Визначити програшні позиції, з яких визначені раніше виграшні позиції досягаються за 1 хід.
Повторювати виконання пунктів 2−3 до встановлення, якими є всі позиції.
Таким чином за скінчену кількість кроків проводять аналіз усіх позицій гри. Аналіз завершується, якщо кроки 2−3 не дають ніякої нової інформації щодо виграшності чи програшності позицій.
4. Інструктаж з ТБ
5. Вироблення практичних навичок
Завдання 1. Встановити для обох варіантів гри Баше, які позиції є виграшними, а які є програшними.
Вказівки до виконання: проаналізувати граф гри для p = 3 й узагальнити на випадок усіх натуральних p. Порівняти з очікуваним.
Завдання 2. Створити програму для гри Баше для двох гравців-людей, яка до натискання кнопки з написом «Почати гру» вибирає випадкові значення:
а далі забезпечує дотримання правил гри й виводить вікна повідомлень з коментарями про некоректність ходу (при потребі), виграшність останнього зробленого ходу та результат гри.
У середовищі CodeBlocks у вказаній учителем теці створити проєкт Bashet з використанням бібліотеки wxWidgets з такими параметрами:
Видалити об'єкти: MenuBar1 і StatusBar1, виділивши їхні зображення (клацнувши на них лівою кнопкою миші) над зображенням форми і натиснувши клавішу Delete.
Надати властивостям форми значення (тут і нижче у тексті вказано лише ті властивості, значення яких потрібно змінити):
розташувавши на формі об'єкти з вкладення Standard (Стандартне):
wxStaticText — 6 написів з такими значеннями властивостей:
Label | Правила гри… | Поточна кількість предметів | 0 | p = | 0 | Забрати предметів |
X | 5 | 5 | 190 | 220 | 240 | 5 |
Y | 5 | 100 | 100 | 100 | 100 | 120 |
Width | 315 | 180 | 30 | 20 | 20 | 120 |
Height | 90 | 20 | 20 | 20 | 20 | 20 |
Примітка. У таблиці вище словами: «Правила гри…» позначено такі речення: «Правила гри. У початковий момент в купці є додатна кількість предметів. Два гравці по черзі забирають з цієї купки предмети — від 1 до p включно, де 1 < p. Переможцем вважають того, хто зробить останній хід».
Text | 0 |
X | 130 |
Y | 120 |
Width | 20 |
Height | 20 |
Label | Почати гру |
X | 200 |
Y | 120 |
Width | 90 |
Height | 30 |
Зробити контекстну заміну "_(" на "wxT(" у коді функції Bashetframe програми BashetMain.cpp для рядків-аргументів з кирилічними літерами для того, щоб отримати правильне відображення кирилічної абетки під час виконання пректу.
Отримати такий вид форми під час виконання проекту.
Створити обробник події натискання кнопки:
виділити кнопку, клацнувши на ній лівою кнопкою миші, і перейти до розгляду подій, натиснувши кнопку із зображенням фігурних дужок {};
навести вказівник миші на рядок з написом None (Жодного) праворуч від напису EVT_BUTTON, клацнути лівою кнопкою миші і з випадного меню вибрати Add new handler (Додати новий обробник);
підтвердити створення події OnButton1Click натискання кнопки, натиснувши кнопку з написом Гаразд у вікні діалогу New hadler (Новий обробник);
Описати глобальні змінні перед кодом обробника події натискання кнопки — функції OnButton1Click програми BashetMain.cpp.
int i=0,/* Стан гри: 0 - вибір початкової кількості предметів 1 - ходить гравець 1 2 - ходить гравець 2 */ n, // кількість предметів p; // верхня межа кількості предметів, які беруть за один хід
Створити код обробника події натискання кнопки — функції OnButton1Click програми BashetMain, програмно втіливши правила гри Баше (основний варіант). Порівняти з очікуваним.
6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.
7. Домашнє завдання
У разі потреби доробити завдання. Створити аналогічний проект для альтернативного варіанту гри Баше. Додатково для охочих: створити аналогічний проект мовою C++ для іншої гри з використанням змінних величин, попередньо узгодивши зміст (правила) гри з учителем.
Текст упорядкував Олександр Рудик.