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

Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою Ruby.

Мета:

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

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

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

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

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

Використовуючи при потребі:

протлумачити дію вказівок мовою Ruby:

require "tk"
require "gtk3"
require 'ruby2d'
b = Gtk::Builder.new(:file => "miner.glade")
w = b.get_object("window1")
w.signal_connect("destroy"){Gtk.main_quit}
w.show()

b.get_object("button1").signal_connect("clicked"){
  n = b.get_object("entry1").text.to_i
  Tk.messageBox ({
      'icon'   =>'error',
      'message'=>'Щось негаразд',
      'title'  =>'Гра «Сапер»',
      'type'   =>'ok'
  })
  a = Array.new(n){|j| Array.new(n) {|k| 0}}
  k = rand(0..n)
  set title:"Гра «Сапер»",
      background:'#008000',
      width:  99,
      height: 99
  Line.new(x1:1, y1:2, x2:3, y2:4, width: 5, z:0, color:'gray')

  on :mouse_down do |e|
    k = e.x
    j = e.y
    sf = "/usr/share/fonts/truetype/ubuntu/Ubuntu-B.ttf"
    Square.new(x: 1, y: 2, size: 3, color:'white')
    Text.new("!",  x: 1, y: 2, size:24, font: sf, color: 'red')

    t = Time.now
    update do if Time.now - t > 2 then exit end
    end
  end
  show
}
Gtk.main

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

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

Розглянемо таке навчальне завдання.

Завдання. Створити комп'ютерну гру «Сапер» мовою Ruby з використанням бібліотеки Ruby 2D.

Правила комп'ютерної гри «Сапер»

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

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





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


Примітка. Існує щонайменше дві різні способи виконання завдання.

  1. Створити списки об'єктів, кожен з яких відповідає певній клітинці поля. І змінювати властивості цих об'єктів (колір тла і текст) після ходу гравця.

  2. Всі дані про поточний стан гри зберігати у списках булевих та цілих змінних, а ходи гравця відображати змінами значень у цих списках та малюванням на полотні. Інакше кажучи, об'єкт, що відповідає клітині поля, буде створено не на початку гри, а лише у момент звертання-клацання у відповідній частині поля.

