Forum: PC-Programmierung c# von kopf bis fuß


von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

Hi,

bin noch c# Anfänger und arbeite gerade das Buch "c# von Kopf bis fuß" 
durch. Ich bin jetzt angelangt bei dem ersten Workshop es geht um eine 
Hunderennbahn. Ich habe folgendes Problem.

Dieser Code steht in meinem Formular Form1.cs:

 private void button1_Click(object sender, EventArgs e)
        {

            if (label2.Text == "Tim")
            {
                if ( (Gamer[0].WetteAbgeben((int)numericUpDown1.Value, 
(int)numericUpDown2.Value)) == true)
                {
                    spiel.MeinTextbox = textBox1;
                    spiel.BeschreibungAbrufen();
                }
                else
                    MessageBox.Show("Spieler hat nicht genug Geld");
            }
            else if (label2.Text == "Tom")
...........

ich rufe die methode "wetteabgeben" auf und übergebe zwei int werte :

Dieser Code steht in einer anderen Klasse "Spieler.cs":

 public bool WetteAbgeben(int betrag, int hund)
        {
            //Setzt eine Wette und speichert sie in MeineWette
            //Liefert true, wenn der Spieler genug Geld hat
            if (betrag > 0 && betrag >= 5)
            {
                Meinewette = new Wette() { Betrag = betrag, Hund = hund, 
Wetter = this };
                return true;
            }
            else return false;
        }

diese beiden int Werte sollten eigentlich in "Betrag" und "Hund" 
eingetragen werden aber nach dieser anweisung sind sie beide immer noch 
null auch der Parameter "Wetter" ist danach auf null

von Andreas K. (scavanger)


Lesenswert?

So schlecht zu sagen, das Problem liegt glaube ich in der Klasse Wette.

> if (betrag > 0 && betrag >= 5)

Warum überprüfst du betrag auf auf grösser 0? Wenn er grösser/gleich 5 
ist ist auch grösser 0 ;-)

> if ( (Gamer[0].WetteAbgeben((int)numericUpDown1.Value,
> (int)numericUpDown2.Value)) == true)

Der klassische Anfängerfehler.
Das "== true" weglassen, da die Funktion WetteAbgeben ja schon einen 
boolschen Ausdruck zurückliefert, den brauchst du nicht nochmal zu 
überprüfen.
Was du damit eigentlich ist sagt ist
1
if (True == True)
2
...
bzw
1
if (False == True)
2
...

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

ich hab alles nochmal über den haufen geworfen und neu angefangen jetzt 
gehts schon besser aber trotzdem danke für den tip

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

mal ne andere frage ich habe im Form1.cs diesen button hier:

 private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            Gamer[0].LabelAktualisieren();
            Gamer[0].Meinewette.BeschreibungAbrufen();
        }

mir gehts es um die methode "BeschreibungAbrufen()" in der Klasse 
Wette.cs

public string BeschreibungAbrufen()
        {
            //Liefert einen String der den Wetter den gesetzten Betrag
            //und den gewetteten Hund angibt ("tim wettet 8 € auf Hund 
4").
            //Ist der Betrag null, wurde nicht gewettet ("Tim hat nicht 
gewettet");

            if (Wetter.Meinewette.Betrag == 0)
            {
                return Wetter.MeinTextbox.Text = Wetter.Name + " hat 
nicht gewettet";
            }
            else
            {
                return Wetter.MeinTextbox.Text = Wetter.Name + " wettet 
" + Wetter.Meinewette.Betrag + " € auf Hund" + Wetter.Meinewette.Hund;
            }
        }

diese Methode sollte dafür sorgen das beim Starten des Programms die 
if-Anweisung ausgeführt wird weil ja noch nicht gewettet wurde aber in 
der Textbox steht gar nichts warum erkennt das Programm nicht das in 
Betrag im Moment noch eine 0 drin steht?

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

