Нарешті ми дійшли до етапу, після якого наша програма буде працювати і користувач зможе пройти лабіринт.
Написання програмного коду (на Visual Basic)
1. Відкрийте проєкт StepByStep.
2. Відкрийте код проекту.
3. В програмі нам потрібно буде перевіряти який зараз крок. Для цього потрібна змінна. У програмному коді знайдіть рядок, де починається конструктор форми:
Public Class Form1
та одразу після цього рядка напишіть команду оголошення змінної:
Dim intCurrentStep As Integer = 1
У цьому рядку ми оголошуємо змінну та одразу задаємо їй початкове значення 1, тобто буде перший крок по лабіринту.
4. При натисканні кнопкою миші на будь-який елемент Label (це подія Click), якщо хід можливий, то цей елемент повинен змінити свій колір, а змінна intCurrentStep повинна збільшити своє значення на 1, тобто буде наступний крок.
Як первірити чи можливій хід? Дуже просто - перевірити чи дорівнює значення всередині кола значенню intCurrentStep. Для цього можна записати таку умову:
If CInt(Label1.Text) = intCurrentStep Then
intCurrentStep = intCurrentStep + 1
End If
Але тут ми вказуєто на елемент Label1, а у нас таких елементів багато. Щоб не писати для всіх елементів Label окрему умову, ми скористаємося об'єктом sender. Sender передається як параметр до процедури Label1_Click і вказує на якому елементі ми клацнули.
Змінивши код отримуємо такий код обробки події Click:
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click, Label3.Click, Label2.Click, Label9.Click, Label8.Click, Label7.Click, Label6.Click, Label5.Click, Label4.Click, Label25.Click, Label24.Click, Label23.Click, Label22.Click, Label21.Click, Label20.Click, Label19.Click, Label18.Click, Label17.Click, Label16.Click, Label15.Click, Label14.Click, Label13.Click, Label12.Click, Label11.Click, Label10.Click
Dim elem As Label = sender
If CInt(elem.Text) = intCurrentStep Then
intCurrentStep = intCurrentStep + 1
elem.Tag = 1
elem.Refresh()
End If
End Sub
У цьому коді є деякі важливі моменти:
1) Ми не можемо просто написати sender.Text. sender - це може бути будь-який елемент, не обов'язково той, де є властивість Text. Спочатку необхідно вказати що ми вважаємо sender є елементом Label. Для цього ми записали перший рядок:
Dim elem As Label = sender
Далі ми будемо звертатися до об'єкту sender через змінну elem.
2) Властивість elem.Text є рядком. Щоб порівняти це значення з числом intCurrentStep, ми використовуємо функцію CInt.
3) У коді ми задіяли властивість Tag. Цієї сластивості можна присвоїти будь-яке значення. Тут просто домовимось, що 1 буде означати, що ми клацнули по цьому колу і його потрібно замалювати.
4) Метод elem.Refresh() дозволяє визвати подію Paint щоб оновити зображення.
5. Виділіть на формі всі інші елементи Label, у вікні Properties знайдіть подію Click, натисніть на стрілку праворуч, та оберіть обробник події Label1_Click.
6. Якщо ви зараз запустите програму на виконання, то нічого не буде працювати, тому що ми не змінили обробник події Paint так, щоб елемент змінював колір при значенні elem.Tag = 1.
Отже, знайдіть обробник події Paint і змініть код наступним чином:
Private Sub Label1_Paint(sender As Object, e As PaintEventArgs) Handles Label1.Paint, Label9.Paint, Label8.Paint, Label7.Paint, Label6.Paint, Label5.Paint, Label4.Paint, Label3.Paint, Label25.Paint, Label24.Paint, Label23.Paint, Label22.Paint, Label21.Paint, Label20.Paint, Label2.Paint, Label19.Paint, Label18.Paint, Label17.Paint, Label16.Paint, Label15.Paint, Label14.Paint, Label13.Paint, Label12.Paint, Label11.Paint, Label10.Paint
Dim elem As Label = sender
If elem.Tag = 1 Then
Dim semiTransBrush As New SolidBrush(Color.FromArgb(128, 0, 0, 255))
e.Graphics.FillEllipse(semiTransBrush, 0, 0, 50, 50)
Else
e.Graphics.DrawEllipse(Pens.Red, 0, 0, 49, 49)
End If
End Sub
8. Запустіть програму на виконання, перевірте роботу програми. При натисканні на кола, вони повинні змінювати свій колір:
Недоліки програми
Зараз програма працює так, що після цифри 3 можна натиснути будь-яке коло з цифрою 4. Бачите зліва там є ще одна цифра 4? Так само з іншими цифрами. Тобто в програму потрібно додати умови щоб цього не можна було зробити. Ще в програмі не вистачає перевірки чи ми дійшли до фінішу. Ці завдання зробіть самостійно.
Додаткові завдання
1. Додайте перевірки щоб ходити можна було лише послідовно по сусідніх колах.
2. Додайте перевірку чи достигнуто фінішу.
3. Додайте кнопку з можливістю почати проходження лабіринту знову.
Варіанти рішень публікуйте у коментарях до ціього поста.
Що далі?
Далі проходимо на етап тестування та перевірки роботи програми. Чудовою практикою є обмін програмами між учнями. І під час тестування бажано записати демонстраційне відео та надіслати мені. Я буду додавати ці демонстраційні відео до окремої сторінки.
Код на Visual Basic для рішення завдання 3:
ВідповістиВидалити1 варіант:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim elem As Label
For Each ctl In Me.Controls
If TypeOf ctl Is Label Then
elem = ctl
elem.Tag = 0
End If
Next
Me.Refresh()
intCurrentStep = 1
End Sub
2 варіант:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
For Each ctl In Me.Controls
If TypeOf ctl Is Label Then
CType(ctl, Label).Tag = 0
End If
Next
Me.Refresh()
intCurrentStep = 1
End Sub
Різниця у коді лише у зверненні до властивості Tag елемента Label. У першому варіанті використовується змінна для посилання на елемент Label. В другому варінті застосовується вираз CType(ctl, Label) для формування посилання на елемент Label.