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

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

Мета:

Обладнання: комп’ютери зі встановленими ОС, інтегроване середовище програмування Mono­Develop, бібліотек Cairo і Gtk# 3.0.

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

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

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

2. Актуалізація опорних знань

Для створення програмного втілення гри «Сапер» згадаємо вже знайомі класи і методи (у дужках вказано номер відповідного пункту вказівок щодо створення програми):

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

Завдання. Створити мовою C# комп'ютерну гру «Сапер» на прямокутному полі, що складається з квадратних клітин однакового розміру.

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

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

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

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


Вказівки щодо створення програми

  1. Створити консольний застосунок у середовищі MonoDevelop з таким налаштуванням підключення пакунків.

    і таким замовленням пакунків на початку коду.

    using System;
    using Cairo;
    using Gdk;
    using Gtk;
  2. Змінити код для створення вікна такого вигляду,

    що містить область малювання бібліотеки Cairo під елеменами керування. Перевірити коректність роботи програми й порівняти з очікуваним.

  3. Описати властивості класу області малювання таким чином.

      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 Кінець

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

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

  5. Створити метод btClicked класу області малювання для породження початкової позиції гри. Назва вказує на те, що його буде викликано обробником події натискання кнопки з написом: "Почати". У методі описати виконання таких дій:

    • надати властивості p результату встановлення істинності такого виразу:

      (9 < nx) && (nx < 51) && (5 < ny) && (ny < 31) && (0 < m) && (m < 100);

    • при справдженні властивості p робити таке:
      • надати значення:

        nxy = nx*ny;
        m   = m *nxy/100; // кількість мін
        n   = nxy - m;    // кількість невідкритих клітин без мін
      • оголосити усі клітини без мін і закритими, надавши значення false усім елементам масивів b і d;
      • випадково заповнити ігрове поле мінами, надавши значення 9 відповідним елементам масиву а;
      • обчислити для кожної незамінованої клітини кількість мін у сусідніх клітинах;
      • вивести у консоль елементи масиву а поля для полегшення перевірки роботи програми.

    Для спрощення алгоритму підрахунку кількості мін у сусідніх клітинах зручно вважати, що ігрове поле оточено допоміжними порожніми клітинами, які не відображають і не відкривають. Індекси відповідних елементів 2-вимірних масивів можна вказати як:

    • для першого індекса, що описує розташування по горизонталі, 0 і nx+1;
    • для другого індекса, що описує розташування по вертикалі, 0 i ny+1.

    Перевірити можливість компіляції й порівняти з очікуваним.

  6. У коді класу вікна застосунку створити обробник події натискання кнопки вікні вказівкою:

    bt.Clicked += delegate{};
    одразу після вказівок розташування елементів вікна. В обробнику (між фігурними дужками) описати таке:

    • зчитування з текстових полів значень властивостей nx, ny, m області малювання;
    • виклик щойно створеного методу btClicked області малювання;
    • при справдженні властивості р області малювання:
      • методом Resize зміна розміру вікна застосунку для відображення всього ігрового поля;
      • методом QueueDraw виклик перемалювання області малювання.
    Перевірити можливість компіляції й порівняти з очікуваним.

  7. Для класу області малювання створити метод

    public void OnButtonPress(double x, double y) {}
    Назва вказує на те, що цей метод буде викликано обробником події натискання кнопки миші. Метод отримує значення екранних координат вказівника миші відносно вікна застосунку. У методі (між фігурними дужками) описати такі дії:

    • визначити номер рядка і стовпчика клітини, у межах якої натиснуто кнопку миші;
    • властивості p надати значення істинності висловлювання: "клацнуто на закритій клітині";
    • при справдженні p робити таке:
      • якщо клітина містить міну:
        • в усіх клітинах на білому тлі вивести кількість мін у сусідніх клітинах або зображення міни, якщо її розташовано у цій клітині;
      • інакше — при відсутності міни у клітині:
        • при відсутності мін у сусідніх клітинах:
          • виявити усі клітини, у які є шлях з початкової клітити через клітини, для яких немає мін у сусідніх клітинах;
          • в усіх таких виявлених клітинах на білому тлі вивести кількість мін у сусідніх клітинах;
          • зменшити відповідним чином кількість невідкритих клітин без мін;
        • інакше — при наявності мін у сусідніх клітинах:
          • в обраній клітині на білому тлі вивести кількість мін у сусідніх клітинах;
          • зменшити на 1 кількість невідкритих клітин без мін.

    Перевірити можливість компіляції й порівняти з очікуваним.

  8. Для класу вікна застосунку переозначити обробник події натискання кнопки миші On­Button­Press­Event. Описати виконання таких дій:

    • виклик щойно описаного методу OnButtonPress класу області малювання;
    • при справдженні властивості р області малювання:
      • викликати метод QueueDraw, що спричинить перемалювання вікна;
      • якщо всі вільні від мін клітини відкрито, вивести вікно з повідомленням: "Ви виграли!";
      • якщо клацнули на клітині з міною, вивести вікно з повідомленням: "Ви програли!";

    Перевірити можливість компіляції й порівняти з очікуваним.

  9. Перевірити правильність роботи програми. При потребі змінити код.
  10. Зберегти проєкт у вказану вчителем теку.
  11. Повідомити вчителя про завершення роботи над проектом.

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

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


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