[UPDATE][VB 2010] Pytanie o funkcje RND, nalicznie punktów i inne


(12Bernard12) #1

Witajcie.

Założyłem nowy wątek w którym będę zadawał kilka pytań dotyczących języka Visual Basic pisanego w Microsoft Visual Basic 2010 Express. Posiadam Win 7 Professional.

Chciałem zrobić grę/aplikacje w której po przyciśnięciu przycisku "start" będą losować się pytania (form5-form8), po poprawnej odpowiedzi będą losować się dalej, ale bez poprzednich. Po każdej poprawnej odpowiedzi miałyby dodawać się punkty, które na końcu gry będą się sumować, a w oddzielnej zakładce będzie pokazywać się 10 najlepszych wyników. Tych dwóch ostatnich opcji w ogóle nie ogarnąłem, a pierwsza opcja (losowanie) nie działa poprawnie - pytania nie pojawiają się, ale menu główne znika (tak jak zaprogramowałem) Niestety dzisiaj dostępu do kodu nie mam i raczej mieć nie będę, ale.jutro na pewno wyślę.

Podsumowując:

  1. Jutro wyślę kod i prosiłbym o poprawienie mojego błędu w losowaniu pytań.

  2. Prośba o napisanie kodu/szablonu lub innej podpowiedzi do naliczanie punktów po poprawnej odpowiedzi (zazwyczaj kliknięcie przycisku TAK/NIE) i do zapamiętywania a potem wyświetlania najlepszych 5 wyników w historii.

  3. No jeszcze jakiś łatwy kurs dla żółtych (bo ja za słaby żeby być zielony :wink:). Na necie znlazłem kilka, ale nie ogarniam tego trochę.

No to już wrzucam kod. Jest on cały dla kliknięcia przycisku "start" - dokładnie od momentu losowania.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim adu As String
        adu = Rnd(5, 8)
        Select Case adu
 
            Case 1
                Form5.Show()
            Case 2
                Form6.Show()
            Case 3
                Form7.Show()
            Case 4
                Form8.Show()
        End Select
        Me.Hide()
 
    End Sub

Teraz mam inny kod. Losowanie działa dobrze, ale jeszcze co mam zrobić, żeby po poprawnej odpowiedzi losowały się pytania, bez wszystkich wcześniej wylosowanych? Oto mój kod:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim rnd As New Random(Date.Now.Millisecond)
        Dim newform As New Form
        Select Case rnd.Next(0, 4)
            Case 0
                newform = New Form5
            Case 1
                newform = New Form6
            Case 2
                newform = New Form7
            Case 3
                newform = New Form8
        End Select
        newform.Show()
 
        Me.Hide()
 
    End Sub

PS. Odświeżam.


(floyd) #2

Niektórzy mówią, że pytającemu należy dawać wędkę czyli podpowiedź, a nie rybę czyli gotowe rozwiązanie.

Już zadawałeś takie pytania i dałem ci gotowe rozwiązanie. Jak widać z mizernym skutkiem.

http://forum.dobreprogramy.pl/quiz-vbs-nie-dzia%C5%82a-odpowwied%C5%BA-nie-t468145/

Nawet się dziwiłem, że o nic nie pytasz i doszedłem do wniosku, że wszystko jest jasne.

Również inni dali Ci podpowiedź żeby stworzyć tablicę do której wpisuje się wylosowane liczby i sprawdzać czy kolejna wylosowana liczba jest już w tablicy i jeśli tak to ponowić losowanie. Niezbyt to eleganckie rozwiązanie ale przy malej ilości losowań nawet działa.

Ja dałem ci inne rozwiązanie wzorowane na sytuacji z realnej rzeczywistości. A, jak to jest z tymi losowaniami w realu? Weźmy przykład z lotto. Jest w bębnie ileś tam kul, a na każdej kuli napisana liczba. Wylosowuje się jedną  z kul i odczytuje liczbę jaka jest napisana na tej kuli.

Liczba ta może być też np. numerem pytania jak w Twoim przypadku. Kulę wyjmuje się z bębna i przy następnym losowaniu napewno nie wylosuje się już tej samej kuli bo jej już tam niema. Proste i małe dziecko jest to w stanie zrozumieć, a zatem wystarczy tylko wzorować się na tym przykładzie z losowaniem kul w programie.

Najpierw należy stworzyć zestaw kul. Najprościej sobie wyobrazić, że nasze kule to będą znaki jaki np drukujemy czyli a,bc,1 25. "@#$ itd Są też oczywiście też znaki których nie da się wydrukować. każdy znak ma swój kod i jeżeli te znaki są odpowiednikami kul, to kody tych znaków będą odpowiednikami napisów z liczbami na kulach.

znaki tworzymy poleceniem np znak=chr(65) . Zmienna znak będzie wówczas literą “A”, a liczba 65 to kod tego znaku. Mając znak można też odczytać jego kod poleceniem i= asc(“B”). Liczba i będzie liczbą 66 bo taki jest kod znaku litery “B”

No to teraz tworzymy cały zestaw potrzebnych nam znaków. Najwygodniej zrobić to w pętli:

for  i= 1 to 64:zestawznakow=zestawznakow+chr(i) :next

Jeżeli mamy już zestaw kul których odpowiednikami są nasze znaki. to można już przystąpić do losowania funkcją RND

Rożnica w porównaniu z kulami jest taka, że kule latają po bębnie, a znaki nigdzie nie latają tylko są grzecznie ustawione w szeregu jeden za drugim. Wylosowaliśmy np. liczbę 3 i niech liczba ta oznaczą trzeci znak w naszym szeregu znaków. Trzeba teraz sprawdzić co to za znak na trzeciej pozycji na przykład przy pomocy funkcji znak=mid(zestawznakow,3,1). Mając już wylosowany znak odczytujemyjego  kod i=asc(znak). Za pierwszym razem będzie to oczywiście liczba 3, ale w dalszych losowaniach już tak być nie musi. Pozostaje jeszcze wyrzucić wylosowany znak z całego zestawu aby już nie można było go wylosować np. przy pomocy funkcji zestawznakow=replace (zestawznakow, chr(3),""). W naszym zestawie nie będzie już znaku o kodzie 3. Przy następnym losowaniu nawet jeśli wylosujem liczbę 3 to na trzeciej pozycji będzie już znak o kodze 4. Jak nie wierzysz to uluż sobie karteczki z napisami 1,2,3,4,5 i usuń karteczkę z napisem 3, to zobaczysz, że trzeciej pozycji będzie teraz karteczka z napisem 4.

Ponawiamy nasze losowanie, aż do wyczerpania wszystkich znaków i wszystko.

Jeżeli chcesz nie tylko mieć jakiś tam program ale i czegoś nauczyć, to musisz starać się zrozumieć jak on działa  bo inaczej to będziesz dziesiątki razy pytało to samo, no i nic się nie nauczysz.