none
Nach jeder Eingabe neue Random Nummer || Zähler für Versuche geht nicht RRS feed

  • Frage

  • Moin,

    ich bin zurzeit dabei ein einfaches Zahlenraten Spiel zu programmieren. Von der Theorie her läuft es auch ganz gut, aber wenn ich mein Programm Debug fällt mir auf, dass der var. immer eine neue zufällige Zahl zwischen 1 und 10 hinzufügt wird. 
    Außerdem habe ich zuerst in der Console, ein Zähler-System implemetiert, welches die Versuche des Users zählt, wie lange er gebraucht hat, die richtige Zahl zu erraten. Allerdings funktioniert, dass so nicht mehr bei Windows-Forms. 

    Hier mein Code: 

                int zahl;
                int zufallszahl = 0;
                int guessCountBiggerThan = 0;
                int guessCountLessThan = 0;
                int guessCount = 0;
    
                    try
                    {
                        //Aufforderung zum Zahl eingeben
                        zahl = int.Parse(txt_Eingabe.Text);
    
                        //Randomzahl generieren
                        Random random = new Random();
                        zufallszahl = random.Next(1, 11);
    
                        // Überprüfen ob Eingegeben Zahl = Randomzahl ist
                        if (zahl < zufallszahl)
                        {
                            lbl_Ausgabe.Text = "Die Zahl ist zu klein!";
                            guessCountLessThan++;
                        }
                        else if(zahl > zufallszahl)
                        {
                            lbl_Ausgabe.Text = "Die Zahl ist zu groß!";
                            guessCountBiggerThan++;
                        }
                        else if(zahl == zufallszahl)
                        {
                            guessCount = guessCountLessThan + guessCountBiggerThan;
                            lbl_Ausgabe.Text = "Herzlichen Glückwunsch, Sie haben dich richtige Zahl eraten!\nVersuch: "+guessCount;
                            
                        }
                    }
                    catch (FormatException ex)
                    {
                        lbl_Ausgabe.Text = "Ein Format Fehler ist aufgetreten! Überprüfen Sie, dass sie keine Sonderzeichen oder Wörter eingegeben haben.";
                        lbl_Ausgabe.Text = ex.Message;
                    }
                    catch (Exception ex)
                    {
                        lbl_Ausgabe.Text = "Ein Fehler ist aufgetreten.";
                        lbl_Ausgabe.Text = ex.Message;
                    }


    Donnerstag, 31. Oktober 2019 20:44

Alle Antworten

  • Hi,
    da Du nur einen Codeausschnitt gezeigt hast, vermute ich, dass Du bei jedem Durchlauf Random neu instanziierst. Damit liefert bei jedem Durchlauf random.Next den geleichen Wert. Du solltest die Instanziierung auf Klassenebene ausführen oder im Konstruktor. Das bewirkt, dass die Variable "random" nur einmal instanziiert wird und folgende generierte Zahlen von den vorherigen abweichen. Mit einem Neustart des Programms (erneute Instanziierung von Random) wird aber wieder die gleiche Folge wie beim letzten Start generiert. Das kann man mit einer Anfangsinitialisierung von Random mit einem relativ zufälligen Wert erreichen, z.B. mit den tausendstel Sekunden der aktuellen Zeit.

    Random  rnd = new Random(DateTime.Now.Millisecond);


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Freitag, 1. November 2019 06:28
  • Hi!
    Den Code den ich oben hinterlassen habe, ist der komplette Code den ich geschrieben habe. 
    Ok. Alles klar. Aber in wie fern meinst du die Instanziierung auf Klassenebene? 

    Hast du eigentlich noch eine Idee, warum die Versuche nicht gezählt werden?


    • Bearbeitet DevSlime Freitag, 1. November 2019 08:44
    Freitag, 1. November 2019 08:44
  • Hi,

    Den Code den ich oben hinterlassen habe, ist der komplette Code den ich geschrieben habe. 

    Du hast den Code ja nicht im luftleeren Raum geschrieben? Den Code hast Du in die Methode in einer Klasse eingefügt. Ggf. hat Dir der Designer sowohl Klasse (möglicherweise Form1) als auch Methode (möglicherweise Button1_Click) selbständig im Ergebnis Deiner Klicks beim Erzeugen des Projektes und in der Designer-Oberfläche erzeugt.

    Ok. Alles klar. Aber in wie fern meinst du die Instanziierung auf Klassenebene? 

    Instanziierung bedeutet das Erstellen eines Objektes auf Basis einer Vorlage. Mit dem Schlüsselwort "new" wird ein neues Objekt erzeugt. Als Vorlage dient eine Klasse. Für das neue Objekt wird ein Speicherbereich im Heap reserviert und mit Anfangswerten belegt. Mit einer Referenzvariablen wird auf diesen Speicherbereich verwiesen. Diese Referenzvariable wird für eine indirekte Adrressierung des Inheltes dieses Speicherbereiches genutzt. Der Compiler erzeugt die entsprechenden Verschiebungen (Displacement) für den Zugriff auf einzelne Bytes in diesem Speicherbereich. Wenn Code für dieses Objekt auszuführen ist, dann wird dieser Code in der Klassendeklaration aufgerufen.

    In Deinem Fall derklarierst Du die Variable "random" und weist ihr eine Instanz (mit "new") vom Typ der Klasse "Random" zu. Bei jedem Durchlauf des Codes wird mit der Methode Next ein Wert geliefert. Da vor dem Aufruf von Next immer eine neue Instanz der Random-Klasse erzeugt wird, wird immer der gleiche Wert geliefert. Bei der diskreten Arbeit eines Computers können keine Werte zufällig sein. Random arbeitet nach einem Algorithmus, der beginnend bei einem Startwert eine quasi zufällige Folge von Werten liefert.

    Hast du eigentlich noch eine Idee, warum die Versuche nicht gezählt werden?

    Diese Frage verstehe ich nicht, da ich nicht weiß, was Du mit Versuchen meinst, welche Variable den Zählwert beinhaltet und welche Ereignisse welchen Programmcode ausführen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Freitag, 1. November 2019 10:39
  • Ok. Ich habe es einigermaßen verstanden wie du das meinst. 

    Wegen den Versuchen: Mein Ziel ist es, dass immer ein Versuch dazu gerechnet und gespeichert wird, wenn die Zahl falsch erraten wurde. Diese gespeicherten Versuche sollen am Ende mit der Nachricht, dass man die richtige Zahl erraten hat ausgegeben werden. Allerdings werden in den Versuch (guessCount, guessCountLessThan, guessCountBiggerThan) Var. immer 0 gespeichert. 


    • Bearbeitet DevSlime Freitag, 1. November 2019 13:19
    Freitag, 1. November 2019 13:18
  • Wegen den Versuchen: Mein Ziel ist es, dass immer ein Versuch dazu gerechnet und gespeichert wird, wenn die Zahl falsch erraten wurde. Diese gespeicherten Versuche sollen am Ende mit der Nachricht, dass man die richtige Zahl erraten hat ausgegeben werden. Allerdings werden in den Versuch (guessCount, guessCountLessThan, guessCountBiggerThan) Var. immer 0 gespeichert. 


    Da fehlt eine Schleife (for, while, o.ä.). Die Variablen sind immer 0, weil du vermutlich die ganze Funktion immer wieder neu aufrufst, und du die Variablen nur in der Funktion definierst und mit 0 initialisierst, und 0+0 bleibt nunmal 0. Zeige den ganzen Code, sonst können wir dir nicht weiterhelfen.

    Gruß Guido

    Montag, 4. November 2019 09:06