Autor Beitrag
BIOS-Crasher
Hält's aus hier
Beiträge: 10

Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
BeitragVerfasst: Fr 22.02.08 23:15 
Hallo!
ICh habe ein kleines Testprogramm geschrieben um den Umgang mit Randoms zu erlernen ( learning by doing ;-) )
Das funktionniert bis jetzt auch sehr gut nur möchte ich, das das Programm die Zahl die im Random steht nach der "Benutzung" d.h. das prüfen der Zahl, diese auch anzeigt. Wenn ich es mit
ausblenden C#-Quelltext
1:
 label2.Text = rand;					

versuche, zeigt das Label nur System.Random .
Hier der Code ( sorry wegen der größe):
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
namespace Test

{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        Random rand = new Random();



        private void button1_Click(object sender, EventArgs e)
        {

            if (rand.Next(17) == 1)
            {
                label1.Text = "Richtig";

            }
            else
            {
                label1.Text = "Falsch";
                label2.Text = rand;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (rand.Next(17) == 2)
            {
                label1.Text = "Richtig";
               
            }
            else
            { label1.Text = "Falsch"
                 }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (rand.Next(17) == 3)
            {
                label1.Text = "Richtig"
                
            }
            else
            { label1.Text = "Falsch";
            
        }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (rand.Next(17) == 4)
            {
                label1.Text = "Richtig";
                
            }
            else
            { label1.Text = "Falsch";
                }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (rand.Next(17) == 5)
            {
                label1.Text = "Richtig";
            
            }
            else
            { label1.Text = "Falsch";
           
        }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (rand.Next(17) == 6)
            {
                label1.Text = "Richtig";
                       }
            else
            { label1.Text = "Falsch";
            
        }
        }

    }
    }
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 23.02.08 11:57 
Hallo!

Du speicherst die Zufallszahl einfach in einer entsprechenden Variable:
ausblenden C#-Quelltext
1:
int myRand = rand.Next(1,7);					


Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 23.02.08 11:58 
Hallo,

Du musst offensichtlich genau unterscheiden zwischen einer Klasse bzw. der Instanz einer Klasse, einer bestimmten Eigenschaft und dem Ergebnis einer bestimmten Methode.

rand repräsentiert eine Instanz der Klasse Random, steht also für "alles", was Du mit Random machen kannst.

Wenn Du die Klasse bzw. dieses Element an Label.Text übergeben willst, verlangt NET einen String. Diesen bekommt es automatisch durch rand.ToString(). Diese Standardmethode, die es bei allen Klassen gibt, "gibt einen String zurück, der das aktuelle Objekt darstellt". Sofern die NET-Entwickler keinen Grund oder keine Möglichkeit haben, besondere Informationen darin einzubinden, gibt es als Ergebnis nur den Klassennamen.

Den nächsten/aktuellen Zufallswert bekommst Du (wie Du es ja auch machst) durch Aufruf der Next-Methode. Wenn Du diesen Wert mehrfach verwenden willst, musst Du ihn lediglich in einer eigenen Variablen zwischenspeichern. Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
           int next = rand.Next(17);
           if (next == 1)
            {
                label1.Text = "Richtig";
            }
            else
            {
                label1.Text = "Falsch";
                label2.Text = next.ToString();
            }

Du musst bei NET und C# ganz genau auf die verwendeten Typen achten. Automatische Konvertierungen wie "label2.Text = rand" gibt es selten, und sie führen (wie hier gesehen) oft nicht zum gewünschten Ergebnis. Also Augen auf mit den Typen!

Außerdem schreit Dein Code geradezu nach Vereinfachung: 6 Buttons mit identischem Arbeitsablauf können und sollten problemlos mit einheitlichem Code verarbeitet werden.

Vorarbeit: Jeder Button bekommt eine Markierung; das gehört in den Konstruktor hinter InitializeComponents():
ausblenden C#-Quelltext
1:
2:
Button1.Tag = 1;
Button2.Tag = 2;  // usw.

Alle Buttons bekommen denselben EventHandler zugewiesen; das geht auch über den Designer oder durch manuelle Änderung in der Designer.cs:
ausblenden C#-Quelltext
1:
ButtonX.Click += ButtonsClick;					

Dann gibt es eine einheitliche Prüfung (die Zusatzprüfungen werden nur der Vollständigkeit halber vorgenommen):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        private void ButtonsClick(object sender, EventArgs e)
        {
            if (sender is Button && (sender as Button).Tag != null)  {
                int tag = (int)(sender as Button).Tag;
                int next = rand.Next(17);
                label1.Text = next == tag ? "Richtig" : "Falsch";
                if (next != tag)
                    label2.Text = next.ToString();
            }
        }

(Anstelle von Tag könnte auch der Button-Name ausgewertet werden, aber der könnte geändert werden - Namen wie Button1 ff. sollten normalerweise sowieso verboten werden; aber dann bräuchte man noch eine Konvertierung char -> int; da ist die Tag-Lösung schöner.)

Viel Erfolg! Jürgen

@Christian
Da schreibe ich seit einer Viertelstunde an meinen Erläuterungen, und Du kommst mit der eigentlichen Lösung dazwischen. :)

BIOS-Crasher hat folgendes geschrieben:
Hier der Code ( sorry wegen der größe):

Du hättest doch selbst merken können, dass Du denselben Code 6x zitierst; das hättest Du auch weglassen können.


Zuletzt bearbeitet von JüTho am Sa 23.02.08 15:07, insgesamt 1-mal bearbeitet
BIOS-Crasher Threadstarter
Hält's aus hier
Beiträge: 10

Win VISTA
Delphi (Delphi 7) , C# (Visual C# 2008 Express Edition)
BeitragVerfasst: Sa 23.02.08 14:44 
user profile iconJüTho hat folgendes geschrieben:

Du hättest doch selbst merken können, dass Du denselben Code 6x zitierst; das hättest Du auch weglassen können.

Uups, sorry, lag wohl daran, dass es so spät war :oops:
Jedenfalls danke für die Antwort.