Тема: реалізація алгоритму гри «Сапер» з визначенням для кожного елемента таблиці кількість сусідніх елементів з мінами мовою Ruby.
Мета:
Обладнання: комп'ютери зі встановленими ОС, текстовим редактором з підсвіткою тегів, компілятором мови Ruby, бібліотекою Ruby 2D, GTK+ і середовищем наочного програмування Glade, (дана) інструкція.
Структура уроку
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
Використовуючи при потребі:
опис вироблення навичок роботи з середовищем Glade;
опис бібліотеки Ruby 2D щодо зображення фігур, виведення тексту, оновлення вікон й опрацювання подій
протлумачити дію вказівок мовою 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. Вироблення практичних навичок
Примітка. Існує щонайменше дві різні способи виконання завдання.
Створити списки об'єктів, кожен з яких відповідає певній клітинці поля. І змінювати властивості цих об'єктів (колір тла і текст) після ходу гравця.
Всі дані про поточний стан гри зберігати у списках булевих та цілих змінних, а ходи гравця відображати змінами значень у цих списках та малюванням на полотні. Інакше кажучи, об'єкт, що відповідає клітині поля, буде створено не на початку гри, а лише у момент звертання-клацання у відповідній частині поля.
Другий підхід дає можливість мінімальними засобами вирішити поставлене завдання. Саме тому і подання алгоритму словами, і демонстраційне розв'язання витримані у цьому підході. Незначними змінами і словесний алгоритм, і програму можна переписати для першого підходу.
   
Вказівки щодо виконання завдання
 Вікно. Відстежити:На вкладенні Основні у розділі Зовнішній вигляд змінити заголовок на «Параметри гри».

У новоствореному вікні розташувати контейнер 
 Сітка:
у палітрі віджетів клацнути кнопку 
 Сітка групи Контейнери (Containers);
клацнути лівою кнопкою миші у вікні window1;

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

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


Зберегти файл проекту під назвою miner.glade, використавши вказівку меню Файл / Зберегти або натиснувши клавіші Ctrl + S.
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 після рядка:
w.show()
 додати такий код:
builder.get_object("button1").signal_connect("clicked"){
  Tk.messageBox ({
    'icon'   =>'error', 
    'message'=>'Хибні значення параметрів!',
    'title'  =>'Гра «Сапер»',
    'type'   =>'ok'
  })
}
і зберегти файл miner.rb. Пересвідчитися у коректній роботі програми.
Примітка. Всі подальші кроки стосуються лише тіла обробника події натискання кнопки.
Зчитати параметри гри:
При неприйнятних значеннях параметрів виводити вікно повідомлення про хибність значень параметрів і вийти з обробника події. Прийнятними значеннями параметрів вважати такі, при яких справджується такий вираз:
(5<nx) and (nx<51) and (5<ny) and (ny<31) and (0<m) and (m<100)
Cтворити вікно з полотном для зображення ігрового поля темнозеленого кольору '#008000', розміри якого у пікселях дорівнюють добуткам 30 і кількості клітин по горизонталі та вертикалі.
Створити обробник події натискання лівої кнопки миші на ігровому полі, що виводить повідомлення про номери клітини по вертикалі й горизонталі (нумерацію починати з 1).



Примітка. Всі подальші кроки стосуються лише тіла обробника події натискання кнопки миші на ігровому полі, у якому закоментовано вказівку виведення вікна повідомлення про рядок і стовпчик клітини, на якій клацнули лівою кнопкою миші.
Описати список кольорів і символів для відкритих клітин, шлях до шрифту.
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.
Якщо клітину досі невідкрито (зафарбовано зеленим), робити таке:
якщо клітина містить міну, в усіх клітинах на білому тлі вивести кількість мін у сусідніх клітинах або зображення міни, якщо її розташовано у цій клітині;
інакше — при відсутності міни у клітині:
при відсутності мін у сусідніх клітинах:
виявити усі клітини, у які є шлях з початкової клітити через клітини, для яких немає мін у сусідніх клітинах;
в усіх таких виявлених клітинах на білому тлі вивести кількість мін у сусідніх клітинах;
зменшити відповідним чином кількість невідкритих клітин без мін;
інакше — при наявності мін у сусідніх клітинах:
в обраній клітині на білому тлі вивести кількість мін у сусідніх клітинах;
зменшити на 1 кількість невідкритих клітин без мін.
Якщо кількість невідкритих клітин без мін дорівнює нулю, вікно з повідомленням про перемогу.
Припинити виконання програми через 2 секунди після виведення повідомлення про перемогу чи програш. Порівняти з очікуваним.
Перевірити правильність виконання проекту. У разі потреби внести зміни у код програми.
Повідомити вчителя про завершення роботи над проектом.
6. Підбиття підсумків уроку
Обговорення проблем виконання завдання. Виставлення  оцінок.
7. Домашнє завдання 
 У разі потреби доробити завдання. Змінити створену програму:
або не використовуючи вікна "Параметри гри", змінювати значення параметрів за допомогою меню або вікон діалогу;
або використати списки об'єктів-написів, кожен з яких відповідає певній клітинці поля, і змінювати властивості цих об'єктів (колір тла і текст) після ходу гравця.
Текст упорядкував Олександр Рудик.