ok habs nochmal bissle verändert aber es klappt immer noch nicht:
1
public partial class Form1 : Form
2
{
3
Windhund[] hunde = new Windhund[4];
4
Spieler[] Gamer = new Spieler[3];
5
Wette spiel = new Wette();
6
7
public Form1()
8
{
9
InitializeComponent();
10
11
Gamer[0] = new Spieler { Name = "Tim", Geld = 50, Meinewette = null, MeinRadiobutton = radioButton1, MeinTextbox = textBox1, MeinLabel = label2};
12
Gamer[1] = new Spieler { Name = "Tom", Geld = 75, Meinewette = null, MeinRadiobutton = radioButton2, MeinTextbox = textBox2, MeinLabel = label2 };
13
Gamer[2] = new Spieler { Name = "Jan", Geld = 45, Meinewette = null, MeinRadiobutton = radioButton3, MeinTextbox = textBox3, MeinLabel = label2 };
14
15
Gamer[0].LabelAktualisieren();
16
Gamer[1].LabelAktualisieren();
17
Gamer[2].LabelAktualisieren();
18
19
Gamer[0].Meinewette.BeschreibungAbrufen();
20
Gamer[1].Meinewette.BeschreibungAbrufen();
21
Gamer[2].Meinewette.BeschreibungAbrufen();
22
23
}

dabei sollen diese Anweisungen

Gamer[0].Meinewette.BeschreibungAbrufen();
Gamer[1].Meinewette.BeschreibungAbrufen();
Gamer[2].Meinewette.BeschreibungAbrufen();

Auf dem Formular diesen text hier einfügen "Spielername hat noch nicht 
gewettet" also z.B. Gamer[0] => "Tim hat noch nicht gewettet"

die Methode "BeschreibungAbrufen()" in der Klasse "Wette.cs"

sieht so aus:
1
public string BeschreibungAbrufen()
2
{
3
//Liefert einen String der den Wetter den gesetzten Betrag
4
//und den gewetteten Hund angibt ("tim wettet 8 € auf Hund 4").
5
//Ist der Betrag null, wurde nicht gewettet ("Tim hat nicht gewettet");
6
7
if (Wetter.Meinewette.Betrag == 0)
8
{
9
return Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";
10
}
11
else
12
{
13
return Wetter.MeinTextbox.Text = Wetter.Name + " wettet " + Wetter.Meinewette.Betrag + " € auf Hund" + Wetter.Meinewette.Hund;
14
}
15
}

es tut sich aber gar nichts im Formular in der Textbox obwohl Betrag ja 
noch null ist der Button "wettet" wurde noch nicht betätigt und somit 
müsste da noch 0 drinstehen irgendjemand ne idee?

von Markus E. (engelmarkus)


Lesenswert?

1
return Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";

Was soll das deiner Meinung nach bewirken?

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

wie gesagt bin noch c# anfänger ich wollte damit bewirken das in der 
jeweiligen textbox dieser string eingetragen wird

von Markus E. (engelmarkus)


Lesenswert?

Dann musst du aber das "return" weglassen... damit kannst du ein 
Ergebnis einer Funktion zurückgeben:
1
int addieren(int z1, int z2) {
2
  return z1 + z2;
3
}
4
5
int ergebnis = addieren(3, 5);
6
7
// ergebnis ist jetzt 8

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

was ist wenn ich so schreiben würde :

....
1
string botschaft;
2
3
return botschaft=Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";

würde das so gehen und sinn machen? :-)

von Markus E. (engelmarkus)


Lesenswert?

Ich weiß echt grad nicht was du willst... so vielleicht?
1
public string BeschreibungAbrufen() {
2
  if (Wetter.Meinewette.Betrag == 0) {
3
    Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";
4
    return Wetter.Name + " hat nicht gewettet";
5
  }
6
  // ...
7
}
Das setzt jetzt zum einen den Text in der "MeinTextbox" auf "... hat 
nicht gewettet" und gibt danach diesen string zusätzlich noch zurück.


Für eine normale Zuweisung an eine Variable brauchst du kein "return". 
Genauso wie dus hier ja auch gemacht hast:
1
Wette spiel = new Wette();

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Angehängte Dateien:

Lesenswert?

alles im programm läuft bis auf diesen scheiss ich weiß net was der von 
mir will (siehe screenshot)

von Markus E. (engelmarkus)


Lesenswert?

Sagt er doch... "Wetter ist NULL" :) .
1
Spieler Wetter;
2
3
Wetter.MeineWette.Betrag = 0;
Kann nicht gehen, weil Wetter nur eine Referenz ist, aber auf noch nix 
"zeigt". Neue Objekte von Klassen musst du immer so erstellen:
1
Spieler Wetter = new Spieler();
Erst jetzt darfst du "Wetter" auch verwenden.

Das sollte in dem Buch aber auch erklärt werden :) .

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

nö geht leider immer noch nicht alles im Programm läuft bis auf diesen 
scheiss ich könnte kotzen ich will nur die variable "Betrag" für jeden 
Gamer abfragen und dann einen string an die zugehörige textbox senden 
ungefähr so:
1
Gamer[0].MeinTextbox.Text = Gamer[0].Meinewette.BeschreibungAbrufen();
2
            Gamer[1].MeinTextbox.Text = Gamer[1].Meinewette.BeschreibungAbrufen();
