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

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

Мета: надати учням приклад створення моделі руху об’єкта на площині з перешкодами мовою Java.

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

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

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

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

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

Умовний оператор (повна форма)

if (умова) оператор1 else оператор2;

Оператор вибору одного з багатьох варіантів switch дозволяє уникнути громіздких вкладень if … else … . Наприклад, таким чином:

Scanner in = new Scanner(System.in);
System.out.print("Введіть одне з таких чисел: 1, 2, 3, 4.");
int choice = in.nextInt();
switch (choice)
{ case 1: {System.out.print("Введено 1."); break;}
  case 2: {System.out.print("Введено 2."); break;}
  case 3: {System.out.print("Введено 3."); break;}
  case 4: {System.out.print("Введено 4."); break;}
  default:{System.out.print("Не те…");     break;}
}

Цикл з лічильником for застосовують при необхідності виконати оператори певну кількість раз з одночасним збільшенням або зменшенням певної змінної (лічильника). Наприклад, для виведення на консолі у стовпчик чисел від 1 до 10 включно:

for (int i = 1; i <= 10; i++) {System.out.println(i);}

Клас LinkedList втілює зв'язаний список мовою Java.

3. Вивчення нового матеріалу
Створення комп'ютерної моделі рівномірного прямолінійного руху об’єкта на площині з оминанням перешкод

передбачає:

Для створення програми зручно взяти за основу код прикладу анімації з подвійною буферизацією зображень і використати метод getRGB для визначення кольору пікселя.

Завдання 1. Скласти алгоритм руху об’єкта прямокутним полем з оминанням перешкод (наприклад, відрізків прямих ліній) при таких обмеженнях:

