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

Тема: рух об’єктів у моделюванні гри мовою Ruby.

Мета:

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

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

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

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

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

Протлумачити дію вказівок мовою Ruby (деякі з використанням бібліотеки Ruby 2D)

case i
  when 0
   i=7
  when 1
   i=11
  when 2
   i=13
end

t+=2
i = Image.new("boom.png",x:11, y:22, width: 33, height: 44, z:0, color:"red")
r = Rectangle.new(       x:11, y:22, width: 33, height: 44, z:0, color:"#DDDDDD")
t = Text.new("Claim",    x:11, y:22, size:  16, font: sf,   z:1, color:"black")

on :mouse_down do |e|
  k = e.x
  j = e.y
end

on :key_down do |e|
    k=e.key
end

update do
end

show

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

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


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


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

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

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

Тут:


При виконанні завдання використати конкурс ідей. Після здійснення кожного кроку створений код порівнювати з очікуваним у відповідній частині демон­страційного розв'язання (нумерація кроків — у порядку створення програми).

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

  1. Cтворити й відобразити вікно програми з такими параметрами.

    require 'ruby2d'
    w=800  # ширина вікна програми
    h=450  # висота вікна програми
    dh=20  # висота смуги з елементами керування
    r0=4   # радіус зображення ядра
    r1=4   # радіус зображення цілі
    sf="/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf" # адреса використаного шрифту
    set title:"Гра «Постріл гармати»",                 # параметри вікна ігрового поля
        background:"#96C8FF",
        width:  w,
        height: h

    Адреса використаного шрифту залежить від типу й навіть версії операційної системи.

  2. Cтворити й відобразити написи, «поля введення» й «кнопку» з написом «Fire!» так, як показано на малюнку,


    використавши лише такі засоби бібліотеки Ruby 2D:
    • виведення тексту — для написів і вмісту «поля введення»;
    • зображення прямокутника.

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

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

    "Input valid values: x in (1, 800), y in (0, 430), a in (0, 90), v in (0, 900)."

    — "Введіть правильні значення: x в (1, 800), y в (0, 430), a в (0, 90), v в (0, 900)". Перевірити коректність відобра­ження повідомлення у межах ігрового поля.

  5. Створити обробник події натискання лівої кнопки миші ігровому полі, який :

    • надає значення номеру «поля введення» залежно від координат вказів­ника миші;

    • при клацанні на «полі введення» у стані введення значень параметрів імітує зміну фокусу:

      • з тексту попереднього активного «поля введення» прибирає остан­ній символ (вертикальну риску);

      • до тексту поточного активного «поля введення» долучає вертикаль­ну риску

      — див. наступні малюнки з підписами над ними:

    до клацання лівою кнопкою миші


    після клацання лівою кнопкою миші

    Перевірити коректність виведенням значення змінюваної величини у консоль.

  6. Створити обробник події натискання клавіші клавіатури на етапі введення чи зміни значень параметрів:

    • якщо одночасно справджуються такі умови:
      • «активним» є «поле введення» координат цілі, кута чи швидкості;
      • текст цього «поле» містить менше 4 символів;
      • натиснуто клавішу з цифрою або десятковою точкою,
      вставити цю цифру на передостаннє місце «активного поля введення»;
    • якщо натиснуто клавішу backspace, то вилучити передостанній символ з тексту «активного поля введення»;

    • якщо натиснуто клавішу tab, то:

      • вилучити вертикальну риску з кінця тексту напису поточного «активного поля введення»;

      • зробити «активним» наступне «поле введення»;

      • долучити вертикальну риску до кінця тексту напису поточного «активного поля введення»

    Наочно перевірити коректність опрацювання подій натискання клавіш.

    Примітка. Кроки 7‒9 втілити за допомогою вказівки галуження в циклі оновлення вікна програми

    update do
      t+=dt
    end
  7. Підготувати відображення руху ядра:

    • зчитати з «полів введення» дійсні значення x1, y1, a, v0;
    • при хибності виразу:

      (0<x1) && (x1<800) && (0<y1) && (y1<430) && 
       (0<a) &&   (a<90) && (0<v0) && (v0<900)

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

    • інакше — при справдженні виразу:
      • розташувати повідомлення зовні вікни програми;
      • надати напису на «кнопці» значення «New»;
      • надати нульового значення поточному часу;
      • перейти до радіанної міри кута нахилу;
      • обчислити початкові швидкості по горизонталі й вертикалі;
      • надати координатам зображень таких значень:
        • для ядра — x0, y0;
        • для цілі — x1, y1;
      • вважати, що клацнуто поза межами елементів керування;
      • перейти до етапу відображення руху ядра.
  8. Відобразити рух ядра й можливе зіткнення з ціллю на основі поданих вище формул залежності координат x, y від часу t з урахуванням такого:

    • якщо відстань між центрами ядра й цілі менша від суми їхніх радіусів — ядро влучило у ціль:

      • змінити координати верхнього лівого кута зображення полум'я таким чином, щоб центр зображення лежав посередині між цент­рами цілі та ядра;

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

    • якщо абсциса центра ядра перевищує розмір вікна по горизонталі або його ордината менша від нуля — ядро назавжди вилетіло за межі відображуваного прямокутника — змінити стан гри на очікування рішення щодо початку нової гри.

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

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

    • змінити напис на кнопці на «Fire!»;
    • «перенесення фокусу» на перше «поле введення»;
    • долучити вертикальну риску до тексту першого «поля введення»;
    • змінити стан гри на введення значень параметрів.
  10. Перевірити правильність роботи програми. У разі потреби внести зміни у код програми.

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

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

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

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

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 .

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


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