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

Тема: рух об’єктів: використання таймера, рух, моделювання гри мовою Java.

Мета:

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

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

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

Хід уроку

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

2. Актуалізація опорних знань
Яким чином створюють графічні примітиви у програмі мовою Java?
Отримані відповіді порівняти з раніше розглянутим прикладом.

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

Таймер-планувальниквбудований засіб мови програмування, що задає виклик певного методу через проміжок часу, вказаний розробником.

Таймер задає багатократне виконання певних дій, дозволяючи, на відміну від циклу, виконувати інші дії у проміжках між зверненнями таймера.

Синтаксис застосування таймера з перевіркою умови продовження роботи таймера мовою Java має такий вигляд.

…
import java.util.TimerTask;
import java.util.Timer;
…
  boolean b=true;        // при справдженні цієї змінної таймер працюватиме
  Timer timer;           // опис типу таймера зовні методу застосування
…
    timer = new Timer(); // створення таймера у методі застосування
    timer.schedule(      // опис розкладу роботи таймера
    new Step(),          // створення і використання представника класу Step
             0,          // початкова затримка у мілісекундах
           100);         // кількість мілісекунд між послідовними викликами
…
    class Step extends TimerTask
    { @Override
      public void run()  // опис періодично виконуваних дій 
      { if (b) { /* код, який викликає таймер */ }
        else   { timer.cancel();}  // знищення таймера для очищення пам'яті
      }
    }
…

Тут трикрапкою … позначено частини коду, що не стосуються роботи таймера.

Використання таймера при створенні анімації засобами подвійної буфернизації подано прикладом, код якого потрібно детально проаналізувати.

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


Завдання. Створити комп'ютерну програму мовою Java для гри «Гармата». Мета гри: для даних розташування цілі й початкової швидкості підібрати кут запуску ядра для ураження цілі.


Математична модель. Для зручності програмного втілення систему координат доцільно вибрати таким чином:

Вважати, що рух тіла є рівномірним по горизонталі і зі сталим прискоренням по вертикалі при нехтуванні опором повітря. Інакше кажучи, вважати, що координати центра ядра залежать від часу t таким чином:

x = x0 + v0x · t,
y = y0 + v0y · t + g · t2/2.

Тут:


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

Вказівки до виконання завдання:

  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. Надати полю для гри потрібного вигляду:
    • розтягнути форму до розміру 750×465;
    • перетягнути на форму з палітри інструментів Palette:
      • панель Panel;
      • напис Label — тричі;
      • текстове поле Text Field — 4 рази;
      • кнопку Button;

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

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

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

  4. Створити обробник події натискання кнопки: клацнути правою кнопкою миші на кнопці й у контекстному меню вибрати Events / Action / actionPerformed (Події / Дія / Виконана дія).

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

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

    boolean b, c;
    int d0=8, d1=8, w, h;
    double a, v0, v0x, v0y, t, x=-d0, y=-d0, x_0, y_0,
      x_1=720-d1/2, y_1=383-d1/2,  dt=0.05,  g=9.8;
    Timer timer;
    з таким тлумаченням:
    • b — чи є потреба змінювати зображення;
    • c — чи відбулося жє потреба змінювати зображення;
    • d0 — діаметр зображення ядра;
    • d1 — діаметр зображення цілі;
    • a — кут нахилу гармати від над ;
    • v0 — абсолютна величина (модуль) початкової швидкості;
    • v0x — складова початкової швидкості по горизонталі;
    • v0y — складова початкової швидкості по вертикалі;
    • t — поточний час моделі;
    • x — поточна абсциса ЛВК квадрата, що містить зображення ядра;
    • y — поточна ордината ЛВК квадрата, що містить зображення ядра ядра;
    • x0 — початкова абсциса ЛВК квадрата, що містить зображення ядра;
    • y0 — початкова ордината ЛВК квадрата, що містить зображення ядра;
    • x1 — абсциса ЛВК квадрата, що містить зображення цілі;
    • y1 — ордината ЛВК квадрата, що містить зображення цілі;
    • dt — приріст часу між виведенням зображень математичної моделі ;
    • g — прискорення земного тяжіння;
    • timer — таймер для створення відображення руху.
  6. Описати визначення параметрів моделі гри після натискання кнопки. Інакше кажучи, у створеному обробнику події натискання кнопки:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
         // TODO add your handling code here:
    }
    на місці коментаря описати:
    • надання початкових змінним b, c, t:
        b = true;
        c = false;
        t = 0;
    • зчитування з текстових полів значень координат центра цілі й обчислення x_1, y_1;
    • зчитування з текстових полів значень a, v0;
    • обчислення значень v0x, v0y;
    • створення і запуск таймера, що запускає щосекунди без початкової затримки Step — представника класу TimerTask.
    Порівняти з очікуваним.
  7. У межах коду класу Game створити код класу Step, чий метод run друкує у консоль повідомлення: "OK Step". Код розташувати безпосередньо після коду обробника подій jButton1­Action­Performed. Порівняти з очікуваним.

  8. Перевірити працездатність коду:
    • або натиснути кнопку Run Project (Запустити Проєкт);
    • або натиснути клавішу F6
    і спостерігати:
    • появу вікна з елементами керування на формі;
    • щосекундне виведення у консоль повідомлення: "OK Step".
  9. Створити код класу Panel — нащадка класу JPanel — одразу після коду класу Step. У цьому класі переозначити метод paint, який має робити таке:

    Запозичити неохідні конструкції мови Java з разіше розглянутого коду. Порівняти з очікуваним.

  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.

  11. Змінити код класу Step замінити вказівку:

    System.out.println("OK Step");

    на код виконання таких дій:
    • визначення поточних координат ЛВК зображення ядра;
    • встановити істинність с — чи відбулося зіткнення ядра з ціллю;
    • перемалювати jPanel1 — застосувати метод repaint;
    • збільшити значення t на значення dt;
    • встановити істинність b такою вказівкою:
      b = (x<w) && (y<h) && (!c);
      — хоча б частину ядра зображено на панелі і зіткнення ядра з ціллю не відбулося;
    • якщо зіткнення ядра з ціллю відбулося, знищити таймер;
    Порівняти з очікуваним.

  12. Перевірити правильність роботи коду:

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

    і після появи вікна з формою змінювати параметри моделі довільним чином та натискати клавішу з написом: "Вогонь!". У разі потреби змінити код.

  13. Файли проєкту Game.form і Game.java зберегти у вказану вчителем теку.
  14. Повідомити вчителя про завершення роботи.

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

7. Домашнє завдання

У разі потреби доробити завдання. У разі невдачі порівняти з очікуваним вмістом Game.form і Game.java. Удосконалити проект, передбачивши можливість врахування сили опору повітря, що дорівнює добутку значення деякої сталої γ (передбачити введення її додатного значення з нового поля введення на формі) і швидкості руху ядра, але спрямована протилежно до напрямку цієї швидкості. Використати такі співвідношення:

x = x0 + vx0 · (1 − eγt ) · γ − 1,

y = y0 + (vy0 · (1 − eγt ) + gt ) · γ − 1 + (eγt − 1) · g · γ − 2.

Ці рівняння можна отримати, розв'язавши систему диференціальних рівнянь:

x' = vx ,
y' = vy ,
(vx)' = − γ · vx ,
(vy)' = − γ · vy + g

з такими початковими значеннями:

x(0) = x0 ,
y(0) = y0 ,
vx(0) = vx0 ,
vy(0) = vy0 .

Теорію диференціальних рівнянь вивчають у вищій школі, тому виведення рівнянь тут не подано.


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