Kiedy losujemy liczbę i liczba może się powtórzyć wtedy taka inicjacja jest prosta do przedstawienia:
1 2 3 |
Dim LiczbaLosowana As new Random Dim ZmiennaLosowa As Integer ZmiennaLosowa = LiczbaLosowana .Next(1,100) |
Taki zapis pozwoli nam pod zmienną „ZmiennaLosowa” podstawić losową liczbę z przedziału od 1 do 100. Niestety po pewnym czasie korzystania z tego zapisu zauważycie, że jeśli potrzebowaliśmy losowania kilku liczb z jakiegoś małego przedziału, jest duże prawdopodobieństwo, że nasze liczby się powtórzą. Zrobimy dzisiaj program który pokaże wam jak wylosować 6 liczb z 49 czyli tak jak w lotku. Może się to komuś przyda do opracowywania strategi gry w tę grę. Zaczynamy od nowego projektu i rozkładamy 7x textbox, 1x button, 1x listbox, 6x label, tak jak na obrazku:
Program nasz będzie losował 6 liczb z 49. Sami będziemy mogli określić jak duża puli liczb ma być i ile tych liczb ma być typowane. Aby liczby nie powtarzały się stworzymy sobie tablice typu „boolean” i wypełnimy ją sobie od 0 do 49 i wypełnimy ją sobie „false”. Co to nam daje. Otóż gdy padnie liczba na określonym numerze tablicy np:3 a jego wartość będzie wynosiła „true” wtedy nie będzie ona dodawana do puli wylosowanych liczb i program będzie liczył dotąd aż wylosuje niepowtarzające się liczby.
Jeśli przyjmiemy, że nasza losowana liczba to będzie „i” nasza tablica będzie wyglądała następująco
tablica(1)=false
tablica(2)=false
tablica(3)=false
(…)
tablica(49)=false
Teraz podczas inicjowania naszego programu losujemy liczbę z przedziału od 1-49 i wylosowaliśmy liczbę „2”. Cyfrę tą wrzucamy do puli liczb wylosowanych a nasza tablica przyjmuje wartości:
tablica(1)=false
tablica(2)=true
tablica(3)=false
(…)
tablica(49)=false
Teraz gdy nasze „i” przyjmie ponownie wartość „2”. Cyfra ta nie zostanie ponownie przyjęta do puli ponieważ w tablicy będzie oznaczona jako „true” i zostanie pominięta.
Program robiony był prze zemnie w Sharpie. Najpierw inicjujemy komponenty:
1 2 3 4 5 6 7 |
Public Partial Class MainForm Dim max As Integer =49 'okresla ilosc cyfr w losowaniu Dim randomNum As new Random Dim LiczbaKontrolna As Integer Dim losowania As Integer = 6 ' okresla ilosc losowanych liczb (...) |
Teraz tworzymy uchwyt dla naszego przycisku. Program trafione liczby będzie zaznaczał poprzez zmianę koloru textboxa na czerwono dla tego najpierw wyczyścimy sobie kolor naszych textboxów kodem:
1 2 3 4 5 6 7 8 9 10 |
Sub Button2Click(sender As Object, e As EventArgs) 'dodatkowo textBox2.BackColor = Nothing textBox3.BackColor = Nothing textBox4.BackColor = Nothing textBox5.BackColor = Nothing textBox6.BackColor = Nothing textBox7.BackColor = Nothing (...) |
Teraz zainicjujemy sobie tablice. Jedną do przechowywania trafionych liczb drugą do przechowywania naszych liczb i trzecią typu „boolean” kontrolną przechowującą „true” i „false”
1 2 3 4 5 |
(...) Dim wylosowaneLiczby As New List(Of Integer) Dim mojeLiczby As new List(Of Integer) Dim wylosowane As new List(Of Boolean) (...) |
Teraz wypełniamy sobie naszą tablicę „wylosowane” zmienną „false” od 0 do „max” i zerujemy nasz textbox który wyświetlać nam będzie wylosowane liczby (podczas ponownego losowania aby liczby z poprzedniego losowania nie były dodawane.) i zerujemy listbox który będzie pokazywał nam które liczby dostały wartość „true”
1 2 3 4 5 6 7 8 9 |
(...) For i As Integer = 0 To max wylosowane.Add(False) Next 'czyści listboxa listBox1.Items.Clear() 'zeruje losowanie textBox1.Text = "" (...) |
Teraz przechodzimy do głównej pętli która będzie losowała nasze liczby, wygląda on tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(...) 'rozpoczyna losowanie Dim start As Integer = 0 Do While start <= losowania-1 LiczbaKontrolna = randomNum.Next(1,max) If wylosowane(LiczbaKontrolna)=False Then wylosowane(LiczbaKontrolna)=true textBox1.Text += LiczbaKontrolna.tostring + "," 'dodatkowo wylosowaneLiczby.Add(LiczbaKontrolna) start+=1 End If Loop (...) |
Warto sobie tą pętle przeanalizować. Teraz musimy dodać tylko:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'pętla wypełni listbox trafieniami For Each element In wylosowane listBox1.Items.Add(element) Next 'pętla koloruje trafione liczby na czerwono For each elements In wylosowaneLiczby If textBox2.Text = elements.ToString Then textBox2.BackColor=Color.Red Else If textBox3.Text = elements.ToString Then textBox3.BackColor=Color.Red Else If textBox4.Text = elements.ToString Then textBox4.BackColor=Color.Red Else If textBox5.Text = elements.ToString Then textBox5.BackColor=Color.Red Else If textBox6.Text = elements.ToString Then textBox6.BackColor=Color.Red Else If textBox7.Text = elements.ToString Then textBox7.BackColor=Color.Red End If next |
Jeśli wszystko zrobiliście dobrze powinno to wyglądać jak na filmie:
pełen kod można pobrać tutaj: loser_lotto