Вхідні дані (розташування перешкод і співвідношення між розмірами поля, об'єкта й величиною стрибка) ґарантують істування розв'язку — відповідної траєкторії руху.

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

Алгоритм (діяти до досягнення правої сторони поля)

  1. Вважати:
    • напрям руху → (зліва направо);
    • номер стану гри 0 — об'єкт не дотикається до перешкоди.
  2. Рухатися вперед до досягнення перешкоди.
  3. Змінити номер стану гри на 1 — об'єкт обходить перешкоду.
  4. Запам'ятати розташування об'єкта.
  5. Змінити поточний напрям руху на перший з можливих у послідовності ↑, ←, ↓.
  6. Обійти перешкоду, полишаючи її праворуч, і знайти на шляху точку, з якої можна почати рух праворуч або почати обхід іншої перешкоди, розташованої (хоча б частково) правіше від поточної перешкоди. Інакше кажучи, поки не досягнуто правого краю поля або останнього розташування кроку, запам'ятованого на кроці 4, робити таке у кожному розташуванні об'єкта:

    • запам'ятати розташування у порядку обходу перешкоди;

    • якщо розташування — правіше від усіх пройдених, тобто абсциса (центра) об'єкта найбільша з усіх досягнутих, запам'ятати його місце у траекторії;

    • наступне переміщення здійснити у першому з можливих напрямків, заданих такою послідовністю різниць кутових аргументів нового напрямку і попереднього (напрям вимірювання традиційний — проти напрямку руху годинникової стрілки):

      • −90° — повернути праворуч;
      • 0° — зберегти напрям руху, бо праворуч перешкода;
      • +90° — повернути ліворуч, якщо перешкода і праворуч, і прямо;
      • +180° — рушити назад, якщо перешкоди немає лише позаду.
  7. Змінити номер стану гри на 2 — об'єкт рухається у «точку відриву» від перешкоди, тобто у розташування з найбільшою абсцисою при обході останньої перешкоди.

  8. Повернутися у «точку відриву».

  9. Очистити пам'ять, відведену на запам'ятовування траєкторії обходу перешкоди.

  10. Перейти до виконання пункту 1.

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

Поради щодо програмного втілення:

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


Завдання 2. Програмно втілити складений алгоритм руху білого круга прямо­кутним полем темно зеленого кольору з оминанням перешкод (наприклад, відрізків прямих ліній) жовтого кольору.

Вважати, що існує шлях для квадрата з горизонтальними і вертикальними сторонами, описаного навколо круга. Останнє припущення дає можливість спростити код перевірки можливості руху у певному напрямку за рахунок збільшення кількості виконуваних дій.

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

  1. Створити проєкт work, у якому файл Work.java містить код раніше розглянутого прикладу з точністю до заміни назви класу та його конструктора. Скористатися описом алгоритму створення проєкту для середовища Eclipse чи Netbeans (з точністю до назв пакунку і класу).

  2. Пристосувати код до виконування завдання:

    • файли field.png і newfield.png скопівати у теку проєкту;

    • описати в окремому файлі клас Point, представники якого мають 2 властивості — цілі коорднати точки, з конструктором за даною парою цілих чисел;

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

      xmax=800,      // розміри поля по горизонталі
      ymax=450,      // розміри поля по вертикалі
      dy=25,         // висота заголовку вікна програми
      r = 8          // радіус рухомого круга
      s = 2          // приріст коорднати за зміну одного кадру
      igame = 0,     // стан гри
      idir = 0,      // напрям руху
      xb,            // найбільше досягнуте значення абсциси
      jb,            // номер точки траєкторії з найбільшим
                     // досягнутим значенням абсциси
      jt;            // поточний номер точки траєкторії при поверненні
                     // у точку "відриву" за найменшу кількість кроків
      boolean incjt; // зростання поточного номера точки траєкторії
                     // при поверненні у "точку відриву від перешкоди"
                     // за найменшу кількість кроків
      LinkedList<Point> t = new LinkedList<Point>();// траєкторія огинання перешкоди,
                        // вимагає на початку програми: import java.util.*;
      BufferedImage bi; // буфер зображення для виведення на екран і визначення кольорів пікселів,
                        // вимагає вилучення оголошення BufferedImage у переозначенні метода Paint
    • вилучити усі вказівки, що містять згадку про:

      • j — номер кадра;
      • g — прискорення земного тяжіння;
      • vy — верткальну складову швидкості круга;
      • dj — приріст абсциси за зміну одного кадру;
      • plane — літак;
      • заповнення темнозеленим кольором;

    • змінити:
      • початкові значення x, y з (10, 550) на (8, 250);
      • назву імпортованого файлу з background.jpg на field.png;
      • змінити розміри вікна з (565, 620) на (xmax,ymax+dy);
      • величину початкової затримки на 1000, щоб заповнення об'єкту BufferedImage відбулося до визначення кольорів його пікселів;
      • вказівку big.drawImage(background,10,35,this) на
        вказівку big.drawImage(background,0,25,this)
        — щоб зелене поле із жовтими перешкодами повністю зайняло вікно програми;
      • колір малювання кругу з червоного (red) на білий (white);
      • аргументи вказівки малювання круга "x,y,16,16" на "x-r,y-r,2*r,2*r";
      • код класу Step на такий, що моделює рівномірний рух зліва направо білого круга на s пікселів за одну зміну кадру;
      • назву вікна на "Java: рух з оминанням перешкод".
  3. Перевірити правильність роботи коду:

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

    і після появи вікна спостерігати рух білого круга зліва направо поверх поверх поля із жовтими перешкодами, незважаючи на останні. У разі потреби внести зміну у код програми. Порівняти з очікуваним.

  4. Програмно втілити алгоритм зміни координат центра круга у коді класу Step.

  5. Перевірити правильність виконання проекту для вхідних файлів field.png і newfield.png:

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

    і спостерігати те, що відбражено на відео вище (на початку тексту) або безпосередньо нижче.

    У разі потреби внести зміни у код програми. Порівняти з очікуваним.

  6. Повідомити вчителя про завершення роботи над проектом.

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

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

У разі потреби доробити завдання.

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

При одночасному зростанні s і розмірів подання перешкод така дискретна модель (зі скінченою кількістю розташувань круга) є гарним наближенням неперервної моделі, у якій можливим є довільне розташування круга без перетину з перешкодами з довільним напрямком переміщення на певну відстань. Файл для опрацювання (із зображенням перешкод) може місти істотно більше пікселів, ніж його зображення на екрані монітора.

Іншим наближенням такої моделі є модель з довільним розташуванням круга без перетину з перешкодами, але векторами переміщення з такими координатами:

(s · cos(πj/2n), s · sin(πj/2n)) при j = 0, 1, …, n.

Якщо сумістити початки векторів, то їхні кінці будуть вершинами правильного 4n-кутника. Кратність 4 кількості вершин вибрано для того, щоб мати можливість рухатися по горозонталі праворуч і ліворуч та по вертикалі вгору й униз. У цьому випадку:

Для обох моделей алгоритм перевірки можливості руху у певному напрямку вимагає істотного доопрацювання з використанням рівняння прямої на площині.


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