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

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

Мета: сформувати предметні компетенції щодо технологій імітації руху та моделювання гри.

Учень повинен пояснювати: призначення та спосіб дії програмного таймера.

Учень повинен вміти:

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

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

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

Хід уроку

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

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

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

  2. Прокоментувати дію вказівок і зміст аргументів Step.

      boolean b=true;
      Timer timer;
    …
        timer = new Timer();
        timer.schedule(
        new Step(),
                 0,
               100);
    …
        class Step extends TimerTask
        { @Override
          public void run()
          { if (b) { … }
            else   { timer.cancel();}
          }
        }
  3. Яким чином створюють здійснюють анімацію без мерехтіння екрану у програмі мовою Java? Відповідь порівняти з раніше розглянутим прикладом.

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


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

Завдання.

  1. Описати порядок створення складових гри Пінг-Понг з відбиванням м'яча від бокових меж ігрового поля і двох ракеток, керування однією з яких здійснює людина, а керування іншою здійснює комп’ютерна програма.

  2. Cтворити й налагодити програму для такої гри.

  3. Код програми записати у файл Ваше_прізвище у теку, вказану вчителем.

Порядок створення складових гри Пінг-Понг
(бажано отримати як результат конкурсу ідей)

  1. Запозичити код.
  2. Вилучити з коду все зайве.
  3. Задати значення змінних головного класу.
  4. У коді перевизначення методу paint відобразити поточний стан гри.
  5. Створити обробники подій, використавши наданий зразок.
  6. У завданні для таймера описати зміну стану гри за 1 крок.

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

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

  2. Вилучити з коду зайве: вилучити вказівки, що стосуються відображення вмісту файлів background.jpg (лісовий пейзаж) і plane.png (літак). Перевірити правильність роботи коду:

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

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

  3. Задати значення змінних головного класу.

     public int
        i=0,   // стан гри
        il=0,  // кількість очок на рахунку програми
        ir=0,  // кількість очок на рахунку гравця
        w=780, // ширина вікна програми та ігрового поля
        h=500, // висота ігрового поля
        c=24,  // висота рядка заголовку вікна програми     
        a=10,  // ширини прямокутника — зображення ракетки
        b=100, // висота прямокутника — зображення ракетки,
        d=20,  // діаметр круга — зображення м'яча,
        d_=8,  // приріст ординати ракетки на одне оновлення екрану (3),
        dx=0,  // приріст поточної величини приросту абсциси  круга за 1 такт оновлення екрану
        dy=0,  // приріст поточної величини приросту ординати круга за 1 такт оновлення екрану
        dx_=9, // верхня межа приросту абсциси круга за 1 такт оновлення екрану
        dy_=4, // верхня межа приросту ординати круга за 1 такт оновлення екрану
        x =(w-d)/2,   // поточна абсциса  ЛВК квадрата, що містить зображення м'яча
        y =(h-a)/2+c, // поточна ордината ЛВК квадрата, що містить зображення м'яча     
        yl=(h-b)/2+c, // ордината верхнього краю прямокутника-ракетки ліворуч,  керованого програмою
        yr=(h-b)/2+c; // ордината верхнього краю прямокутника-ракетки праворуч, керованого людиною
      public boolean
        up   = false, // потрібно рухати  жовтий  прямокутник догори
        down = false; // потрібно рухати червоний прямокутник догори     
        Font f = new Font("Serif",Font.BOLD, 24); // шрифт для виведення рагунку
        Timer timer;
    і змінити у коді конструктора:
    • вказівку задання розмірів вікна на таку: setSize(w, h+c);
    • проміжок часу між послідовними викликами таймера:

      timer.schedule(new Step(), 0, 50);
  4. Відобразити поточний стан гри у коді перевизначення методу paint:

    • ігрове поле темно зеленого кольору "#008000";
    • лінії розмітки і зображення м'яча білого кольору;
    • прямокутники (зображення ракеток):
      • ліворуч — червоного кольору — керований програмою;
      • праворуч — жовтого кольору — керований користувачем;
    • написів для ведення рахунку з нижнім лівим кутом:
      • по горизонталі — на 9 пікселів лівіше від середини половини поля;
      • по вертикалі — на 30 пікселів нижче верхньої межі поля.
  5. Створити обробники подій, породжених клавіатурою, вставивши наприкінці коду класа Graphtest такі вказівки переозначення обробників подій:

     
    @Override public void keyPressed  (KeyEvent e)
    { if (e.getKeyCode()==KeyEvent.VK_UP)   {up=true;  down=false;}
      if (e.getKeyCode()==KeyEvent.VK_DOWN) {up=false; down=true; }
    }
    @Override public void keyTyped   (KeyEvent e){}
    @Override public void keyReleased(KeyEvent e){up=false; down=false; }

    Для успішної компіляції потрібно ще: вставити у довільне місце коду конструктора класу Graphtest встановлення прослуховування подій, породжених клавіатурою:

    this.addKeyListener((KeyListener) this);

    і оголосити його використання у класі Graphtest, розширивши його заголовок до такого:

    public class Graphtest extends JFrame implements KeyListener

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

  6. У завданні для таймера описати зміну стану гри за 1 крок.

    • Якщо номер стану гри 0 (вкидання м'яча у напрямку ліворуч), розташу­вати білий круг у центрі поля, надати йому сталої горизонтальної швидкості ліворуч, випадкової вертикальної швидкості і перейти до стану гри з номером 1.

    • Якщо номер стану гри 1 (рух м'яча):

      • надати координатам ЛВК круга приростів;

      • врахувати можливість відбивання від горизонтальних меж поля:

        • складова швидкості по вертикалі змінює напрям на протилежний;

        • відрізок з кінцями у центрах кругів при русі з відбиванням і без нього перпендикулярний до межі і поділяється нею навпіл;

      • якщо найближча до лівого (правого) краю екрану точка білого круга перетнула білу обмежувальну лінію поза розташуванням прямокутника червоного (жовтого) прямокутника зображення ракетки програми (користувача), збільшити рахунок суперника на 1 у перейти до стану гри з номером 0 (2).

    • Якщо номер стану гри 2 (вкидання м'яча у напрямку праворуч), розташу­вати білий круг у центрі поля, надати йому сталої горизонтальної швидкості праворуч, випадкової вертикальної швидкості і перейти до стану гри з номером 1.

  7. Перевірити правильність роботи програми. У разі потреби змінити код.

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

6. Домашнє завдання
Порівняти створену програму з демонстраційним розв'язанням. Змінити наявну програму, додавши випадковість у вибір величини перемі­щення ракетки, керованої програмою. Інакше кажучи, надати можливість користувачу виграти.


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