Zahlenspiel [Bugbehebung]

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von thedarkside21986.

    Zahlenspiel [Bugbehebung]

    HI. folgendes Problem. ...

    ich hab 5 Versuche wenn der 5 te Versuch die richtige Zahl ist dann soll er schreiben Richtig ....

    sollten 5 Rateversuche vorbei sein dann soll er schreiben Leider alle ....
    Problem ist das wenn ich 5 mal rate - er mich noch mal ein 6tes mal auffordert eine Zahl einzugeben und dann erst den WriteLine.. Leider alle Versuche ausgibt. er soll aber nach dem 5ten Mal falsch Eingabe Gleich schreiben Leider alle Versuche verbraucht.

    2) Sub Abfragen ob neues Spiel ja oder nein - das nein liest er mir als falsche Zahl ein .. . wie kann ich das verhindern.. er soll doch nur das Spiel komplett beenden.

    VB.NET-Quellcode

    1. Imports System.Console
    2. Module Module1
    3. Public bisher As New List(Of Integer) 'Liste mit den eingegeben Zahlen
    4. Public eingabe As String = String.Empty
    5. Sub Main()
    6. WriteLine("Eine Zahl zwischen 1 und 20 wurde generiert")
    7. WriteLine()
    8. bisher.Clear() 'Nach neuem Spiel soll das Array wieder bei 0 anfangen
    9. Dim zufallszahl As Integer = New Random().Next(1, 20) 'Zufallsgenerator starten
    10. Dim eingegeben As String = String.Empty 'Eingegeben (Var) = 0
    11. ZahlAbfangen() 'startet die Prozedur zum Einlesen der Zahl
    12. Dim counter As Integer = 1 'Counter bzw. Versuche fängt bei 1 an
    13. Do
    14. bisher.Add(Integer.Parse(eingabe)) 'Fügt die neue Eingabe dem Array hinzu
    15. 'eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    16. Select Case Integer.Parse(eingabe) 'Vergleichte die Eingabe mit der Zufallszahl
    17. Case Is < zufallszahl
    18. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    19. Console.WriteLine("Die gesuchte Zahl ist größer.")
    20. Console.WriteLine("Bisher folgende Zahlen benutzt: {0} - {1}. Versuch", eingegeben, counter)
    21. ZahlAbfangen()
    22. Case Is > zufallszahl
    23. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    24. Console.WriteLine("Die gesuchte Zahl ist kleiner.")
    25. Console.WriteLine("Bisher folgende Zahlen benutzt: {0} - {1}. Versuch", eingegeben, counter)
    26. ZahlAbfangen()
    27. Case Else
    28. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    29. Console.WriteLine("Richtig, die Zahl lautete {0} und Sie haben {1} Versuche gebraucht!", zufallszahl, counter)
    30. Abfragen()
    31. Exit Do
    32. End Select
    33. counter += 1
    34. Loop Until counter > 5 'wenn alle Versuche verbraucht
    35. Console.WriteLine("Sie haben leider all ihre Versuche verbraucht! Die Zahl lautete {0}.", zufallszahl)
    36. Abfragen()
    37. End Sub
    38. Private Function EingegebeneZahlen() As String 'Funktion zur Speicherung der bereits eingegebenen Zahlen
    39. Dim _zahlen As String = String.Empty
    40. For i As Integer = 0 To bisher.Count - 1
    41. _zahlen &= bisher(i).ToString() + ", " 'Variable (ReDim)
    42. Next
    43. Return _zahlen.Remove(_zahlen.Length - 2, 2) 'Funktion gibt den Wert zurück
    44. End Function
    45. Private Sub Abfragen() 'wenn Spiel vorbei oder alle Versuche abgelaufen
    46. Console.Write("Möchten Sie nochmal spielen? (Y|N): ")
    47. Dim antwort As String = Console.ReadLine()
    48. Do Until antwort.ToLower() = "y" Or antwort.ToLower() = "n"
    49. Console.Write("Falsche Eingabe - (Y|N): ") 'falls falsche Eingabe
    50. antwort = Console.ReadLine()
    51. Loop
    52. Select Case antwort.ToLower()
    53. Case "y"
    54. Main()
    55. Case Else
    56. Exit Sub
    57. End Select
    58. End Sub
    59. Private Sub ZahlAbfangen()
    60. Console.WriteLine()
    61. Console.Write("Geben Sie die gesuchte Zahl ein: ")
    62. eingabe = Console.ReadLine()
    63. Do Until Integer.TryParse(eingabe, 0)
    64. Console.Write("Das war keine Zahl, bitte neu eingeben: ")
    65. eingabe = Console.ReadLine()
    66. Loop
    67. End Sub
    68. End Module

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „thedarkside21986“ ()

    Hallo,
    @Adam: Das machts noch schlimmer. :thumbdown:
    Die Ursache ist folgende:
    Du hast eine Fußgesteuerte Schleife, d.h. erst nach dem ausführen deiner Abfragen prüfst du die Schleifenbedingung mit counter > 5. Diese Bedingung ist erst im 6.Durchlauf erfüllt. :huh: Es gibt jetz 2 Möglichkeiten:
    1. counter >= 5 oder
    2. Umbau auf eine kopfgesteuerte Schleife (Do While <Bedingung> ... Loop)
    näheres findest du hier
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Du solltest aus deiner Sub Abfragen eine Funktion as boolean machen, die je nach Eingabe "Y" oder "n" true oder fals zurück gibt.
    In Main wäre dann eine fußgesteuerte Schleife sinnvoll, die das gesamte Prozedere umfasst. Im Fuß prüfst du dann mit Loop Abfragen(), ob alles nochmal durchgeführt werden soll oder nich.
    Im Moment rufst du bei "y" das bereits laufende Main()-Prog nochmal auf. Der Prozeß läuft dann quasi doppelt. Ich denke, da gibs die Probleme.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    lol eingabe "Y" das er das Programm wieder neu hochlädt funktioniert ja . - es geht darum wenn "n" eingegeben wird, dass das Programm verlassen wird. derzeit wertet er aber das N als falsche Zahl und erst beim zweiten N beendet er.
    Wenn du in der Main() in der Loop Schleife statt: "Exit Do" -> "Exit Sub" nimmst, funktioniert es ;)



    VB.NET-Quellcode

    1. Sub Main()
    2. WriteLine("Eine Zahl zwischen 1 und 20 wurde generiert")
    3. WriteLine()
    4. bisher.Clear() 'Nach neuem Spiel soll das Array wieder bei 0 anfangen
    5. Dim zufallszahl As Integer = New Random().Next(1, 20) 'Zufallsgenerator starten
    6. Dim eingegeben As String = String.Empty 'Eingegeben (Var) = 0
    7. ZahlAbfangen() 'startet die Prozedur zum Einlesen der Zahl
    8. Dim counter As Integer = 1 'Counter bzw. Versuche fngt bei 1 an
    9. Do
    10. bisher.Add(Integer.Parse(eingabe)) 'Fgt die neue Eingabe dem Array hinzu
    11. 'eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    12. Select Case Integer.Parse(eingabe) 'Vergleichte die Eingabe mit der Zufallszahl
    13. Case Is < zufallszahl
    14. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    15. Console.WriteLine("Die gesuchte Zahl ist grer.")
    16. Console.WriteLine("Bisher folgende Zahlen benutzt: {0} - {1}. Versuch", eingegeben, counter)
    17. ZahlAbfangen()
    18. Case Is > zufallszahl
    19. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    20. Console.WriteLine("Die gesuchte Zahl ist kleiner.")
    21. Console.WriteLine("Bisher folgende Zahlen benutzt: {0} - {1}. Versuch", eingegeben, counter)
    22. ZahlAbfangen()
    23. Case Else
    24. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    25. Console.WriteLine("Richtig, die Zahl lautete {0} und Sie haben {1} Versuche gebraucht!", zufallszahl, counter)
    26. Abfragen()
    27. Exit Sub
    28. End Select
    29. counter += 1
    30. Loop Until counter > 5 'wenn alle Versuche verbraucht
    31. Console.WriteLine("Sie haben leider all ihre Versuche verbraucht! Die Zahl lautete {0}.", zufallszahl)
    32. Abfragen()
    33. End Sub
    Danke, also so funktioniert es mit der Abfrage...

    Ein Problem hab ich aber trotzdem noch

    wenn ich 5 Versuche verbraucht habe. dann soll er die Abfrage "Geben Sie eine Zahl ein" weglassen... und Gleich schreiben "Sie haben alle Versuche verbraucht. ...
    Mach einfach aus der Endgeprüften While schleife eine anfangsgeprüfte ;)



    VB.NET-Quellcode

    1. Do While counter < 5
    2. bisher.Add(Integer.Parse(eingabe)) 'Fgt die neue Eingabe dem Array hinzu
    3. 'eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter
    4. Select Case Integer.Parse(eingabe) 'Vergleichte die Eingabe mit der Zufallszahl Case Is < zufallszahl
    5. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter Console.WriteLine("Die gesuchte Zahl ist grer.") Console.WriteLine("Bisher folgende Zahlen benutzt: {0} - {1}. Versuch", eingegeben, counter)
    6. ZahlAbfangen()
    7. Case Is > zufallszahl
    8. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter Console.WriteLine("Die gesuchte Zahl ist kleiner.") Console.WriteLine("Bisher folgende Zahlen benutzt: {0} - {1}. Versuch", eingegeben, counter)
    9. ZahlAbfangen()
    10. Case Else
    11. eingegeben = EingegebeneZahlen() 'Ruft die Funktion auf und gibt den Wert an die Variable weiter Console.WriteLine("Richtig, die Zahl lautete {0} und Sie haben {1} Versuche gebraucht!", zufallszahl, counter)
    12. Abfragen()
    13. Exit Do
    14. End Select
    15. counter += 1
    16. Loop 'wenn alle Versuche verbraucht