Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою 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. Домашнє завдання
У разі потреби доробити завдання. Удосконалити проект, передбачивши можливість задання розмірів клітини, обчислення і зміну цих розмірів при зміні розмірів вікна.
Текст упорядкував Олександр Рудик.