Eingaben in Windows Forms (C#) einrichten

ArrorRT

Lieutenant
Registriert
Jan. 2021
Beiträge
847
Hallo alle zusammen,

ich möchte im Feld ″hier stehen alle bereits verwendeten Zahlen)″ anzeigen lassen, welche Zahlen schon eingegeben wurden.
Kann mir jemand sagen, wie das geht?

1645537342331.png


hier mein ganzer Code:
C#:
using System;
using System.Windows.Forms;

namespace Zahlenratespiel
{
    public partial class Form1 : Form
    {
        int obergrenze;
        int untergrenze;
        int zufallszahl = 0;
        int counter = 0;
        Random r = new Random();
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            textBox5.Text = "";
            if (int.TryParse(textBox3.Text, out untergrenze))
            {
                if (int.TryParse(textBox4.Text, out obergrenze))
                {
                    if (untergrenze < obergrenze)
                    {
                        zufallszahl = r.Next(untergrenze, obergrenze + 1);
                        textBox2.Text = "Das spiel läuft";
                    }
                    else
                    {
                        textBox2.Text = "Die Untergrenze muss kleiner als die Obergrenze sein";
                    }
                }
                else
                {
                    textBox2.Text = "Die Obergrenze muss eine ganze Zahl sein";
                }
            }
            else
            {
                textBox2.Text = "Die Untergrenze muss eine ganze Zahl sein";
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int eingabe;
            counter += 1;
            lblversuche.Text = counter.ToString();
            if (int.TryParse(textBox1.Text, out eingabe))
            {
                if (zufallszahl > eingabe)
                {
                    textBox2.Text = "Die Zufallszahl ist größer als die Eingabe";
                }

                else if (zufallszahl < eingabe)
                {
                    textBox2.Text = "Die Zufallszahl ist kleiner als die Eingabe";
                }
                else
                {
                    textBox2.Text = "Sie haben zwar gewonnen aber werden keinen Preis bekommen";
                }
            }
            else
            {
                textBox2.Text = "Die Eingabe muss eine ganze Zahl sein";
            }
        }
        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void lblversuche_Click(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
 
Zuletzt bearbeitet:
markieren, auf die rechten 3 punkte (neben dem quote und dem tabellen zeichen, da dann < / > und c# wählen.
Dann ggf. den code neu rein pasten, damit alles eingerückt ist.
Dann ists was leichter zu lesen.
 
  • Gefällt mir
Reaktionen: ArrorRT
Immer, wenn du eine neue Zahl einliest, kannst du z.B. die Text-Eigenschaft des unteren Feldes um diese Zahl ergänzen. Was ist das denn, TextBox?
Da wäre es irgendwie so: TextBox.Text += " " + zahl.ToString();

Übrigens wäre es empfehlenswert, Variablen sinnvolle Namen zu geben. "textBox5" ist schlecht, "lblversuche" ist besser ("lblVersuche" wäre sogar noch besser). Das hilft einfach sowohl dir als auch anderen, den Code zu verstehen.
 
  • Gefällt mir
Reaktionen: ArrorRT
Erst mal vorne weg. Für reine Textausgaben wären Label eher geeignet als Textboxen(die braucht es vor allem für Eingaben).
Um die Zahl zu schreiben musst Du sie nur dem Textfeld bzw Control zuweisen also textbox.Text= textbox.Text+ neue Zahl
 
  • Gefällt mir
Reaktionen: ArrorRT
Ehrlich gesagt finde ich es fast noch wichtiger, wenn die Buttons und deren Click-Events sprechende Namen hätten.

Button1, Button2, TextBox1-5, es ist mühselig, nachzuvollziehen - oder besser: zu raten - was denn nu was ist. Zum besseren Verständnis wäre es auch hilfreich, zu wissen was das Programm überhaupt tun soll. Je genauer du uns dein Programm und dein Problem beschreibst - inkl. sprechender Variablennamen und ggfs auch Kommentaren - umso eher kann man dir helfen. Ich persönlich habe gerade wenig Lust, das alles auseinanderzufriemeln...

Grundsätzlich ist es aber so, dass du dein Vorhaben in einem Event einbauen musst. Ich vermute mal, dass man eine Zahl eingeben soll und dann auf "raten" klickt. Im Click-Event des "raten"-Buttons - ist das nun button1 oder button2? - könnte man den Text der fraglichen Textbox oder des Labels so anpassen wie @Amaoto es in #6 zeigt. Bei jedem Button-Klick wird also der Zähler für die Versuche erhöht, die Zahl geprüft und selbige anschließend hinten an die gewünschte Textbox angehängt.
 
@Raijin ich wollte ja alles umbenennen, aber immer, wenn ich das tat, konnte ich sie nicht mit dem neuen Namen ansprechen, frage mich nicht wieso.

Ich habe es bereits ausprobiert, aber komischerweise kommt immer die Lösung des Rätsels und es werden nicht die Zahlen aufgelistet, die man probiert hat.
 
Es müssen eben alle Stellen entsprechend umbenannt werden. Im Visual Studio kann man beispielsweise mit Rechts auf einen Namen klicken und "Umbenennen" wählen (Shortcut= STRG+R+R). Dann sorgt Visual Studio dafür, dass der Name der Variable sowie alle Stellen, wo man sie verwendet hat, geändert wird.

Bei den Event-Funktionen ist es so, dass sie als Eigenschaft im Button hinterlegt sind (zB unter Click). Auch dort muss entsprechend der Text angepasst werden. Wenn man aber erst den Button umbenennt und dann den Click-Event erstellt (zB durch Doppelklick auf den Button), wird der automatische Name bereits den korrekten Namen beinhalten.

ArrorRT schrieb:
Ich habe es bereits ausprobiert, aber komischerweise kommt immer die Lösung des Rätsels und es werden nicht die Zahlen aufgelistet, die man probiert hat.
Wenn du etwas ausprobierst und es nicht oder anders funktioniert als erwartet, ist es auch bei einem so vermeintlich banalen Programm hilfreich, wenn du deine Versuche hier postest. Aktuell ist in deinem Quellcode nämlich nirgends auch nur der Ansatz einer Historie der Versuche ausprogrammiert, nicht mal nicht-funktionsfähig.

Es verstößt leider gegen die Boardregeln, Hilfe bei Hausaufgaben zu leisten, wenn keine erkennbare Eigenleistung vorhanden ist - also wenn man nicht man die Lösungsversuche sieht.
 
Hier meine ''Hausaufgabe'':
C#:
using System;
using System.Windows.Forms;

namespace Zahlenratespiel
{
    public partial class Form1 : Form
    {
        int obergrenze;
        int untergrenze;
        int zufallszahl = 0;
        int counter = 0;
        Random r = new Random();
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void button1_Click(object sender, EventArgs e)
        {
            lblversuche.Text = "";
            textBox1.Text = "";
            textBox5.Text = "";
           
            if (int.TryParse(textBox3.Text, out untergrenze))
            {
                if (int.TryParse(textBox4.Text, out obergrenze))
                {
                    if (untergrenze < obergrenze)
                    {
                        zufallszahl = r.Next(untergrenze, obergrenze + 1);
                        textBox2.Text = "Das spiel läuft";
                    }
                    else
                    {
                        textBox2.Text = "Die Untergrenze muss kleiner als die Obergrenze sein";
                    }
                }
                else
                {
                    textBox2.Text = "Die Obergrenze muss eine gültige Zahl sein (1 - 10)";
                }
            }
            else
            {
                textBox2.Text = "Die Obergrenze muss eine gültige Zahl sein (1 - 10)";
            }
            textBox5.Text += "" + zufallszahl.ToString();

        }
        private void button2_Click(object sender, EventArgs e)
        {
            int eingabe;
            counter += 1;
            lblversuche.Text = counter.ToString();
            if (int.TryParse(textBox1.Text, out eingabe))
            {
                if (zufallszahl > eingabe)
                {
                    textBox2.Text = "Die Zufallszahl ist größer als die Eingabe";
                }

                else if (zufallszahl < eingabe)
                {
                    textBox2.Text = "Die Zufallszahl ist kleiner als die Eingabe";
                }
                else
                {
                    textBox2.Text = "Sie haben zwar gewonnen aber werden keinen Preis bekommen";
                }
            }
            else
            {
                textBox2.Text = "Die Obergrenze muss eine gültige Zahl sein (1 - 10)";
            }

        }
        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void lblversuche_Click(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {

        }
    }
}


in Zeile 50 kannst du die Veränderung sehen
 
Das ist jetzt im Click-Event von button1. In diesem Event wird direkt in der 3. Zeile (25) die Textbox geleert und am Ende des Click-Events hängst du an diese nun leere Textbox eine neue Zahl ran. Logischerweise steht bei jedem Klick auf den button1 immer nur die aktuelle zufallszahl in der Textbox.

Ich hatte das Spiel eigentlich so verstanden, dass man 1x button1 zum Starten klickt und dann mit button2 rät. Wenn dem so ist, hast du die Änderung mutmaßlich im falschen button-Event gemacht.
 
@Raijin also das Spiel funktioniert so, dass man auf Spiel starten kickt - es werden alle Felder geleert - Zahl eingeben - auf Raten klicken und dann kommt entweder "zahl, muss höher" oder „niedriger sein“.
 
Wie gesagt, wir sehen nur "button1_Click" und "button2_Click" und es gibt keinen direkten Bezug auf die Buttons "Spiel start" und "raten".

Raijin schrieb:
Ich hatte das Spiel eigentlich so verstanden, dass man 1x button1 zum Starten klickt und dann mit button2 rät. Wenn dem so ist, hast du die Änderung mutmaßlich im falschen button-Event gemacht.



ArrorRT schrieb:
Ich habe es bereits ausprobiert, aber komischerweise kommt immer die Lösung des Rätsels und es werden nicht die Zahlen aufgelistet, die man probiert hat.

ArrorRT schrieb:
das Spiel funktioniert so, dass man auf Spiel starten kickt - es werden alle Felder geleert -
Ich vervollständige mal:

- und in textBox5 wird die Zufallszahl reingeschrieben.


Das Programm verhält sich also meinem Dafürhalten nach genau so wie du es programmiert hast. button1 - mutmaßlich "Spiel starten" - wird geklickt, textBox5 = "", [einBischenCode], textBox5 = Zufallszahl. Hattest du etwas anderes erwartet? Wenn button2 "raten" ist, kann das Programm auch nur dort, wo die Eingabe ja auch geprüft wird, dieselbe Eingabe in einer Historie speichern, zB in textBox5. button1 bzw. dessen Click-Event bekommt es ja nichts mit, wird also nicht ausgeführt, während der Spieler eifrig rät und auf button2 klickt.
 
Du schreibst ja:
ArrorRT schrieb:
ich möchte im Feld ″hier stehen alle bereits verwendeten Zahlen)″ anzeigen lassen, welche Zahlen schon eingegeben wurden.
Dann setzt du dort aber nicht die eingegebene Zahl, sondern eine Zufallszahl hinein:
C#:
textBox5.Text += "" + zufallszahl.ToString();
Also stimmt eins von beiden nicht.
 
  • Gefällt mir
Reaktionen: Raijin
Eben. Es passiert genau das was programmiert wurde. Ist doch nachvollziehbar, dass die Lösung aka zufallszahl angezeigt wird, wenn man eben diese in die Textbox schreibt.

Ergo: Die Textbox im "raten"-Button mit der zuvor vom Spieler eingegebenen und geprüften Zahl aktualisieren. Das heißt im übrigen auch, dass nur gültige Versuche dort auftauchen sollten, also innerhalb der entsprechenden if-Blöcke. Sonst gibt man "h" ein, das Spiel merkt an, dass es eine Zahl sein muss, trotzdem steht's in den Versuchen drin - das ist ja wohl eher nicht gewollt ;)
 
ArrorRT schrieb:
ich möchte im Feld ″hier stehen alle bereits verwendeten Zahlen)″ anzeigen lassen, welche Zahlen schon eingegeben wurden.
Exakt für diesen Anwendungsfall gibt es das static Attribut. Das hält seinen Wert, ohne dass man viel tun muß.

internal static List<int> VerwendeteZahlen wäre eine Option und dann ToString() überschreiben mit String.Join. Dann muss nur noch mit .Add die nächste Zahl angehängt werden und das Ergebnis gibts vollautomatisch.
 
Hallo @RalphS ich weiß leider nicht wie ich das umsetzen kann, ich programmiere erst seit Montag xD.
C#:
static int verwendeteZahlen;

das hab ich versucht, aber schmeißt nur Fehler.
 
Hast du dir denn die anderen Antworten durchgelesen? Da steht eigentlich alles Nötige drin.
 
Zurück
Oben