Lotto-Spiel simulieren

  • Excel

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von tulla.

    Lotto-Spiel simulieren

    Hi,

    ich habe dieses Semester Informatik als Kurs in der Uni und als Hausübung sollen wir ein Lotto-Spiel mit VB simulieren.
    Dazu
    gehört die Ziehung von 6 Zufallszahlen im Bereich 1 bis 49, eine
    Tipp-Abgabe von 6 Zahlen und am Ende alles noch in ein Objektformular
    einbetten.

    Leider verstehe ich nicht soviel davon, bzw. habe noch
    Probleme. Während ich die Zufallszahlen noch hinbekommen habe,
    scheitert es gerade an der Tippabgabe:

    Mit meinem Code werden 6 Zahlen eingefordert, aber in der MsgBox werden nur nullen angezeigt.
    Kann mir hier jemand helfen und mir sagen, wo mein Fehler liegt?

    Code:
    Dim CurrentPosition As Integer
    Dim CurrentTipp(6) As Integer
    Dim Tipp As String
    Dim tmp As Variant


    Sub Tippabgabe()
    'On Error GoTo Fehler
    CurrentPosition = 0
    While CurrentPosition < 6
    CurrentPosition = CurrentPosition + 1
    Tipp = CInt(InputBox("Geben Sie die " & CurrentPosition & " Zahl ein", "Tippabgabe"))
    tmp = CurrentTipp
    If UBound(tmp, 1) < 0 And CurrentTipp(i) < 50 And CurrentTipp(i) > 0 Then
    CurrentTipp(CurrentPosition) = Tipp
    End If
    Wend

    Dim Msg As String
    Msg = "Ihr Tipp lautet: "
    For i = 1 To 6
    Msg = Msg & Format$(CurrentTipp(i)) & " "
    Next i
    MsgBox Msg
    'Fehler: MsgBox "Die Eingabe war unzulässig!", , "Tippabgabe"
    'Resume
    End Sub

    Natürlich!

    Visual Basic-Quellcode

    1. Sub Tippabgabe()
    2. 'On Error GoTo Fehler
    3. CurrentPosition = 0
    4. While CurrentPosition < 6
    5. CurrentPosition = CurrentPosition + 1
    6. Tipp = CInt(InputBox("Geben Sie die " & CurrentPosition & " Zahl ein", "Tippabgabe"))
    7. tmp = CurrentTipp
    8. If UBound(tmp, 1) < 0 And CurrentTipp(i) < 50 And CurrentTipp(i) > 0 Then
    9. CurrentTipp(CurrentPosition) = Tipp
    10. End If
    11. Wend
    12. Dim Msg As String
    13. Msg = "Ihr Tipp lautet: "
    14. For i = 1 To 6
    15. Msg = Msg & Format$(CurrentTipp(i)) & " "
    16. Next i
    17. MsgBox Msg
    18. 'Fehler: MsgBox "Die Eingabe war unzulässig!", , "Tippabgabe"
    19. 'Resume
    20. End Sub
    Jawoll! :)
    Vielen Dank für die schnellen Antworten. Es funktioniert:

    Visual Basic-Quellcode

    1. Sub Tippabgabe()
    2. 'On Error GoTo Fehler
    3. CurrentPosition = 0
    4. While CurrentPosition < 6
    5. CurrentPosition = CurrentPosition + 1
    6. Tipp = CInt(InputBox("Geben Sie die " & CurrentPosition & " Zahl ein", "Tippabgabe"))
    7. tmp = CurrentTipp
    8. i = CurrentPosition
    9. CurrentTipp(CurrentPosition) = Tipp
    10. Wend
    11. Dim Msg As String
    12. Msg = "Ihr Tipp lautet: "
    13. For i = 1 To 6
    14. Msg = Msg & Format$(CurrentTipp(i)) & " "
    15. Next i
    16. MsgBox Msg
    17. 'Fehler: MsgBox "Die Eingabe war unzulässig!", , "Tippabgabe"
    18. 'Resume
    19. End Sub


    Jetzt noch eine Frage: Wie bekomme ich die Tipps in die Felder F2 bis F7?
    Ich weiß zwar, wie mann sich normal die Werte in eine Zelle geben lässt ( Range("F2").Value= Tipp1 ), aber nicht wie es bei einer Schleife funktioniert.
    Ich rate dir dennoch stelle deine VB-Standarteinstellung auf Explecit ON! guck auf youtube wenn du nicht weißt wie das geht...

    Visual Basic-Quellcode

    1. Tipp = CInt(InputBox("Geben Sie die " & CurrentPosition & " Zahl ein", "Tippabgabe"))
    Intger?

    Visual Basic-Quellcode

    1. CurrentTipp(CurrentPosition) = Tipp

    CurrentTipp String?
    Es müsste sein:


    Visual Basic-Quellcode

    1. CurrentTipp(CurrentPosition) = Tipp.ToString




    Also da stimmt doch was nicht...
    Funktioniert ist aber fehleranfällig...
    Wenn du Explecit On hast, wirste darauf hingewiesen.
    Jetzt noch eine Frage: Wie bekomme ich die Tipps in die Felder F2 bis F7?
    Ich weiß zwar, wie mann sich normal die Werte in eine Zelle geben lässt ( Range("F2").Value= Tipp1 ), aber nicht wie es bei einer Schleife funktioniert.

    Du bastelst dir einfach dein String (Name der Zelle) zusammen.

    Visual Basic-Quellcode

    1. For i = 2 To 7
    2. Range("F"&i.toString).Value= Tipp1
    3. Next i

    Wobei jetzt alle Zellen den Wert von Tipp1 bekommen.
    Das must du natürlich auch Variabel machen indem du es mit dem i-Wert der Schleife verbindest.
    @ m3xx :

    Wenn ich das so schreibe, bekomme ich eine Fehlermeldung: Fehler beim Kompilieren - Ungültiger Bezeichner. Leider kann ich mir darunter nichts vorstellen.
    Was bedeutet die Einstellung Explizit ON?


    @ eistee :

    Das klappt leider nicht. Habe es folgendermaßen versucht:

    Visual Basic-Quellcode

    1. For i = 0 To 6
    2. Range("F" & i).Value = Tipp
    3. Next i


    Das hat mir am Ende einen Laufzeitfehler 1004 gegeben.
    Dann noch das hier:

    Visual Basic-Quellcode

    1. A = i + 1
    2. For i = 0 To 6
    3. Range("F" & A).Value = Tipp
    4. Next i

    Hat mir immerhin den letzten Wert in eine Zelle kopiert.

    Ich bin leider auch nur ein blutiger Anfänger in Visual Basic, deswegen verzeiht mir, wenn ich mich ein wenig dumm und ahnungslos gebe. Aber auf dem Gebiet bin ich es (noch).
    Wenn ich das jetzt ausprobiere, dann füllt er mir die Zellen F1 - F6 mit dem Wert meines letzten Tipps.

    Ich will aber F2 - erster Tipp, F3 - zweiter Tipp, usw.
    Weil ich es schon seit heute Mittag nicht hinbekomme, habe ich mir als Notlösung schon einen ausführlicheren Weg abgetippt...
    Vielen Dank Tulla und Neptun! :) :thumbsup:

    Habe mir schon gedacht, dass das mit dem "Tipp" zusammenhängt. Habe es gegen "CurrentTipp(i)" ausgetauscht, aber dann noch mit Range anstatt Cells. Das hat nicht funktioniert.

    So Siehts jetzt aus:

    Visual Basic-Quellcode

    1. Dim CurrentPosition As Integer
    2. Dim CurrentTipp(6) As Integer
    3. Dim Tipp As String
    4. Dim tmp As Variant
    5. Sub Tippabgabe_Kurz()
    6. On Error GoTo Fehler
    7. CurrentPosition = 0
    8. While CurrentPosition < 6
    9. CurrentPosition = CurrentPosition + 1
    10. Tipp = CInt(InputBox("Geben Sie die " & CurrentPosition & " Zahl ein", "Tippabgabe"))
    11. tmp = CurrentTipp
    12. i = CurrentPosition
    13. CurrentTipp(CurrentPosition) = Tipp
    14. Wend
    15. Dim Msg As String
    16. Msg = "Ihr Tipp lautet: "
    17. For i = 1 To 6
    18. Msg = Msg & Format$(CurrentTipp(i)) & " "
    19. Next i
    20. MsgBox Msg
    21. For i = 1 To 6
    22. u = i + 1
    23. Cells(u, 6).Value = CurrentTipp(i)
    24. Next i
    25. Exit Sub
    26. Fehler: MsgBox "Die Eingabe war unzulässig!", , "Tippabgabe"
    27. Resume
    28. End Sub


    Zur Info: Jetzt muss ich noch die Tipps mit den gezogenen Lottozahlen abgleichen und die "Richtigen" markieren. Danach ein Objektformular erstellen. Mal schauen, ob ich es alleine hinbekomme.

    Vielen Dank an Alle, die mir geholfen haben!! Bis jetzt ein super Forum! :)
    @Tulla: Weil ich erst gestern Mittag beigetreten bin.

    Habe jetzt wie befürchtet wieder ein Problem. Und Zwar möchte ich die Lottozahlen mit den Tipps vergleichen und dann die Richtigen in die Spalte daneben schreiben. Am Ende soll noch ermittelt werden, wieviele Richtige getippt wurden. Am angefügten Screenshot könnt ihr das sehen.



    Mit meinem Code funktioniert es nicht. :(
    Ich weiß, dass ich mit zwei Schleifen arbeiten muss, um die Zahlen gegeneinander zu Prüfen. Es geht auch Über die Zählenwenn-Funktion, aber das ist mir nicht gestattet.

    Visual Basic-Quellcode

    1. Sub Tipp_Prüfung_2()
    2. Dim e As Integer, r As Integer, SP1 As Integer, SP2 As Integer
    3. Dim gleich As Boolean
    4. Dim Bereich As Worksheet
    5. While gleich = False
    6. Do
    7. For e = 2 To 7
    8. With Bereich
    9. SP1 = Cells(e, 4).Select
    10. SP2 = Cells(r, 6).Select
    11. End With
    12. For r = 2 To 7
    13. If SP1 = SP2 Then
    14. gleich = True: Exit For
    15. Else
    16. Cells(e, 7).Value = "-"
    17. End If
    18. Next r
    19. Next e
    20. Loop
    21. Cells(e, 7).Value = SP1
    22. Range("G10").Select
    23. ActiveCell.FormulaR1C1 = "=6-COUNTIF(R[-8]C:R[-3]C,""-"")"
    24. Wend
    25. End Sub


    Ich bin für jede Anregung dankbar! Ich möchte das mal durchblicken :wacko:
    Hab das mal nach/umgebaut, wie ich es gelöst hätte vieleicht hilft dir das bei Deiner Fehlerfindung.

    Inhalt der Tabelle1 -> siehe Bild 1

    Was passiert wenn ich auf den Button"Neues Spiel" klicke?


    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. For i = 5 To 15 Step 2
    3. Worksheets("Tabelle1").Cells(8, i).Value = ""
    4. Worksheets("Tabelle1").Cells(11, i).Value = ""
    5. Next i
    6. Worksheets("Tabelle1").Cells(15, 5).Value = ""
    7. UserForm1.Show
    8. End Sub


    So sieht Userform1 aus -> siehe Bild 2 und 3 nach der Eingabe des Tips.

    Was passiert nach dem klick auf den Button "Lottoziehung"?

    Visual Basic-Quellcode

    1. Dim zahl(5) As Variant
    2. Dim tip(5) As Variant
    3. Dim treffer As Integer
    4. Dim position As Integer
    5. Dim nextfeld As Integer
    6. nextfeld = 5
    7. Const anz = 49
    8. Dim i As Integer, fFeld(anz) As Integer, iTemp As Integer, iZ As Integer
    9. position = 5
    10. tip(0) = TextBox1.Text
    11. tip(1) = TextBox2.Text
    12. tip(2) = TextBox3.Text
    13. tip(3) = TextBox4.Text
    14. tip(4) = TextBox5.Text
    15. tip(5) = TextBox6.Text
    16. For richtig = 0 To 5
    17. If tip(richtig) < 1 Or tip(richtig) > 49 Then MsgBox ("Falsche Eingabe, bitte prüfen Sie Ihre Zahl nochmal"): GoTo ausfall
    18. Next richtig
    19. Worksheets("tabelle1").Cells(11, 5).Value = TextBox1.Text
    20. Worksheets("tabelle1").Cells(11, 7).Value = TextBox2.Text
    21. Worksheets("tabelle1").Cells(11, 9).Value = TextBox3.Text
    22. Worksheets("tabelle1").Cells(11, 11).Value = TextBox4.Text
    23. Worksheets("tabelle1").Cells(11, 13).Value = TextBox5.Text
    24. Worksheets("tabelle1").Cells(11, 15).Value = TextBox6.Text
    25. For i = 1 To anz
    26. fFeld(i) = i
    27. Next i
    28. For i = anz To 1 Step -1
    29. Randomize Timer
    30. iZ = Int((i * Rnd) + 1)
    31. iTemp = fFeld(iZ)
    32. fFeld(iZ) = fFeld(i)
    33. fFeld(i) = iTemp
    34. Next i
    35. For i = 1 To 6
    36. Worksheets("tabelle1").Cells(8, nextfeld).Value = fFeld(i)
    37. nextfeld = nextfeld + 2
    38. Next i
    39. treffer = 1
    40. For i = 0 To 5
    41. For x = 0 To 5
    42. If fFeld(i) = tip(x) Then treffer = treffer + 1: Worksheets("tabelle1").Cells(15, 5).Value = treffer
    43. Next x
    44. Next i
    45. End
    46. ausfall:


    Das Ergebnis der Berechnung siehe Bild4
    Bilder
    • Bild1.jpg

      54,63 kB, 671×355, 222 mal angesehen
    • Bild2.jpg

      20,7 kB, 245×173, 1.958 mal angesehen
    • Bild3.jpg

      23,9 kB, 238×173, 1.999 mal angesehen
    • Bild4.jpg

      40,33 kB, 513×255, 191 mal angesehen
    Mich verblüfft, dass der Code so kurz ist. Den Fehler habe ich gefunden, der Code für das Abgleichen der Tipps mit den Lottozahlen sieht nun folgendermaßen aus:

    Visual Basic-Quellcode

    1. For e = 2 To 7
    2. For r = 2 To 7
    3. If Cells(e, "D") = Cells(r, "F") Then
    4. Cells(r, "G") = Cells(r, "F")
    5. End If
    6. Next r
    7. Next e
    8. For r = 2 To 7
    9. If Cells(r, "D") <> Cells(r, "F") Then
    10. Cells(r, "G") = "-"
    11. End If
    12. Next r



    Jetzt muss ich diese Überprüfung in meine Userform einbringen und scheitere daran. (Ist nicht zu fassen, aber nichts klappt auf Anhieb.. :( )

    Wenn ich die Zahlen 1,2,3,4,5 und 6 tippe, dann werden Sie in den Feldern ausgegeben. Jedoch bekomme ich dann genau sechs mal meine MsgBox die mir sagt, dass ich doppelte Zahlen getippt hätte.

    Userform:


    Hat jemand eine Idee, wie ich den Code verändern muss?

    Code:

    Visual Basic-Quellcode

    1. Dim tip(5) As Integer
    2. 'TextBox1-6 sind die Eingabefelder für die Tipps1-6
    3. tip(0) = TextBox1.Value
    4. tip(1) = TextBox2.Value
    5. tip(2) = TextBox3.Value
    6. tip(3) = TextBox4.Value
    7. tip(4) = TextBox5.Value
    8. tip(5) = TextBox6.Value
    9. 'Label11-16 sind die Ausgabefelder für die Tipps
    10. UserForm1.Label11 = tip(0)
    11. UserForm1.Label12 = tip(1)
    12. UserForm1.Label13 = tip(2)
    13. UserForm1.Label14 = tip(3)
    14. UserForm1.Label15 = tip(4)
    15. UserForm1.Label16 = tip(5)
    16. 'Schleife zu Prüfung von unzulässigen und gleichen Tipps
    17. For richtig = 0 To 5
    18. If tip(richtig) < 1 Or tip(richtig) > 49 Then
    19. MsgBox "Sie haben einen Fehler bei der Eingabe gemacht. Bitte prüfen Sie, ob alle Tipps im Bereich von 1 bis 49 liegen!"
    20. End If
    21. 'Hier beginnt die Schleife für die Prüfung auf gleiche Tipps
    22. For gleich = 0 To 5
    23. If tip(richtig) = tip(gleich) Then
    24. MsgBox "Sie dürfen Zahlen nicht doppelt tippen! Bitte prüfen Sie ihre Tipps auf doppelte Zahlen!"
    25. End If
    26. Next gleich
    27. Next richtig
    Der Fehler liegt in der Schleife:

    Visual Basic-Quellcode

    1. For richtig = 0 To 5
    2. If tip(richtig) < 1 Or tip(richtig) > 49 Then
    3. MsgBox "Sie haben einen Fehler bei der Eingabe gemacht. Bitte prüfen Sie, ob alle Tipps im Bereich von 1 bis 49 liegen!"
    4. End If
    5. 'Hier beginnt die Schleife für die Prüfung auf gleiche Tipps
    6. For gleich = 0 To 5
    7. If tip(richtig) = tip(gleich) Then
    8. MsgBox "Sie dürfen Zahlen nicht doppelt tippen! Bitte prüfen Sie ihre Tipps auf doppelte Zahlen!"
    9. End If
    10. Next gleich
    11. Next richtig

    Im ersten Durchlauf der Schleife für gleiche Zahlenfindung sieht die Variablengestalltung so aus:

    Visual Basic-Quellcode

    1. tip(0)=tip(0) then
    2. MsgBox "Sie dürfen Zahlen nicht doppelt tippen! Bitte prüfen Sie ihre Tipps auf doppelte Zahlen!"
    3. End If

    Die Prüfung muss ja mit einer Gleichheit des Feldes anbeisen.

    Visual Basic-Quellcode

    1. For richtig = 0 To 5
    2. If tip(richtig) < 1 Or tip(richtig) > 49 Then
    3. MsgBox "Sie haben einen Fehler bei der Eingabe gemacht. Bitte prüfen Sie, ob alle Tipps im Bereich von 1 bis 49 liegen!"
    4. End If
    5. 'Hier beginnt die Schleife für die Prüfung auf gleiche Tipps
    6. For gleich = 0 To 5
    7. If tip(richtig) = tip(gleich) Then gleich=gleich +1
    8. If tip(richtig) = tip(gleich) Then
    9. MsgBox "Sie dürfen Zahlen nicht doppelt tippen! Bitte prüfen Sie ihre Tipps auf doppelte Zahlen!"
    10. End If
    11. Next gleich
    12. Next richtig


    So sollte es funktionieren.
    Mit dem

    Visual Basic-Quellcode

    1. If tip(richtig) = tip(gleich) Then gleich=gleich +1

    da drin sollte er einfach die gleichen Felder um eins übergehen.

    Teste mal.
    Also er muss ja anbeißen und mir die MsgBox ausspucken, sobald ein Tipp doppelt eingegeben wurde. Mit dem Code umgehe ich das doch, oder?

    Ich habe es ausprobiert und ich kann zahlen immernoch doppelt tippen, jedoch bekomme ich die MsgBox nicht mehr sechs mal angezeigt. Aber ich bekomme Sie überhaupt nicht angezeigt. :(