Programovanie makier v LibreOffice: Funkcia Rnd (2) – vlastná tipovacia hra LOTO

LibreOffice Pokračujeme v práci s funkciou Rnd. Čaká nás lotéria v podaní funkcie Rnd. Vytvoríme si vlastnú tipovaciu súťaž LOTO na základe reálnej predlohy.  

Vlastné LOTO

Každý by mal poznať lotériu s názvom LOTO. Pre zopakovanie, máme uhádnuť 6 čísel. Ako bonus máme ešte jedno dodatkové číslo, Pre dôveryhodnosť, zoberieme si niektoré informácie z tejto stránky, aby to bolo aspoň trošku uveriteľné. Interval hádaných čísel je od 1 do 49. Okrem náhodných čísel potrebujeme pole pre tip čísel od užívateľa a taktiež polia pre vylosované čísla. Rovnako urobíme prvý ťah a druhý ťah. Bude to dosť dobrá fuška niečo také vytvoriť, ale my sa výziev nebojíme

1. príklad: Vlastná hra LOTO

Sub LOTO   REM začiatok procedúry 
        Dim tipPole(1 To 6) As Integer    REM deklarácie premenných 
        Dim lotoPole1(1 To 6) As Integer
        Dim lotoDodatkoveCislo1 As Integer
        Dim lotoPole2(1 To 6) As Integer
        Dim lotoDodatkoveCislo2 As Integer
        Dim vstup As String

        For i = 1 To 6  REM užívateľ zadal svoj tip 
                vstup = InputBox("Zadajte váš " & i & " tip!")
                If IsNull(vstup) Then
                        MsgBox "Nič si nezadal!"
                        Exit Sub        
                End If
                If Len(Trim(vstup)) = 0 Then
                        MsgBox "Nič si nezadal!"
                        Exit Sub        
                End If  
                If  Int(Trim(vstup)) <= 0 Then
                        MsgBox "Zadal si mimo interval lotérie!"
                        Exit Sub        
                End If
                If  Int(Trim(vstup)) >= 50 Then
                        MsgBox "Zadal si mimo interval lotérie!"
                        Exit Sub        
                End If  
                tipPole(i) = Int(vstup)
        Next
        
        For i = 1 To 6   REM testujeme či užívateľ nezadal rovnaké čísla 
                For j = 1 To 6
                        If tipPole(i) = tipPole(j) Then
                                If i <> j Then
                                        MsgBox "Tipy majú byť rozdielné!"
                                        Exit Sub                        
                                End If          
                        End If
                Next
        Next
        
        
        vstup = ""

        Dim boolPremenna As Boolean
        Dim pocitadlo As Integer 
        boolPremenna = True
        Do
                pocitadlo = 0
                For i = 1 To 6   REM prvý ťah
                        lotoPole1(i) = Int((49-1)*Rnd+1)        
                Next
                
                For i = 1 To 6   REM testujeme či sú čísla rozdielne 
                        For j = 1 To 6
                                If lotoPole1(i) = lotoPole1(j) Then
                                        If i <> j Then
                                                pocitadlo = pocitadlo + 1                       
                                        End If          
                                End If
                        Next
                Next
                
                If pocitadlo = 0 Then
                        boolPremenna = False
                End If  
        Loop While boolPremenna = True 
        
        boolPremenna = True
        
        Do
                pocitadlo = 0
                For i = 1 To 6   REM druhý ťah
                        lotoPole2(i) = Int((49-1)*Rnd+1)        
                Next
                
                For i = 1 To 6   REM testujeme či sú čísla rozdielne 
                        For j = 1 To 6
                                If lotoPole2(i) = lotoPole2(j) Then
                                        If i <> j Then
                                                pocitadlo = pocitadlo + 1                       
                                        End If          
                                End If
                        Next
                Next
                
                If pocitadlo = 0 Then
                        boolPremenna = False
                End If  
        Loop While boolPremenna = True 
        
        boolPremenna = True
        
        Do
                pocitadlo = 0
                lotoDodatkoveCislo1 = Int((49-1)*Rnd+1) REM prvy ťah dodatkového čísla 
                
                For i = 1 To 6   REM testujeme či sú čísla rozdielne 
                        If lotoPole1(i) = lotoDodatkoveCislo1 Then
                                pocitadlo = pocitadlo + 1                       
                        End If          
                Next
                
                If pocitadlo = 0 Then
                        boolPremenna = False
                End If  
        Loop While boolPremenna = True 

        boolPremenna = True     
        
        Do
                pocitadlo = 0
                lotoDodatkoveCislo2 = Int((49-1)*Rnd+1) REM druhý ťah dodatkového čísla 
                
                For i = 1 To 6   REM testujeme či sú čísla rozdielne 
                        If lotoPole2(i) = lotoDodatkoveCislo2 Then
                                pocitadlo = pocitadlo + 1                       
                        End If          
                Next
                
                If pocitadlo = 0 Then
                        boolPremenna = False
                End If  
        Loop While boolPremenna = True 

        Dim pocitadlo1 As Integer       
        pocitadlo1 = 0
        
        For i = 1 To 6      REM konečne sme sa dostali k vyhodnocovaniu 
                For j = 1 To 6
                        If tipPole(i) = lotoPole1(j) Then
                                pocitadlo1 = pocitadlo1 + 1
                        End If
                Next
        Next
        
        Dim pocitadlo2 As Integer
        pocitadlo2 = 0
        
        For i = 1 To 6       
                For j = 1 To 6
                        If tipPole(i) = lotoPole2(j) Then
                                pocitadlo2 = pocitadlo2 + 1
                        End If
                Next
        Next
        
        
        Dim pocitadloDod1 As Integer
        pocitadloDod1 = 0

        For i = 1 To 6   
                If tipPole(i) = lotoDodatkoveCislo1 Then
                        pocitadloDod1 = pocitadloDod1 + 1                       
                End If          
        Next
        
        Dim pocitadloDod2 As Integer
        pocitadloDod2 = 0
        
        For i = 1 To 6   
                If tipPole(i) = lotoDodatkoveCislo2 Then
                        pocitadloDod2 = pocitadloDod2 + 1                       
                End If          
        Next
        
        
        Dim retazec1 As String
        retazec1 = "p"
        
        If pocitadlo1 = 6 Then 
                If pocitadloDod1 = 0 Then
                        retazec1 = "500 000 €"
                End If
        End If
        
        If pocitadlo1 = 6 Then 
                If pocitadloDod1 = 1 Then
                        retazec1 = "500 000 €"
                End If
        End If
        
        If pocitadlo1 = 5 Then
                If pocitadloDod1 = 1 Then
                        retazec1 = "10 000 €"
                End If
        End If
        
        If pocitadlo1 = 5 Then
                If pocitadloDod1 = 0 Then                
                        retazec1 = "2770,60 €"
                End If
        End If
        
        If pocitadlo1 = 4 Then
                If pocitadloDod1 = 0 Then
                        retazec1 = "29,10 €"
                End If
        End If
                
        If pocitadlo1 = 4 Then
                If pocitadloDod1 = 1 Then
                        retazec1 = "29,10 €"
                End If
        End If
        
        If pocitadlo1 = 3 Then
                If pocitadloDod1 = 1 Then 
                        retazec1 = "17,60 €"
                End If
        End If
        
        If pocitadlo1 = 2 Then
                If pocitadloDod1 = 1 Then  
                        retazec1 = "5,50 €"
                End If
        End If
        
        If pocitadlo1 = 3 Then
                If pocitadloDod1 = 0 Then
                        retazec1 = "4,40 €"
                End If
        End If
        
        If pocitadlo1 = 2 Then
                If pocitadloDod1 = 0 Then
                        retazec1 = "0 €"
                End If
        End If
        
        If pocitadlo1 = 1 Then
                If pocitadloDod1 = 1 Then
                        retazec1 = "0 €"
                End If
        End If
        
        If pocitadlo1 = 1 Then
                If pocitadloDod1 = 0 Then
                        retazec1 = "0 €"
                End If
        End If

        If pocitadlo1 = 0 Then
                If pocitadloDod1 = 1 Then
                        retazec1 = "0 €"
                End If
        End If
        
        If pocitadlo1 = 0 Then
                If pocitadloDod1 = 0 Then
                        retazec1 = "0 €"
                End If
        End If

        Dim retazec2 As String
        retazec2 = "k"
        
        If pocitadlo2 = 6 Then
                If pocitadloDod2 = 0 Then
                        retazec2 = "500 000 €"
                End If
        End If
        
        If pocitadlo2 = 6 Then
                If pocitadloDod2 = 1 Then
                        retazec2 = "500 000 €"
                End If
        End If
        
        If pocitadlo2 = 5 Then
                 If pocitadloDod2 = 1 Then
                        retazec2 = "5 000 €"
                End If
        End If
        
        If pocitadlo2 = 5 Then 
                If pocitadloDod2 = 0 Then
                        retazec2 = "250 €"
                End If
        End If
        
        If pocitadlo2 = 4 Then 
                If pocitadloDod2 = 0 Then       
                        retazec2 = "25 €"
                End If
        End If
                
        If pocitadlo2 = 4 Then 
                If pocitadloDod2 = 1 Then       
                        retazec2 = "25 €"
                End If
        End If  
        
        If pocitadlo2 = 3 Then
                If pocitadloDod2 = 1 Then 
                        retazec2 = "10 €"
                End If
        End If
        
        If pocitadlo2 = 2 Then
                If pocitadloDod2 = 1 Then  
                        retazec2 = "5 €"
                End If
        End If
        
        If pocitadlo2 = 3 Then 
                If pocitadloDod2 = 0 Then
                        retazec2 = "3 €"
                End If
        End If
        
        If pocitadlo2 = 2 Then
                If pocitadloDod2 = 0 Then
                        retazec2 = "0 €"
                End If
        End If
        
        If pocitadlo2 = 1 Then
                If pocitadloDod2 = 1 Then
                        retazec2 = "0 €"
                End If
        End If
        
        If pocitadlo2 = 1 Then
                If pocitadloDod2 = 0 Then
                        retazec2 = "0 €"
                End If
        End If

        If pocitadlo2 = 0 Then
                If pocitadloDod2 = 1 Then
                        retazec2 = "0 €"
                End If
        End If
        
        If pocitadlo2 = 0 Then
                If pocitadloDod2 = 0 Then
                        retazec2 = "0 €"
                End If
        End If
        
        REM a nakoniec vyvrcholenie programu
        
        MsgBox "Deň žrebovania: 27.08.2017" & Chr(10) & "Váš tip: " & tipPole(1) & " " & tipPole(2) & " " & tipPole(3) & " " & tipPole(4) & " " & tipPole(5) & " " & tipPole(6) & " " & Chr(10) & "1. ťah: " & lotoPole1(1) & " " & lotoPole1(2) & " " & lotoPole1(3) & " " & lotoPole1(4) & " " & lotoPole1(5) & " " & lotoPole1(6) & Chr(10) & "A dodatkové číslo k 1. ťahu: " & lotoDodatkoveCislo1 & Chr(10) & "2. ťah: " & lotoPole2(1) & " " & lotoPole2(2) & " " & lotoPole2(3) & " " & lotoPole2(4) & " " & lotoPole2(5) & " " & lotoPole2(6) & Chr(10) & "A dodatkové číslo k 2. ťahu: " & lotoDodatkoveCislo2 & Chr(10) & Chr(10) & "V 1. ťahu ste uhadli " & pocitadlo1 & " čísla a " & pocitadloDod1 & " dodatkových čísel a vyhrávate " & retazec1 & "!" & Chr(10) & "V 2. ťahu ste uhadli " & pocitadlo2 & " čísla a " & pocitadloDod2 &  " dodatkových čísel a vyhrávate " & retazec2 & "!"

