Autor |
Beitrag |
petermatthus1
Hält's aus hier
Beiträge: 6
|
Verfasst: Di 18.05.10 09:52
Guten Morgen,
ich komme einfach nicht hinter die Lösung meines Problems. Mein Problem ist folgendes: Ich erzeuge in einem Array mit 5 Elementen über eine for-Schleife für jedes Element eine Zufallszahl. Das Erzeugen erfolgt über das betätigen eines Buttons. Jede Zufallszahl wird in einem Label ausgegeben (insgesamt 5 Labels). Unter jedem Label habe ich eine checkBox gesetzt. Nun möchte ich, dass wenn eine checkBox angeklickt wird, keine Zufallszahl mehr erzeugt wird, sondern die aktuelle Zufallszahl für das entsprechende Label beibehalten wird und nur die anderen Labels (wo die checkBox nicht angeklickt ist) neue Zufallszahlen bekommen.
Ich würde mich über Eure Hilfe sehr freuen, bis dahin einen schönen Tag Euch allen.
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Di 18.05.10 11:01
Hallo und  ,
du musst überprüfen ob die CheckBox markiert ist und dann keine neue Zufallszahl setzen. Ist doch ganz einfach.
Allerdings kann man dir nichts konkretes sagen, da wir deinen Code nicht kennen.
Gruß
|
|
petermatthus1 
Hält's aus hier
Beiträge: 6
|
Verfasst: Di 18.05.10 11:57
Also der Code sieht bis jetzt so aus:
...
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:
| namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
int[] Kniffelzahlen = new int[5];
Random rnd = new Random();
int Würfeln = 0;
private void button1_Click(object sender, EventArgs e) {
int i, Zufallszahl;
for (i = 0; i <= 4; i++) { Zufallszahl = rnd.Next(1, 7); Kniffelzahlen[i] = Zufallszahl; }
label1.Text = Convert.ToString(Kniffelzahlen[0]);
label2.Text = Convert.ToString(Kniffelzahlen[1]);
label3.Text = Convert.ToString(Kniffelzahlen[2]);
label4.Text = Convert.ToString(Kniffelzahlen[3]);
label5.Text = Convert.ToString(Kniffelzahlen[4]); Würfeln = Würfeln + 1;
label6.Text = Convert.ToString("Das ist der " +Würfeln+ ". Versuch!" ); if (Würfeln == 3) { button1.Enabled = false; } |
...
Mein Vorschlag wäre jetzt, mit einer If-Anweisung zu prüfen, ob die checkBox markiert ist und dann keine Zufallszahl mehr erzeugen (also so wie Du das schon in Deiner Antwort geschrieben hast, vielen Dank dafür), aber wie genau ich das jetzt machen muss, dafür fehlen mir noch die Kenntnisse.
Zuletzt bearbeitet von petermatthus1 am Di 18.05.10 12:38, insgesamt 1-mal bearbeitet
|
|
JüTho
      
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
|
Verfasst: Di 18.05.10 12:25
Hallo und noch
Mein Vorschlag ist, dass du zuerst deinen Code als solchen markierst: Gehe auf deinen letzten Beitrag mit dem Schere-Button, "Bereiche" öffnen, in der ComboBox C# wählen, Einrückungen beachten oder setzen, Code-Auszug markieren, Plus-Button, "Vorschau", wenn es korrekt angezeigt wird, dann "Absenden".
So kann man nichts sinnvoll erkennen (außer dass Namen wie Form1 und Label4 verboten gehören, siehe Namenskonventionen). Jürgen
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Di 18.05.10 13:00
Dann mach das doch
Du hast ja deine Checkboxen wie deine Labels mit dem Designer platziert. Mit checkBox1.Checked überprüfst du ob die Checkbox gecheckt ist. Solche Informationen findest du immer bei MSDN.In deinem Fall die Eigenschaften von CheckBox.
Denke daran, dass jedes Objekt ein ToString() Methode hat (und auch die primitiven Datentypen). Deshalb ist Convert.ToString meistens der falsche Weg. Wenn du eine null Überprüfung benötigst, bzw. auch null ausgeben willst kannst du die Daten auch nach string casten.
Den if-else-Konstrukt kannst du auch überall nachschauen:
C#-Quelltext 1: 2: 3: 4:
| if (!checkBox1.Checked) { label1.Text = Kniffelzahlen[0].ToString(); } |
Ich hab noch ein paar allgemeine Tipps (neben den Namenskonventionen):
a) Du kannst in Zeile 24/25 die Zuweisung direkt machen ( kniffelZahlen[i] = rnd.Next(1,7);
b) Du kannst die Labels (zum Beispiel im Konstruktor einer Gruppe zuordnen) um so das Wiederholte setzen und überprüfen zu vermeiden.
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:
| private List<Label> _cubes = new List<Label>(); private List<CheckBox> _activeCubes = new List<CheckBox>(); public Form1() { InitializeComponent(); _cubes.Add(label1); _cubes.Add(label2); ... _activeCubes.Add(checkBox1); ... }
private void button1_Click(object sender, EventArgs e) { int cubeCounter = 0; foreach(var cube in _cubes) { if (!_activeCubes[cubeCounter++].Checked) { cube.Text = rnd.Next(1,7).ToString(); } }
Würfeln = Würfeln + 1;
label6.Text = Convert.ToString("Das ist der " +Würfeln+ ". Versuch!" ); if (Würfeln == 3) { button1.Enabled = false; } } |
c) und man erkennt schon am "umständlichen" Code, dass für ein Würfel sich wohl am besten ein UserControl anbietet.
d) und auch, dass der KniffelZahlen array weg kann
Soweit so gut,
Gruß
|
|
petermatthus1 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 20.05.10 09:07
Welche Bedeutung hat denn das Ausrufezeichen vor checkBox1.Checked?
C#-Quelltext 1: 2: 3: 4:
| if (!checkBox1.Checked) { label1.Text = Kniffelzahlen[0].ToString(); } |
|
|
JüTho
      
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
|
Verfasst: Do 20.05.10 09:13
Das gehört zu den absoluten Grundlagen. Du musst dich wohl zielgerichtet einarbeiten, z.B. über OpenBook VC#. Konkret geht es um 2.4.3 Logische Operatoren als Ergänzung zu 2.4.2 Vergleichsoperatoren.
Jürgen
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 20.05.10 09:13
Das kehrt die Bedeutung um, heißt also "wenn nicht checkBox1.Checked", dann...
|
|
petermatthus1 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 20.05.10 10:33
Also, wenn ich das richtig verstanden habe, dann muss die Anweisung folgendermaßem aussehen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if (!checkBox1.Checked) { label1.Text = Kniffelzahlen[0].ToString(); }
else { Kniffelzahlen[0] = rnd.Next(1, 7); } |
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 20.05.10 11:21
Hmm... wieso hast du noch dein zahlen Array???
Den else Pfad brauchst du nicht.. entweder du willst eine neue Zahl zuweisen oder eben nichts machen.
|
|
petermatthus1 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 20.05.10 12:48
Jetzt habe ich es hinbekommen, vielen Dank für Eure Hilfe.
Wenn ich aber jetzt den Zahlen Array weglasse, dann wird in jedem Label die gleiche Zahl erzeugt.
Noch eine Frage zum Forum:
Wenn ich jetzt wieder mal eine Frage haben sollte (was bestimmt vorkommt) muss/soll ich dann ein neues Thema aufmachen, oder muss/soll ich hier weiter reinschreiben (aus Platz-/Übersichtsgründen)?
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 20.05.10 13:11
Du sollst gleich die generierte Zahl dem Textlabel zuweisen. Das zwischenspeichern im Array ist unnötig (es seiden du wilst später dir das cast ersparen, aber ich würde dir eh ein UserControl eines Cubes vorschlagen).
Wenn du eine Frage zum gleichen Thema (siehe Überschrift) hast, dann in diesen Thread (sprich rund um Random und CheckBox Kombination).
Alle anderen Fragen (wie zum Beispiel was bedeutet "!") bitte in ein eigenen Thread. Dadurch findest du und andere User später diesen Eintrag leichter wieder.
Gruß
PS: Ich habe gestern ein Cube-UserControl implementiert. Man kann auf ihm Würfel (n-Mal), das Ergebnis als Würfel oder Zahl anzeigen lassen und den ReadOnly-Mode wählen. Wenn ich heute Abend dazu komme, werde ich das Control (mit Source) auf meiner Homepage hinzufügen.
|
|
petermatthus1 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 20.05.10 13:42
Das mit dem UserControl werde ich mal ausprobieren, mal schauen wie ich mich da reinfinde, ist nämlich absolutes Neuland für mich.
|
|