Нарешті ми дійшли до етапу, після якого наша програма буде працювати і користувач зможе пройти лабіринт.
Написання програмного коду (на Visual C#)
1. Відкрийте проєкт StepByStep.
2. Відкрийте код проекту.
3. В програмі нам потрібно буде перевіряти який зараз крок. Для цього потрібна змінна. У програмному коді знайдіть рядок, де починається конструктор форми:
public partial class Form1 : Form
та одразу після цього рядка напишіть команду оголошення змінної:
int intCurrentStep = 1;
У цьому рядку ми оголошуємо змінну та одразу задаємо їй початкове значення 1, тобто буде перший крок по лабіринту.
4. При натисканні кнопкою миші на будь-який елемент Label (це подія Click), якщо хід можливий, то цей елемент повинен змінити свій колір, а змінна intCurrentStep повинна збільшити своє значення на 1, тобто буде наступний крок.
Як первірити чи можливій хід? Дуже просто - перевірити чи дорівнює значення всередині кола значенню intCurrentStep. Для цього можна записати таку умову:
if (Convert.ToInt32(label1.Text) == intCurrentStep)
{
intCurrentStep++;
}
Але тут ми вказуєто на елемент label1, а у нас таких елементів багато. Щоб не писати для всіх елементів Label окрему умову, ми скористаємося об'єктом sender. Sender передається як параметр до процедури label1_Click і вказує на якому елементі ми клацнули.
Змінивши код отримуємо такий код обробки події Click:
private void label1_Click(object sender, EventArgs e)
{
Label elem = (Label)sender;
if (Convert.ToInt32(elem.Text) == intCurrentStep)
{
intCurrentStep++;
elem.Tag = 1;
elem.Refresh();
}
}
У цьому коді є деякі важливі моменти:
1) Ми не можемо просто написати sender.Text. sender - це може бути будь-який елемент, не обов'язково той, де є властивість Text. Спочатку необхідно вказати що ми вважаємо sender є елементом Label. Для цього ми записали перший рядок:
Label elem = (Label)sender;
Далі ми будемо звертатися до об'єкту sender через змінну elem.
2) Властивість elem.Text є рядком. Щоб порівняти це значення з числом intCurrentStep, ми використовуємо функцію Convert.ToInt32.
3) У коді ми задіяли властивість Tag. Цієї сластивості можна присвоїти будь-яке значення. Тут просто домовимось, що 1 буде означати, що ми клацнули по цьому колу і його потрібно замалювати.
4) Метод elem.Refresh() дозволяє визвати подію Paint щоб оновити зображення.
5. Виділіть на формі всі інші елементи Label, у вікні Properties знайдіть подію Click, натисніть на стрілку праворуч, та оберіть обробник події label1_Click.
6. Якщо ви зараз запустите програму на виконання, то нічого не буде працювати, тому що ми не змінили обробник події Paint так, щоб елемент змінював колір при значенні elem.Tag = 1.
Отже, знайдіть обробник події Paint і змініть код наступним чином:
private void label1_Paint(object sender, PaintEventArgs e)
{
Label elem = (Label)sender;
e.Graphics.DrawEllipse(Pens.Red, 0, 0, 49, 49);
if(Convert.ToInt32(elem.Tag) == 1)
{
Brush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255));
e.Graphics.FillEllipse(semiTransBrush, 0, 0, 49, 49);
}
else
{
e.Graphics.DrawEllipse(Pens.Red, 0, 0, 49, 49);
}
}
8. Запустіть програму на виконання, перевірте роботу програми. При натисканні на кола, вони повинні змінювати свій колір:
Недоліки програми
Зараз програма працює так, що після цифри 3 можна натиснути будь-яке коло з цифрою 4. Бачите зліва там є ще одна цифра 4? Так само з іншими цифрами. Тобто в програму потрібно додати умови щоб цього не можна було зробити. Ще в програмі не вистачає перевірки чи ми дійшли до фінішу. Ці завдання зробіть самостійно.
Додаткові завдання
1. Додайте перевірки щоб ходити можна було лише послідовно по сусідніх колах.
2. Додайте перевірку чи достигнуто фінішу.
3. Додайте кнопку з можливістю почати проходження лабіринту знову.
Варіанти рішень публікуйте у коментарях до ціього поста.
Що далі?
Далі проходимо на етап тестування та перевірки роботи програми. Чудовою практикою є обмін програмами між учнями. І під час тестування бажано записати демонстраційне відео та надіслати мені. Я буду додавати ці демонстраційні відео до окремої сторінки.