Integer Variable "konstant" halten

  • C#
  • .NET 5–6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Integer Variable "konstant" halten

    Moin
    ich erstelle gerade den Klassiker Galgenmännchen.
    Es klappt auch soweit alles ganz gut nur an einer Stelle hackts:
    die Anzahl der erlaubten Versuche wird IMMER heruntergesetzt, egal ob der eingetragene Buchstabe richtig ist oder falsch.
    Optimal wäre es, wenn die Anzahl der Versuche nicht heruntergesetzt wird, wenn der Buchstabe richtig ist.
    Es handelt sich bei der im Titel angedeuteten Variable _versuche.
    Ich versuche hier nicht ganz so viel Code zu Posten, hoffe dass man es trotzdem versteht.

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. if (_versuche2 != 0)
    4. {
    5. _versuche = _versuche2;
    6. }
    7. for (int i = 0; i <= _listeGebrauchterTextBoxen.Count - 1; i++)
    8. {
    9. if (_listeGebrauchterTextBoxen[i].Text.ToLower() == textBox12.Text.ToLower())
    10. {
    11. //hier ist der Buchstabe richtig, dennonch springt der compiler immer spätestens beim nächsten i runter zum Else if-Teil und die variable _versuche wird runtergesetzt
    12. _listeGebrauchterTextBoxen[i].ForeColor = Color.Green;
    13. continue;
    14. }
    15. else if (_listeGebrauchterTextBoxen[i].Text.ToLower() != textBox12.Text.ToLower())
    16. {
    17. //hier ist der buchstabe falsch
    18. _versuche2 = _versuche - 1;
    19. }
    20. }
    21. label2.Text = "Versuche: " + _versuche2.ToString();
    22. textBox12.Text = "";
    23. }
    24. }


    _listeGebrauchterTextBoxen ist eine list of Textbox
    _versuche bzw. _versuche2 ist ein Integer


    Ich habe einen Brett vorm Kopf und weiß grad nicht weiter :/

    danke LG
    Ok du hast eine If Clause, die anders läuft als du es dir wünscht, dann musst du dir mal angucken was du rein tust.

    Ersetze doch mal Zeile 13 durch:

    VB.NET-Quellcode

    1. Dim Text1 = _listeGebrauchterTextBoxen(i).Text.ToLower()
    2. Dim Text2 = textBox12.Text.ToLower()
    3. If Text1 = Text2
    Was kommt denn da raus für die Strings? Das muss ja dann verschieden sein
    Vielleicht schießt Du Dir selbst ins Knie und lässt uns unnötigerweise im Dunkeln, wenn Du ohne Erklärung solche Begriffe wie textBox12 und _listeGebrauchterTextBoxen verwendest. Was befindet sich in textBox12 und was ist die _listeGebrauchterTextBoxen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Haudruferzappeltnoch ich mach mir eher Sorgen um Zeile 24, weil da geht er eben rein, obwohl er das nicht immer soll. Aber hast recht ich sollte da mal nachdenken / tüfteln was da reingehört.

    @VaporiZed tetbox12 ist diejenige textbox, wo der Benutzer einen Buchstaben zum erraten reinstellt.
    _listeGebrauchterTextBoxen ist eine List<Texbox>, wo das entsprechende zu erratende Wort drine steht.

    In jeder Textbox der _listeGebrauchterTextBoxen steht ein einzelner Buchstabe des Wortes drin, was der benutzer jedoch nicht sieht. Denn Vorher wurde folgendes festgelegt:

    C#-Quellcode

    1. _listeGebrauchterTextBoxen[i].ForeColor = _listeGebrauchterTextBoxen[i].BackColor;
    .

    Durch die Schleife in Post 1 wird diese _listeGebrauchterTextboxen durchgegangen und wenn ein Buchstabe übereinstimmt, wird dieser dann in der entsprechenden Textbox grün markiert und so für den Benutzer sichtbar:

    _listeGebrauchterTextBoxen[i].ForeColor = Color.Green;

    Tatsächliches liegt das Problem denke ich eben beim Runterzählen der Versuche auf Zeile 27.
    Denn der Compiler wird ja durch die for-schelife gezwungen immer in die else-if Bedingung reinzugehen.
    Habe es schon mit einer For-Each Schleife Versucht und hatte da genau das gleiche Problem.

    Ich könnte auch das Problem lösen, indem ich auf Zeile 19 continue durch break ersetze.Nur dann funktioniert ein andere Sache nicht, nämlich wenn das Wort mehrere gleiche Buchstaben hat, wird nur einer davon angeziegt. Aber im Spiel werden ja durch einmaliges raten eines Buchstabens ja gleich alle Buchstaben dieser Sorte aufgedeckt.

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

    Dann solltest Du wohl vor der For-Schleife ein gefunden-Flag einbauen (bool-Variable mit Startwert false) und den If-Block ohne Else lassen. Sobald was in mindestens einer textBox gefunden wurde, setzt Du neben deren Farbe auch gefunden auf true. Und nach der For-Schleife schaust Du, welchen Wert gefunden hat. Falls false, dann versuche um 1 reduzieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Gut du läufst immer durch dein Wort Buchstabe für Buchstabe durch, ist ja klar, dass dann manche Buchstaben nicht richtig sind. Er soll nicht immer rein, aber deine Schleife fragt halt immer nach.
    Die Bedingung um Versuche zu reduzieren ist nicht das Gegenteil der Bedingung einen Buchstaben aufzudecken.

    @VaporiZed schlägt einen Flag vor, damit du eine neue unabhängige Bedingung prüfen kannst.

    Sowas kann man auch probieren:

    VB.NET-Quellcode

    1. Sub ButtonOderSo()
    2. Dim GefundeneBuchstaben = _listeGebrauchterTextboxen.Where(Function(x) x.Text.ToLower = textbox12.Text.ToLower)
    3. If GefundeneBuchstaben.Count = 0 Then AnzahlderVersucheBearbeiten() : Exit Sub
    4. For each buchstabe in GefundeneBuchstaben
    5. buchstabe.ForeColor = Color.Green
    6. Next
    7. End Sub

    Entweder werden die Versuche reduziert oder du hast automatisch nur die richtigen Buchstaben in einer Kiste.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()