3
            Gamer[2].MeinTextbox.Text = Gamer[2].Meinewette.BeschreibungAbrufen();

aber es kommt immer dieser nullref. fehler

ps: hab deinen vorschlag ausprobiert aber der fehler bleibt

von Markus E. (engelmarkus)


Lesenswert?

Vielleicht liegts jetzt daran:
1
Meinewette = null
Ganz oben, wo du die neuen Spieler erzeugst...

von Andreas K. (scavanger)


Lesenswert?

Genau,

Wetter.Meinewette hast du beim Programmstart auf NULL festgelegt, damit 
existiert Wetter.Meinewette.Betrag gar nicht, also kann sie auch nicht 0 
sein, daher die Fehlermeldung.

Du musst überprüfen ub das Objekt null ist bevor auf auf die Eigenschaft 
zugreifst, also muss die if Abfrage in deinen Screenshop so laufen:
1
if (Wetter.Meinewette == null || Wetter.Meinewette.Betrag == 0)
2
...

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

vielleicht bringt es was wenn ich den ganzen code für die beiden klassen 
uploade die soviel ärger machen ich weiß net mehr weiter :-)
1
namespace hunderennen
2
{
3
    
4
    public partial class Form1 : Form
5
    {
6
        Windhund[] hunde = new Windhund[4];
7
        Spieler[] Gamer = new Spieler[3];   
8
        Wette spiel = new Wette();
9
        
10
        public Form1()
11
        {
12
            InitializeComponent();
13
14
            Gamer[0] = new Spieler { Name = "Tim", Geld = 50, Meinewette = spiel, MeinRadiobutton = radioButton1, MeinTextbox = textBox1, MeinLabel = label2};
15
            Gamer[1] = new Spieler { Name = "Tom", Geld = 75, Meinewette = spiel, MeinRadiobutton = radioButton2, MeinTextbox = textBox2, MeinLabel = label2 };
16
            Gamer[2] = new Spieler { Name = "Jan", Geld = 45, Meinewette = spiel, MeinRadiobutton = radioButton3, MeinTextbox = textBox3, MeinLabel = label2 };
17
18
            Gamer[0].LabelAktualisieren();
19
            Gamer[1].LabelAktualisieren();
20
            Gamer[2].LabelAktualisieren();
21
22
            Gamer[0].MeinTextbox.Text = Gamer[0].Meinewette.BeschreibungAbrufen();
23
            Gamer[1].MeinTextbox.Text = Gamer[1].Meinewette.BeschreibungAbrufen();
24
            Gamer[2].MeinTextbox.Text = Gamer[2].Meinewette.BeschreibungAbrufen();
25
            
26
        }
27
28
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
29
        {
30
            Gamer[0].LabelAktualisieren();
31
        }
32
33
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
34
        {
35
            Gamer[1].LabelAktualisieren(); 
36
        }
37
38
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
39
        {
40
            Gamer[2].LabelAktualisieren();
41
        }
42
43
        private void button1_Click(object sender, EventArgs e)
44
        {
45
            bool spielerhatgeldjaodernein;
46
          
47
            if (label2.Text == "Tim")
48
            {
49
                spielerhatgeldjaodernein=Gamer[0].WetteAbgeben((int)numericUpDown1.Value, (int)numericUpDown2.Value);
50
               // MessageBox.Show(Gamer[0].Meinewette.Betrag.ToString() + Gamer[0].Meinewette.Hund.ToString());
51
52
                if (spielerhatgeldjaodernein == true)
53
                {
54
                    Gamer[0].Meinewette.BeschreibungAbrufen();
55
                    Gamer[0].LabelAktualisieren();
56
                }
57
                else
58
                {
59
                    Gamer[0].MeinTextbox.Text = "Spieler hat nicht genug Geld";
60
                    Gamer[0].LabelAktualisieren();
61
                }
62
            }
63
            else if (label2.Text == "Tom")
64
            {
65
                spielerhatgeldjaodernein = Gamer[1].WetteAbgeben((int)numericUpDown1.Value, (int)numericUpDown2.Value);
66
                // MessageBox.Show(Gamer[0].Meinewette.Betrag.ToString() + Gamer[0].Meinewette.Hund.ToString());
67
68
                if (spielerhatgeldjaodernein == true)
69
                {
70
                    Gamer[1].Meinewette.BeschreibungAbrufen();
71
                    Gamer[1].LabelAktualisieren();
72
                }
73
                else
74
                {
75
                    Gamer[1].MeinTextbox.Text = "Spieler hat nicht genug Geld";
76
                    Gamer[1].LabelAktualisieren();
77
                }
78
            }
79
            else if (label2.Text == "Jan")
80
            {
81
                spielerhatgeldjaodernein = Gamer[2].WetteAbgeben((int)numericUpDown1.Value, (int)numericUpDown2.Value);
82
                // MessageBox.Show(Gamer[0].Meinewette.Betrag.ToString() + Gamer[0].Meinewette.Hund.ToString());
83
84
                if (spielerhatgeldjaodernein == true)
85
                {
86
                    Gamer[2].Meinewette.BeschreibungAbrufen();
87
                    Gamer[2].LabelAktualisieren();
88
                }
89
                else
90
                {
91
                    Gamer[2].MeinTextbox.Text = "Spieler hat nicht genug Geld";
92
                    Gamer[2].LabelAktualisieren();
93
                }
94
            }
95
           
96
        }
97
98
        private void button2_Click(object sender, EventArgs e)
99
        {
100
            hunde[0] = new Windhund { Bild = pictureBox2 };
101
            hunde[1] = new Windhund { Bild = pictureBox3 };
102
            hunde[2] = new Windhund { Bild = pictureBox4 };
103
            hunde[3] = new Windhund { Bild = pictureBox5 };
104
105
            bool laeuft = false;
106
            
107
108
            while (laeuft == false)
109
            {
110
                for (int i = 0; i <= 3; i++)
111
                {
112
                    laeuft = hunde[i].Laufen();
113
114
                    if (laeuft)
115
                    {
116
                        if (i == 0)
117
                        { i++; } //weil sonst wurde in der messagbox Hund 0 rauskommen
118
119
                        for (int s = 0; s < Gamer.Length; s++)
120
                        {
121
                            Gamer[s].Einkassieren(i);
122
                            Gamer[s].LabelAktualisieren();
123
                        }
124
                        
125
                        MessageBox.Show("Hund Nummer:  " + i + " hat gewonnen !");
126
127
                        for (int m = 0; m <= 3; m++)
128
                        {
129
                            hunde[m].StartpositionEinnehmen();
130
                        }
131
                                              
132
                        break;
133
                    }//ende if
134
                }//ende for
135
            }//ende while
136
        }
137
138
    }
139
}