End Sub   REM koniec procedúry

1.tip od užívateľa 1.tip od užívateľa

2.tip od užívateľa a tak to pokračuje ďalej 2.tip od užívateľa a tak to pokračuje ďalej

Výsledok činností makra Výsledok činností makra

Rozbor makra:

Nezľaknite sa, že makro je dlhé. Pritom na jeho zvládnutie postačí ovládať dobre polia a vnorené cykly. Keď pri tomto programe sa nenaučíte základy programovania makier, tak asi už nikdy :).

Takže, vytvorili sme si program, ktorý nám manažuje tipovaciu hru LOTO. Mojím cieľom nebolo propagovať hazardné hry, bože chráň :), ale precvičiť funkciu Rnd a zároveň aj programátorskú zručnosť. Tipovacie hry sú stelesnením náhody a matematickej štatistiky, čiže uplatnenie funkcie Rnd je tam viac než vhodné. Samotný program môže mať chybičky, ale základná kostra tipovacej súťaže LOTO by mala fungovať.

Nabudúce si dokončíme príklady s Rnd a sľubujem, už nebudú také dlhé.



(Jako ve škole) Průměr: 1.00 | Hodnotilo: 3
 

Komentáře

user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Funkcia Rnd (2) – vlastná tipovacia hra LOTO
31. 08. 2017, 09:10:56
Celkem zajímavý příspěvek. To je správně - příklady mají být motivační a pro kombinatoriku je hazard typickou aplikací snad už od starověku. Relativně moderní kombinatorika byla postupně definována od 16-19 století kdy dostaly například název kombinace a tím také celá disciplína.

