Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою Java.
Мета:
Обладнання: комп’ютери зі встановленими ОС, JDK (Java Developer Kit, комплект розробника Java) та середовищем Netbeans для програмування мовою Java.
Структура уроку
Хід уроку
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. Вироблення практичних навичок
Вказівки щодо створення програми
Створити форму для елементів графічного інтерфейсу:
на вкладенні Project (Проекти) клацанням правої кнопки миші на вузлі game викликати контекстне меню;
у контексному меню вибрати New / Other (Новий / Інше);
У результаті буде створено форму Game, пов'язану з файлом Game.java. Клас Game відкриває форму Game в GUI Builder. Пакунок game стане пакунком як усталено.
розтягнути форму до розміру 303 × 331 (помилка у кілька пікселів неістотна, бо її буде виправлено у коді програми на кроці 7 даного алгоритму);
Виділити панель у навігаторі об'єктів (малюнок знизу ліворуч) і на вкладенні властивостей задати колір (0, 128, 0) моделі RGB (малюнок знизу праворуч).
Виділити напис, текстове поле чи кнопку у навігаторі об'єктів (малюнок знизу ліворуч) і на вкладенні властивостей задати відповідне значення властивості text (малюнок знизу праворуч).
Виділити форму у навігаторі об'єктів (малюнок знизу ліворуч) і на вкладенні властивостей задати значення властивості title "Гра «Сапер»" (малюнок знизу праворуч).
Запровадити змінні класу 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); // шрифт виведення цифр
Створити обробник події натискання кнопки: клацнути правою кнопкою миші на кнопці й у контекстному меню вибрати Events / Action / actionPerformed (Події / Дія / Виконана дія).
При виборі actionPerformed (Виконана дія) середовище програмування створить метод обробника події jButton1ActionPerformed. У середовищі програмування буде відкрито вкладення Source (Джерело), де відображено місце для опису дії, яку потрібно виконати після натискання кнопки за допомогою миші або клавіатури. Сіре тло позначає код, породжений середовищем програмування у відповідь на дії програміста.
Примітка. Вище описано створення обробника події з використанням контексного меню об'єкта. Нижче описано створення обробника події натискання кнопки миші на панелі з використанням інтерфейсу середовища програмування Netbeans.
Описати визначення параметрів моделі гри після натискання кнопки. Інакше кажучи, у створеному обробнику події натискання кнопки:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }на місці коментаря здійснити таке:
Використати структуру:
try {…} catch (Exception e) {…}
таким чином, щоб при помилці перетворення зчитаних рядків у цілі числа вивести інформаційне вікно Помилка введення з таким повідомленням про помилку: "Поля введення містять сторонні символи. Це можуть бути навіть пробіли."
інакше вивести інформаційне вікно Хибні значення параметрів з таким повідомленням про помилку: "Розмір поля для гри — ціле число від 6 до 50 по горизонталі і від 6 до 30 по вертикалі, а відсоток має бути додатним і не перевищувати 100".
Порівняти створене з очікуваним.
Доповнити конструктор класу Game вказівками задання розмірів форми й панелі:
public Game() { initComponents(); this.setSize(w+2,h+55); jPanel1.setSize(w,h); jPanel1.repaint(); }
Перевірити працездатність коду:
і спостерігати появу вікна такого вигляду.
Змінюючи вхідні дані у полях введення, наприклад, використавши такі набори:
отримати виведення кожного із запрограмованих вікон діалогу.
Створити код класу Panel — нащадка класу JPanel — одразу після коду методу jButton1ActionPerformed. У цьому класі переозначити метод paint, який має відображати поточний стан гри у такому порядку:
Порівняти з очікуваним.
Змінити код породження панелі jPanel1:
у вікні діалогу JPanel1 [JPanel] - Custom Creation Code ввести текст:
new Panel();
і натиснути кнопку з написом OK.
У результаті цих дій у коді програми, породженому середовищем програмування (на сірому тлі у робочому полі) рядок:
jPanel1 = new javax.swing.JPanel();
буде замінено на такий:
jPanel1 = new Panel();
Таким чином, при виконанні коду об'єкт jPanel1 буде створено як представник класу Panel з переозначеним методом paint.
Тимчасово задавши відкритість усіх клітин ігрового поля (інакше кажучи, надавши значення true змінній d_defined і всім елементам масиву d), перевірити правильність відображення вмісту відритих клітин і отримати щось схоже на таке.
У разі потреби змінити код.
Створити обробник події натискання клавіші миші на панелі. У середовищі Netbeans:
на вкладенні Events (Події) натиснути кнопку з трикрапкою у рядку з написом mousePressed;
у вікні діалогу Handlers for mousePressed (Обробники для події натискання кнопки миші) натиснути клавішу з написом Add…;
у вікні діалогу Add Handler (Додати Обробник) ввести назву обробника step і натиснути клавішу з написом OK;
у вікні діалогу Handlers for mousePressed (Обробники для події натискання кнопки миші) натиснути клавішу з написом OK;
помітити результат створення середовищом програмування методу обробника події. У середовищі програмування буде відкрито вкладення Source (Джерело), де відображено місце для опису дії, яку потрібно виконати після натискання кнопки миші.
Наповнити код обробника події натискання клавіші миші на панелі:
визначити номер рядка і стовпчика клітини, у межах якої натиснуто кнопку миші;
якщо клітину досі зафарбовано зеленим, робити таке:
якщо клітина містить міну:
в усіх клітинах на білому тлі вивести кількість мін у сусідніх клітинах або зображення міни, якщо її розташовано у цій клітині;
через 2 секунди вивести вікно з повідомленням про програш;
інакше — при відсутності міни у клітині:
при відсутності мін у сусідніх клітинах:
виявити усі клітини, у які є шлях з початкової клітити через клітини, для яких немає мін у сусідніх клітинах;
в усіх таких виявлених клітинах на білому тлі вивести кількість мін у сусідніх клітинах;
зменшити відповідним чином кількість невідкритих клітин без мін;
інакше — при наявності мін у сусідніх клітинах:
в обраній клітині на білому тлі вивести кількість мін у сусідніх клітинах;
зменшити на 1 кількість невідкритих клітин без мін.
Якщо кількість невідкритих клітин без мін дорівнює нулю, вікно з повідомленням про перемогу.
Порівняти з очікуваним.
6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення оцінок.
7. Домашнє завдання
У разі потреби доробити завдання. Удосконалити проект, передбачивши можливість задання розмірів клітини, обчислення і зміну цих розмірів при зміні розмірів вікна.
Текст упорядкував Олександр Рудик.