Проєкт "Крок за кроком" (написання програмного коду)

Nata
1

 


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


Написання програмного коду (на 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. Додайте кнопку з можливістю почати проходження лабіринту знову.

Варіанти рішень публікуйте у коментарях до ціього поста.


Що далі?

Далі проходимо на етап тестування та перевірки роботи програми. Чудовою практикою є обмін програмами між учнями. І під час тестування бажано записати демонстраційне відео та надіслати мені. Я буду додавати ці демонстраційні відео до окремої сторінки.




Дописати коментар

1Коментарі
* Please Don't Spam Here. All the Comments are Reviewed by Admin.
  1. Код на 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.

    ВідповістиВидалити
Дописати коментар

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Learn More
Accept !