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