1
namespace hunderennen
2
{
3
    public class Wette
4
    {
5
        public int Betrag; //der gesetzte Geldbetrag
6
        public int Hund; // die Nummer des gewetteten Hundes
7
        public Spieler Wetter; //der wettende Spieler
8
        
9
10
        public string BeschreibungAbrufen()
11
        {         
12
            //Liefert einen String der den Wetter den gesetzten Betrag
13
            //und den gewetteten Hund angibt ("tim wettet 8 € auf Hund 4").
14
            //Ist der Betrag null, wurde nicht gewettet ("Tim hat nicht gewettet");  
15
            string botschaft;
16
17
            if (Wetter.Meinewette == null || Wetter.Meinewette.Betrag == 0)
18
            {                
19
                botschaft = Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";
20
                return botschaft;
21
            }
22
            else
23
            {
24
                botschaft = Wetter.MeinTextbox.Text = Wetter.Name + " wettet " + Wetter.Meinewette.Betrag + " € auf Hund " + Wetter.Meinewette.Hund;
25
                return botschaft;
26
            }  
27
           
28
29
                             
30
        }
31
32
        public int Auszahlen(int sieger)
33
        {           
34
            //der parameter ist der sieger des rennens. gewann der hund,
35
            //wird der gewettete betrag zurückgeliefert, andernfalls die
36
            //negation des gewettetn betrags
37
            if (Wetter.Meinewette.Hund == sieger)
38
            {
39
                int gewinn;
40
                return gewinn = Wetter.Geld + Wetter.Meinewette.Betrag;
41
            }
42
            else
43
            {
44
                int verlust;
45
                return verlust = Wetter.Geld - Wetter.Meinewette.Betrag;
46
            }
47
        }
48
    }
49
}

alles im Programm funktioniert bis auf diese Methode 
"BeschreibungAbrufen()"

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Scheint ja n tolles Buch zu sein.

Was ist denn die aktuelle Fehlermeldung?

von Lasse S. (cowz) Benutzerseite


Lesenswert?

So, ich hab nochmal drüber geguckt:
1
if (Wetter.Meinewette == null || Wetter.Meinewette.Betrag == 0)
2
   {                
3
      botschaft = Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";
4
      return botschaft;
5
   } else ...

Was passiert denn, wenn Wetter == null ist? Und das ist doch, soweit ich 
das sehe (die Klasse Spieler fehlt) hier der Fall, oder?

Gruß
CowZ

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