Другий підхід дає можливість мінімальними засобами вирішити поставлене завдання. Саме тому і подання алгоритму словами, і демонстраційне розв'язання витримані у цьому підході. Незначними змінами і словесний алгоритм, і програму можна переписати для першого підходу.

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

  1. Створити теку для збереження проекту (за вказівкою вчителя).
  2. Завантажити середовище дизайнера інтерфейсів Glade.
  3. Створити вікно. У палітрі віджетів групи Вікна (Toplevels) клацнути по кнопці Вікно. Відстежити:

    • створення вікна window1 GtkWindow;
    • відображення його на вкладенні вікна проекту;
    • появі відповідного запису в Інспекторі об'єктів.

    На вкладенні Основні у розділі Зовнішній вигляд змінити заголовок на «Параметри гри».


  4. У новоствореному вікні розташувати контейнер Сітка:

    • у палітрі віджетів клацнути кнопку Сітка групи Контейнери (Containers);

    • клацнути лівою кнопкою миші у вікні window1;

    • у вікні діалогу:
      • ввести кількість рядків (4) і стовпчиків (2);
      • натиснути кнопку Створити;

    • помітити появу контейнера у вікні, а в Інспекторі об'єктів — появу об'єкта grid1 GtkGrid.

  5. Заповнити контейнер елементами керування:
    • трьома позначками ;
    • трьома полями введення тексту ;
    • однією кнопкою ,
    змінюючи:
    • тексти позначок і кнопки на вкладенні Основні у розділі Зовнішній вигляд;

    • для позначок на вкладенні Спільні у розділі Розміщення віджету — властивість Вирівнювання / За горизонталлю на Початок;


    • для полів введення тексту на вкладенні Основні у розділі Запис значення властивостей:
      • Максимальна ширина в символах;
      • Максимальна довжина;
      • Ширина в символах
      — 3.

  6. Зберегти файл проекту під назвою miner.glade, використавши вказівку меню Файл / Зберегти або натиснувши клавіші Ctrl + S.

  7. Запрограмувати створення й відображення вікна:
    • у середовищі текстового редактора створити новий файл miner.rb;
    • увести такий текст (можна без коментарів):
      require "tk"                                 # підключити бібліотеку tk
      require "gtk3"                               # підключити бібліотеку gtk+
      require 'ruby2d'                             # підключити бібліотеку ruby2d  
      b = Gtk::Builder.new(:file => "miner.glade") # створити об'єкт Gtk::Builder і завантажити файл miner.glade у форматі xml створеного інтерфейсу
      w = b.get_object("window1")                  # створити вікно на основі опису об'єкта window1 з файлу miner.glade
      w.signal_connect("destroy"){Gtk.main_quit}   # сторити обробник події закриття w для коректного завершення роботи програми
      w.show()                                     # відобразити об'єкт w на екрані
      Gtk.main                                     # запустити програму
    • зберегти файл з назвою miner.rb.

    Пересвідчитися у тому, що виконання програми miner.rb призводить до появи вікна такого вигляду.

  8. Створити обробник події натискання кнопки, що забезпечить виведення повідомлення "Хибні значення параметрів!"

    Для цього у файлі miner.rb після рядка:

    w.show()

    додати такий код:

    builder.get_object("button1").signal_connect("clicked"){
      Tk.messageBox ({
        'icon'   =>'error', 
        'message'=>'Хибні значення параметрів!',
        'title'  =>'Гра «Сапер»',
        'type'   =>'ok'
      })
    }

    і зберегти файл miner.rb. Пересвідчитися у коректній роботі програми.

    Примітка. Всі подальші кроки стосуються лише тіла обробника події натискання кнопки.

  9. Зчитати параметри гри:

    • кількості клітин nx , ny;
    • відсоток клітин з мінами m.
  10. При неприйнятних значеннях параметрів виводити вікно повідом­лення про хибність значень параметрів і вийти з обробника події. Прийнятними значеннями параметрів вважати такі, при яких справджується такий вираз:

    (5<nx) and (nx<51) and (5<ny) and (ny<31) and (0<m) and (m<100)

  11. Підрахувати кількість мін.
  12. Випадковим чином заповнити частину клітин мінами.
  13. Підрахувати кількість мін у сусідніх клітинах для кожної клітини.
  14. Cтворити вікно з полотном для зображення ігрового поля темнозеленого кольору '#008000', розміри якого у пікселях дорівнюють добуткам 30 і кількості клітин по горизонталі та вертикалі.

  15. Зобразити межі клітин товщиною 3 пікселі сірого кольору "gray80".
  16. Створити обробник події натискання лівої кнопки миші на ігровому полі, що виводить повідомлення про номери клітини по вертикалі й горизонталі (нумерацію починати з 1).





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

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

  18. Описати список кольорів і символів для відкритих клітин, шлях до шрифту.

    c = [
      "#eeeeee", # білий колір
      "#0000ee", # синій колір
      "#008800", # зелений колір
      "#daa520", # золотарний колір goldenrod
      "#800080", # фіолетовий колір
      "#ee0000", # червоний колір
      "#808000", # оливковий колір
      "#4b0082", # колір індиго
      "#8b4513", # сідельно коричневий колір saddle brown
      "#808080"] # сірий колір - для невиявленої міни
    s = [" ","1","2","3", "4","5","6","7","8","*"]
    sf = "/usr/share/fonts/truetype/ubuntu/Ubuntu-B.ttf"
    Останній рядок стосується ОС Linux Mint 18 Mate.
  19. Якщо клітину досі невідкрито (зафарбовано зеленим), робити таке:

    • якщо клітина містить міну, в усіх клітинах на білому тлі вивести кількість мін у сусідніх клітинах або зображення міни, якщо її розташовано у цій клітині;

    • інакше — при відсутності міни у клітині:

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

        • виявити усі клітини, у які є шлях з початкової клітити через клітини, для яких немає мін у сусідніх клітинах;

        • в усіх таких виявлених клітинах на білому тлі вивести кількість мін у сусідніх клітинах;

        • зменшити відповідним чином кількість невідкритих клітин без мін;

      • інакше — при наявності мін у сусідніх клітинах:

        • в обраній клітині на білому тлі вивести кількість мін у сусідніх клітинах;

        • зменшити на 1 кількість невідкритих клітин без мін.

      Якщо кількість невідкритих клітин без мін дорівнює нулю, вікно з повідомленням про перемогу.

  20. Припинити виконання програми через 2 секунди після виведення повідомлення про перемогу чи програш. Порівняти з очікуваним.

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

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

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

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

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


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