Podczas tej lekcji napiszemy program, którego działanie będzie analogiczne do niezwykle popularnej gry Lotto. Dzięki temu zastosujemy poznane wcześniej pętle i konstrukcje w jednym programie, a także poznamy działanie „zapętlonej” pętli For. Jest to niezwykle istotna umiejętność, która pozwala wykonać naprawdę złożone programy w VBA. Zapraszamy do gry!
Z lekcji dowiesz się:
Jak napisać program do gry Lotto?
Na czym polega działanie „zapętlonej” pętli FOR?
Jak w „grze” wykorzystać poznane pętle i konstrukcje!
Z lekcji dowiesz się:
Jak napisać program do gry Lotto?
Na czym polega działanie „zapętlonej” pętli FOR?
Jak w „grze” wykorzystać poznane pętle i konstrukcje!
Instrukcja do zadania:
1) Użytkownik podaje 6 liczb od 1 do 49. Liczby nie mogą się powtarzać. Powinny one zostać
wpisane w pola A1-A6.
2) Sprawdzamy czy żadna liczba się nie powtarza.
3) „Losujemy” 6 liczb z przedziału [1:49] i porównujemy je z liczbami użytkownika.
4) Jeśli liczba użytkownika zgadza się z wylosowaną liczbą to zamalowujemy liczbę użytkownika
na zielono. W przeciwnym przypadku malujemy ją na czerwono.
5) Po skończonym losowaniu powinien pojawić się komunikat informujący o:
a. Wylosowanych liczbach.
b. Ilości trafionych liczb przez użytkownika.
c. Stopniu wygranej (6 trafionych to wygrana I stopnia, 5 trafionych to II stopnia itd.).
Minimalna ilość trafionych liczb aby wypłacić nagrodę to 3.
W pierwszym kroku napiszemy kod, który umożliwi nam sprawdzenie czy podane przez użytkownika liczby się nie powtarzają. W tym celu zastosujemy wspomnianą na początku podwójną konstrukcje For.
Dim a As Integer -> tworzymy sztuczną zmienną a, która umożliwi policzenie ewentualnej liczby powtórzeń w zbiorze
a = 0 -> wartość początkową ustawiamy jako 0
For i = 1 To 6
For j = i To 6
Podwójna konstrukcja For działa w następujący sposób:
Wartość i wynosi 1 następnie przechodzimy do „J”, które również wynosi początkowo 1 wykonuje się działanie wewnątrz pętli. Po jego wykonaniu przechodzimy nie do pierwszej pętli for z wartością „I” do drugiej z wartością „J”, przy czym wartość „I” pozostaje cały czas taką samą wartością (1) a zwiększamy jedynie „J”. Wartość i zostanie zwiększona dopiero po przejściu całej drugiej pętli „J”. Czyli przykładowo:
i =1 j=1
i =1 j=2
i =1 j=3
i =1 j=4
i =1 j=5
i =1 j=6
i =2 j=1
i =2 j=2
i =2 j=3
.
.
.
.
.
I =6 j=6
Dodatkowo wartość początkowa “J” jest równa wartości początkowej „I”, dzięki czemu unikamy sprawdzania liczby przez samą siebie.
If Cells(1, i).Value = Cells(1, j + 1).Value Then -> klasyczna konstrukcja warunkowa, sprawdzenie czy liczba w zbiorze się powtarza, jeśli tak zwiększamy wartość a o jednostkę.
a = a + 1
End If
Next
Next
If a > 0 Then
MsgBox ("Liczba sie powtarza") -> jeżeli liczba powtórzyła się minimum 1 raz to wyświetl komunikat o powtórzeniu.
End If
W kolejnym kroku, wylosujemy 6 liczba z przedziału 1-49.
For liczba = 1 To 6 - > pętla for która umożliwia wylosowanie 6 kolejnych liczb
liczba_losowa = Int((49 - 1 + 1) * Rnd + 1) -> formuła służąca do losowania liczb z wybranego przedziału, jej konstrukcja to :
INT((górny_przedział – dolny_przedział + 1) * Rnd + dolny_przedział)
Cells(2, liczba).Value = liczba_losowa -> wpisywanie kolejnych liczb do kolejnych komórek
Next
Dim trafiony As Integer ->utworzenie sztucznej zmiennej trafiony, która zliczy trafione liczby.
For x = 1 To 6
For y = 1 To 6
Ponowne zastosowane podwójnej konstrukcji for, działa ona antologicznie jak w pierwszym przypadku.
If Cells(1, x).Value = Cells(2, y).Value Then -> instrukcja warunkowa porównująca ze sobą kolejne liczby (wytypowane przez użytkownika i wylosowane przez program)
Cells(1, x).Interior.ColorIndex = 10 -> w przypadku trafienia danej liczby pokoloruj komórkę na zielone.
trafiony = trafiony + 1 -> zliczamy ilość poprawnych typowań
Exit For
Else
Cells(1, x).Interior.ColorIndex = 3 -> w przypadku braku trafienia danej liczby pokoloruj komórkę na czerwono
End If
Next
Next
Cells(3, 1).Value = trafiony -> wpisz w komórkę A3 liczbę trafień
Select Case Cells(3, 1).Value -> na podstawie liczby trafień przy użyciu konstrukcji Salect Case wyświetl odpowiedni komunikat.
Case "0"
Range("C4").Value = "Brak wygranej" -> w odniesieniu do liczby trafień w komórce C4 pojawi się stosowny komunikat.
Case "1"
Range("C4").Value = "Brak wygranej"
Case "2"
Range("C4").Value = "Brak wygranej"
Case "3"
Range("C4").Value = "Wygrana 4 stopnia"
Case "4"
Range("C4").Value = "Wygrana 3 stopnia"
Case "5"
Range("C4").Value = "Wygrana 2 stopnia"
Case "6"
Range("C4").Value = "Wygrana 1 stopnia"
End Select
End Sub
© Sprytny Excel