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

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

Мета:

Обладнання: комп’ютери зі встановленими ОС, JDK (Java Developer Kit, комплект розроб­ника Java) та середовищем Netbeans для програмування мовою Java.

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

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

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

2. Актуалізація опорних знань
Протлумачити дію вказівок мовою Java і порівняти з очікуваним.

jPanel1.setSize(w,h);
n = Integer.parseInt(textField1.getText());
Random random = new Random();
k=random.nextInt(n);
JOptionPane.showMessageDialog(Game.this,
  new String[] {"A","B"}, "C",
  JOptionPane.INFORMATION_MESSAGE);
jPanel1.repaint();

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

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

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

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

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

Для створення програмного втілення гри візьмемо за основу:

Перелічені коди потрібно проаналізувати щодо того, як їх застосувати при виконанні завдання. Наприклад, з останнього коду використати таке: в обробнику події е натискання клавіші миші записати координати вказівника миші як e.x та e.y.

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


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

  1. Cтворити проєкт game:

    • у середовищі Netbeans:
      • або натиснути клавіші Ctrl + Shift + N;
      • або використати вказівку меню File / New Project (Файл / Створити проект);


    • у вікні діалогу New Project (Новий проєкт):
      • в області Categories (Категорії) вибрати Java;
      • в області Projects (Проекти) вибрати Java Application (Застосунок Java);
      • натиснути кнопку Next (Далі);


    • у вікні діалогу New Java Application (Новий застосунок Java):
      • ввести game у поле Project Name (Назва проекту);
      • встановити прапорець Use Dedicated Folder for Storing Libraries;
      • вказати місце розташування папки бібліотек (необов'язково);
      • видалити прапорець Create Main Class (Створити головний клас);
      • клацнути по кнопці Finish (Завершити).

  2. Створити форму для елементів графічного інтерфейсу:

    • на вкладенні Project (Проекти) клацанням правої кнопки миші на вузлі game викликати контекстне меню;

    • у контексному меню вибрати New / Other (Новий / Інше);


    • у вікні діалогу New File:
      • у полі Categories (Категорії) вибрати Swing GUI Forms (Форми Swing GUI);
      • у полі File Types (Типи Файлів) вибрати JFrame Form (Форма JFrame);
      • натиснути кнопку Next (Далі);


    • у вікні діалогу New JFrame Form:
      • ввести Game у полі Class Name (Назва класу);
      • вибрати (вказати) пакет game;
      • клацнути по кнопці Finish (Завершити).

    У результаті буде створено форму Game, пов'язану з файлом Game.java. Клас Game відкриває форму Game в GUI Builder. Пакунок game стане пакунком як усталено.


  3. Надати полю для гри потрібного вигляду:
    • розтягнути форму до розміру 303 × 331 (помилка у кілька пікселів неістотна, бо її буде виправлено у коді програми на кроці 7 даного алгоритму);

    • перетягнути на форму з палітри інструментів Palette:
      • панель Panel;
      • напис Label — двічі;
      • текстове поле Text Field — тричі;
      • кнопку Button;

    Виділити панель у навігаторі об'єктів (малюнок знизу ліворуч) і на вкладенні властивостей задати колір (0, 128, 0) моделі RGB (малюнок знизу праворуч).

    Виділити напис, текстове поле чи кнопку у навігаторі об'єктів (малюнок знизу ліворуч) і на вкладенні властивостей задати відповідне значення властивості text (малюнок знизу праворуч).

    Виділити форму у навігаторі об'єктів (малюнок знизу ліворуч) і на вкладенні властивостей задати значення властивості title "Гра «Сапер»" (малюнок знизу праворуч).

  4. Запровадити змінні класу Game, необхідні для комп'ютерного втілення гри:

    int   nx = 10,  // кількість клітин по горизонталі
          ny = 10,  // кількість клітин по вертикалі
          nxy=nx*ny,// кількість клітин поля гри
          m = 10,   // відсоток або кількість мін
          n,        // кількість невідкритих клітин без мін
          j,        // номер рядка
          k,        // номер стовпчика
          j0,       // номер рядка клітини з підірваною міною
          k0,       // номер стовпчика клітини з підірваною міною
          w=nx*30,  // ширина панелі
          h=ny*30,  // висота панелі
      l0, l;        // лічильники для відкриття
    int v[] = new int[1664];// допоміжний масив для
                            // 1) випадкового розташування мін
                            // 2) черги відкриття клітин без мін
    int u[] = new int[1664];// допоміжний масив для
                            // черги відкриття клітин без мін
    int     a[][] = new     int [32][52]; // дані про кількість клітин
    boolean b[][] = new boolean [32][52]; // дані про наявність мін
    boolean d[][] = new boolean [32][52]; // справджується для відкритих клітин
    Color c[]= { Color.white,       // білий колір
             new Color(0xFF0000ee), // синій колір
             new Color(0xFF008800), // зелений колір
             new Color(0xFFdaa520), // золотарний колір goldenrod
             new Color(0xFF800080), // фіолетовий колір
             new Color(0xFFee0000), // червоний колір
             new Color(0xFF808000), // оливковий колір
             new Color(0xFF4b0082), // колір індиго
             new Color(0xFF8b4513), // сідельно коричневий колір saddle brown
             new Color(0xFF808080)};// сірий колір для міни
    Font f = new Font("SansSerif", Font.BOLD, 24); // шрифт виведення цифр
  5. Створити обробник події натискання кнопки: клацнути правою кнопкою миші на кнопці й у контекстному меню вибрати Events / Action / actionPerformed (Події / Дія / Виконана дія).

    При виборі actionPerformed (Виконана дія) середовище програмування створить метод обробника події jButton1­Action­Performed. У середовищі програмування буде відкрито вкладення Source (Джерело), де відображено місце для опису дії, яку потрібно виконати після натискання кнопки за допомогою миші або клавіатури. Сіре тло позначає код, породжений середовищем програмування у відповідь на дії програміста.

    Примітка. Вище описано створення обробника події з використанням контексного меню об'єкта. Нижче описано створення обробника події натискання кнопки миші на панелі з використанням інтерфейсу середовища програмування Netbeans.

  6. Описати визначення параметрів моделі гри після натискання кнопки. Інакше кажучи, у створеному обробнику події натискання кнопки:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
         // TODO add your handling code here:
    }
    на місці коментаря здійснити таке:

    • зчитування з полів введення даних:
      • розміри поля nx , ny;
      • відсоток клітин з мінами m.

      Використати структуру:

      try {…} catch (Exception e) {…}

      таким чином, щоб при помилці перетворення зчитаних рядків у цілі числа вивести інформаційне вікно Помилка введення з таким повідомленням про помилку: "Поля введення містять сторонні символи. Це можуть бути навіть пробіли."


    • якщо виміри сторін поля лежать у межах:
      • від 6 до 50 по горизонталі;
      • від 6 до 30 по вертикалі,
      а відсоток — додатний і не перевищує 100, робити таке:
      • підрахувати кількість мін;
      • випадковим чином заповнити частину клітин мінами;
      • підрахувати для кожної клітини кількість мін у сусідніх клітинах;
      • надати значення:
        • ширина / висота панелі — добуток 30 і кількості стовпчиків / рядків;
        • ширина / висота форми — сума відповідного розміру панелі + 25 / 65;
      • вивести вікно Гра «Сапер» з повідомленням: "Увага: розпочато нову гру!"

    • інакше вивести інформаційне вікно Хибні значення параметрів з таким повідомленням про помилку: "Розмір поля для гри — ціле число від 6 до 50 по горизонталі і від 6 до 30 по вертикалі, а відсоток має бути додатним і не перевищувати 100".

    Порівняти створене з очікуваним.

  7. Доповнити конструктор класу Game вказівками задання розмірів форми й панелі:

    public Game()
    { initComponents();
      this.setSize(w+2,h+55);
      jPanel1.setSize(w,h);
      jPanel1.repaint();
    }
  8. Перевірити працездатність коду:

    • або натиснути кнопку Run Project (Запустити Проєкт);
    • або натиснути клавішу F6

    і спостерігати появу вікна такого вигляду.



    Змінюючи вхідні дані у полях введення, наприклад, використавши такі набори:

    • "10", "10", "10 ";
    • "10", "10", "0";
    • "10", "10", "10",

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

  9. Створити код класу Panel — нащадка класу JPanel — одразу після коду методу jButton1­Action­Performed. У цьому класі переозначити метод paint, який має відображати поточний стан гри у такому порядку:

    • зелений прямокутник розміром панелі;
    • світлосірі — (200, 200, 200) у моделі RGB — межі клітин;
    • для відкритих клітин:
      • без мін — біле тло і кількість мін у сусідніх клітинах відповідного кольору;
      • з міною — біле тло і круг червоного кольору.

    Порівняти з очікуваним.

  10. Змінити код породження панелі jPanel1:

    • у робочому полі середовища Netbeans перейти на вкладення Design (Дизайн);
    • виділити на формі панель JPanel1;
    • на панелі Properties (Властивості) у рядку властивості Custom Creation (Створення користувачем) клацнути по кнопці з трикрапкою;

    • у вікні діалогу JPanel1 [JPanel] - Custom Creation Code ввести текст:

      new Panel();

      і натиснути кнопку з написом OK.

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

    jPanel1 = new javax.swing.JPanel();

    буде замінено на такий:

    jPanel1 = new Panel();

    Таким чином, при виконанні коду об'єкт jPanel1 буде створено як представник класу Panel з переозначеним методом paint.

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

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

  11. Створити обробник події натискання клавіші миші на панелі. У середовищі Netbeans:

    • на вкладенні Design (Дизайн) виділити панель jPanel1;
    • на вкладенні Events (Події) натиснути кнопку з трикрапкою у рядку з написом mousePressed;

    • у вікні діалогу Handlers for mousePressed (Обробники для події натискання кнопки миші) натиснути клавішу з написом Add…;

    • у вікні діалогу Add Handler (Додати Обробник) ввести назву обробника step і натиснути клавішу з написом OK;

    • у вікні діалогу Handlers for mousePressed (Обробники для події натискання кнопки миші) натиснути клавішу з написом OK;

    • помітити результат створення середовищом програмування методу обробника події. У середовищі програмування буде відкрито вкладення Source (Джерело), де відображено місце для опису дії, яку потрібно виконати після натискання кнопки миші.

  12. Наповнити код обробника події натискання клавіші миші на панелі:

    • визначити номер рядка і стовпчика клітини, у межах якої натиснуто кнопку миші;

    • якщо клітину досі зафарбовано зеленим, робити таке:

      • якщо клітина містить міну:

        • в усіх клітинах на білому тлі вивести кількість мін у сусідніх клітинах або зображення міни, якщо її розташовано у цій клітині;

        • через 2 секунди вивести вікно з повідомленням про програш;

      • інакше — при відсутності міни у клітині:

        • при відсутності мін у сусідніх клітинах:

          • виявити усі клітини, у які є шлях з початкової клітити через клітини, для яких немає мін у сусідніх клітинах;

          • в усіх таких виявлених клітинах на білому тлі вивести кількість мін у сусідніх клітинах;

          • зменшити відповідним чином кількість невідкритих клітин без мін;

        • інакше — при наявності мін у сусідніх клітинах:

          • в обраній клітині на білому тлі вивести кількість мін у сусідніх клітинах;

          • зменшити на 1 кількість невідкритих клітин без мін.

        Якщо кількість невідкритих клітин без мін дорівнює нулю, вікно з повідомленням про перемогу.

    Порівняти з очікуваним.

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

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

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


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