Píšu to proto, že kombinatoriku mám už 40 let jako koníčka. nejsem doma a tak jsem si to nemohl spustit jako kód, ale komentoval bych hned několik věcných nedostatků.

- Zadávání čísel postačuje jedinou podmínkou ve Val(InputBox())
-------------------
Cyklus začátek
Endes:
IF císlo > 0 AND cislo < 50 Then
..zápis jako proměnné číslo X
Else
GoTo Endes
End If
Cyklus konec
-------------------
To znamená že v případě chyby se provede skok tak aby se volba opakovala bez inkrementace. (Může tam být dotaz zda uživatel nechce proces ukončit). Prémiové číslo může být vyhodnoceno například jako poslední 7. tipované číslo ap.


- Shodnost čísel se testuje cyklem pro dvojice (kombinace dvojic) :
-------------------
For i = 1 To 5
For j = i+1 To 6
...porovnání + případný návrat
Next j
Next i
-------------------
Protože Váš cyklus vyhodnocuje variace s opakováním tak nutně musí dojít k porovnávání stejných čísel - měla by vzniknout chyba. V případě variací s opakováním je to chyba na každém čísle.
-------------------
For i = 1 To 6
For j = 1 To 6
...porovnání
next j
Next i
-------------------
- Vyhodnocení tahu by mělo být v jiném makru nežli zadání čísel a jejich následné vyhodnocení podle tahu - je to asynchronní časová následnost.
user avatar Eduard Boldižár
Odpovědět
Re:Programovanie makier v LibreOffice: Funkcia Rnd (2) – vlastná tipovacia hra LOTO
31. 08. 2017, 11:20:31
Áno, uznavám že algoritmus ktorým generujem náhodné čísla pre LOTO, nie je najlepší ani zďaleka. Pretože viac krát bude musieť vygenerovať čísla, aby neboli rozdielne. Našťastie, procesory sú dnes tak výkonné, že prodlevu 1-2 sekundy spracovania celého programu nie je nič tragické :) Vďaka za názor
user avatar Eduard Boldižár
Odpovědět
Re:Re:Programovanie makier v LibreOffice: Funkcia Rnd (2) – vlastná tipovacia hra LOTO
31. 08. 2017, 11:22:14
Jaj som sa pomýlil :) edit minulého komentára: Pretože viac krát bude musieť vygenerovať čísla, aby neboli rovnaké.
user avatar neutr
Odpovědět
Re:Re:Re:Programovanie makier v LibreOffice: Funkcia Rnd (2) – vlastná tipovacia hra LOTO
31. 08. 2017, 18:05:12
Už jsem doma a mohl bych to otestovat a opravit. Mám podobných věcí opravdu hodně. V celku to není špatně jen tam schází právě ošetření případů kdy vznikne nějaká chyba.

