Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою C#.
Мета:
Обладнання: комп’ютери зі встановленими ОС, інтегроване середовище програмування MonoDevelop, бібліотек Cairo і Gtk# 3.0.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
Для створення програмного втілення гри «Сапер» згадаємо вже знайомі класи і методи (у дужках вказано номер відповідного пункту вказівок щодо створення програми):
3. Вивчення нового матеріалу
Завдання. Створити мовою C# комп'ютерну гру «Сапер» на прямокутному полі, що складається з квадратних клітин однакового розміру.
Правила комп'ютерної гри «Сапер»
Мета гри: знайти всі порожні клітинки, не зачепивши міни.
Рівні складності вказують, обираючи розмір поля.
Початок гри: потрібно клацнути по довільній клітині ігрового поля.
Перебіг гри:
Якщо у відкритій комірці вказано число, воно показує, скільки мін приховано у восьми сусідніх клітинах навколо даної (нуль не вказують). Це число допомагає гравцеві зрозуміти, де розташовано безпечні клітини — див. зображення послідовних станів гри на полі 10×6.
4. Інструктаж з ТБ
5. Вироблення практичних навичок
Вказівки щодо створення програми
Створити консольний застосунок у середовищі MonoDevelop з таким налаштуванням підключення пакунків.
і таким замовленням пакунків на початку коду.
using System; using Cairo; using Gdk; using Gtk;
Змінити код для створення вікна такого вигляду,
що містить область малювання бібліотеки Cairo під елеменами керування. Перевірити коректність роботи програми й порівняти з очікуваним.
Описати властивості класу області малювання таким чином.
public int h = 38, // відстань від області малювання до верхньої частини екрану w = 30, // довжина сторони клітини ігрового поля w1 = 2, // ширина обмежувальної лінії nx = 0, // кількість стовпчиків - клітин по горизонталі ny = 10, // кількість рядків - клітин по вертикалі nxy, // кількість усіх клітин поля гри m = 10, // відсоток або кількість мін n, // кількість невідкритих клітин без мін j, // номер рядка k, // номер стовпчика j0, // номер стовпчика клітини з підірваною міною k0, // номер рядка клітини з підірваною міною l0, l; // лічильники для відкриття public int[] v = new int[1664];// допоміжний масив для: // 1) випадкового розташування мін // 2) черги відкриття клітин без мін public int[] u = new int [1664]; // допоміжний масив для черги відкриття клітин без мін public int[,] a = new int [32, 52]; // дані про кількість сусідніх клітин з мінами public bool[,] b = new bool[32, 52]; // дані про наявність мін public bool[,] d = new bool[32, 52]; // справджується для відкритих клітин Cairo.Color[] c = { new Cairo.Color(1,1,1,1), // білий колір new Cairo.Color(0,0,1,1), // синій колір new Cairo.Color(0,0.5,0,1), // зелений колір new Cairo.Color(0.855, 0.651, 0.125, 1), // золотарний колір new Cairo.Color(0.25 , 0 , 0.5, 1), // фіолетовий колір new Cairo.Color(1 , 0 , 0 , 1), // червоний колір new Cairo.Color(0.5 , 0.5 , 0 , 1), // оливковий колір new Cairo.Color(0.293, 0 , 0.508, 1), // колір індиго new Cairo.Color(0.545, 0.271, 0.075, 1), // сідельно коричневий колір saddle brown new Cairo.Color(0.5 , 0.5 , 0.5 , 1) // сірий колір для міни }; public bool p = false; // чи є потреба перемальовувати?
Перевірити можливість компіляції й порівняти з очікуваним між коментарями
// # 3 Властивості класу області малювання // # 3 Кінець
І для усіх наступних порівнянь коду в коментарях буде вказано номер кроку створення програми.
Переозначити метод OnDrawn класу області малювання для відображення поточного стану ігрового поля у довільний момент гри, використавши запроваджені на попередньому кроці властивості класу області малювання. Перевірити можливість компіляції й порівняти з очікуваним.
Створити метод btClicked класу області малювання для породження початкової позиції гри. Назва вказує на те, що його буде викликано обробником події натискання кнопки з написом: "Почати". У методі описати виконання таких дій:
надати значення:
nxy = nx*ny; m = m *nxy/100; // кількість мін n = nxy - m; // кількість невідкритих клітин без мін
Для спрощення алгоритму підрахунку кількості мін у сусідніх клітинах зручно вважати, що ігрове поле оточено допоміжними порожніми клітинами, які не відображають і не відкривають. Індекси відповідних елементів 2-вимірних масивів можна вказати як:
Перевірити можливість компіляції й порівняти з очікуваним.
У коді класу вікна застосунку створити обробник події натискання кнопки вікні вказівкою:
bt.Clicked += delegate{};одразу після вказівок розташування елементів вікна. В обробнику (між фігурними дужками) описати таке:
Для класу області малювання створити метод
public void OnButtonPress(double x, double y) {}Назва вказує на те, що цей метод буде викликано обробником події натискання кнопки миші. Метод отримує значення екранних координат вказівника миші відносно вікна застосунку. У методі (між фігурними дужками) описати такі дії:
Перевірити можливість компіляції й порівняти з очікуваним.
Для класу вікна застосунку переозначити обробник події натискання кнопки миші OnButtonPressEvent. Описати виконання таких дій:
Перевірити можливість компіляції й порівняти з очікуваним.
6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.
7. Домашнє завдання
У разі потреби доробити завдання. Удосконалити проект, передбачивши можливість задання розмірів клітини, обчислення і зміну цих розмірів при зміні розмірів вікна.
Текст упорядкував Олександр Рудик.