das buch is eigentlich nicht schlecht nur nach ein paar wenigen kapiteln 
kommt das erste große projekt wo auch sachen drankommen die nicht im 
buch erklärt wurden da musste ich ds inet zu rate ziehen für den 
workshop gibts eben keine musterlösung aber jetzt sitz ich schon solange 
an der dran das will ich unbedingt rauskriegen  :-)

von Andreas K. (scavanger)


Lesenswert?

1
            string botschaft;
2
3
            if (Wetter.Meinewette == null || Wetter.Meinewette.Betrag == 0)
4
            {                
5
                botschaft = Wetter.MeinTextbox.Text = Wetter.Name + " hat nicht gewettet";
6
                return botschaft;
7
            }
8
            else
9
            {
10
                botschaft = Wetter.MeinTextbox.Text = Wetter.Name + " wettet " + Wetter.Meinewette.Betrag + " € auf Hund " + Wetter.Meinewette.Hund;
11
                return botschaft;
12
            }

Da kann gar nicht funktionieren, lass die Hilfsvariablen weg, sondern 
gib den String zurück. Und die Textbox hat in der Klasse nichts 
verloren.

z.B. so:
1
return Wetter.Name + " hat nicht gewettet";

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

ja das mit der textbox stimmt die hat da wirklich nix zu suchen aber ich 
hab mal gedebuggt fogendes passiert:

wenn in der initialisierung Meinewette=null ist

kommt der fehler schon beim aufruf der methode
1
Gamer[0].MeinTextbox.Text = Gamer[0].Meinewette.BeschreibungAbrufen();

wenn die Initialisierung auf Meinewette=spiel oder Meinewette= new 
Wette()
geändert wird kommt der fehler erst bei der if abfrage:
1
if (Wetter.Meinewette == null || Wetter.Meinewette.Betrag == 0)

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

ok ich habs jetzt:
1
public Form1()
2
        {
3
            InitializeComponent();
4
5
            Gamer[0] = new Spieler { Name = "Tim", Geld = 50, Meinewette = null, MeinRadiobutton = radioButton1, MeinTextbox = textBox1, MeinLabel = label2};
6
            Gamer[1] = new Spieler { Name = "Tom", Geld = 75, Meinewette = null, MeinRadiobutton = radioButton2, MeinTextbox = textBox2, MeinLabel = label2 };
7
            Gamer[2] = new Spieler { Name = "Jan", Geld = 45, Meinewette = null, MeinRadiobutton = radioButton3, MeinTextbox = textBox3, MeinLabel = label2 };
8
9
           
10
            for (int i = 0; i <  Gamer.Length; i++)
11
            {
12
                Gamer[i].LabelAktualisieren(); 
13
            }
14
            
15
            for (int s = 0; s < Gamer.Length; s++)
16
            {
17
                Gamer[s].Meinewette = new Wette();
18
                Gamer[s].WetteAbgeben(Gamer[s].Meinewette.Betrag, Gamer[s].Meinewette.Betrag);
19
                Gamer[s].Meinewette.BeschreibungAbrufen(); 
20
            }
21
            
22
        }

ich weiß das in der methode die Gui textbox nicht hätte beschrieben 
werden sollen aber in dem workshop ging es eben darum von anderen 
klassen diesen spagat zu der Gui Klasse Form1.cs zu machen und ja ich 
weiß dafür is OOB Pragrammieren eigentlich net gedacht bitte nicht 
gleich auf den deckel hauen ich bin nur froh das es jetzt geht.

wenns noch interessiert habe es durch debuggen rausbekommen als aller 
erstes ist diese Initialisierung nicht falsch "Meinewette = null"

aber bevor man methoden mit dieser instanz aufrufen kann  ist diese 
anweisung entscheidend:

Gamer[s].Meinewette = new Wette();

ich habe immer noch die gleiche abfrage in der methode
if (Wetter.Meinewette.Betrag == 0)

nur nach der methode wetteabgeben sind die gamer und damit auch wetter 
erst vorhanden und initialisiert und erst jetzt kann ich den betrag 
abfragen also gute nacht ich bin k.o. :-)

von Andreas K. (scavanger)


Lesenswert?

Na dann, Glückwunsch!

ja, GUI Elemnte von anderen Klassen verändern zu lassen ist "Bäh".

Noch was:
1
            for (int i = 0; i <  Gamer.Length; i++)
2
            {
3
                Gamer[i].LabelAktualisieren(); 
4
            }

Nicht schön, dafür gibt's die foreach-Schleife:
1
foreach (Spieler gamer in Gamer)
2
   gamer.LabelAktualisieren();

Gilt natürlich auch für die for-Schleife darunter...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.