Pro běžného uživatele dodám, že generátory náhodných čísel je celá věda a dost se o tom mlčí - tedy o principu generátoru. Těch principů je více a jsou různě "dobré". Mlčí se o tom podobně jako o šifrách protože generátory náhodných nebo pseudonáhodných čísel se používají například pro číslování losů a podobně. Tedy všude kde má být zaručena náhoda. Ve skutečnosti je za vším algoritmus a jeho postup se musí tajit aby nešlo získat výhodu (například šifrovací klíč).

Ale i generátory náhodných a pseudonáhodných čísel je kombinatorika. Takže si troufám tvrdit že o těch záležitostech vím dost - více nežli běžný programátor. Eda dělá dobrou práci a i když já vidím nedostatky, tak musím ocenit celý obsah. Účelu výuky to slouží dobře i s těmi chybičkami.
user avatar Eduard Boldižár
Odpovědět
Re:Re:Re:Re:Programovanie makier v LibreOffice: Funkcia Rnd (2) – vlastná tipovacia hra LOTO
31. 08. 2017, 23:43:10
Vďaka za podporu. Mám v pláne sa ešte k programu vrátiť, ale nie v budúcom článku ale po ňom. Chcem vysvetliť jeden triediaci algoritmus a tento príklad je skvelý, kde ho môžem demonštrovať. Program už upravím tak, aby stále negeneroval nové čísla pri chybe, ale rovno kontroloval či nie je chyba pri vytvorení náhodného čísla. Samozrejme rád prijmem rady a postrehy ako to vylepšiť ;)

Odpovědět

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
 
 
woo jaw demo hz