Autor Beitrag
newneo
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 26.02.13 15:34 
Hallo zusammen,
Ich bin dabei mir ein Mensch Ärger Dich nicht Spiel zu schrieben. An sich läuft das spiel auch, figuren bewegen sich usw. Mein Problem besteht in meinen Spiel regelen. Ich habe eine Methode kannFigurBewegene, die jedesmal aufgerufen wird wen der würfel gedrückt wird und eine figur sich bewegen soll. Darin soll dann jedes Feld abgefragt werden ob dort eine Figur sitzt und ob diese die gleiche Farbe hatt. Hatt sie die gleiche Farbe darf sie sich nicht bewegen.

Das funkttioniert uach alles sehr gut bis zu einem punkt. Wenn dann eine oder mehrere figur im stall sind, dann funktioniert das nicht mehr da irgendwie immer ein false kommt, was ja auch richtig ist, nur das die figur die noch auf dem spielfeld ist sich bwegen kann wird dan irgendwie übersprungen. Bei den ganzen überlegungen ist mir auch noch nicht eingefallen wie ich das umgehen könnte.

Hier mal ein Auszug dami ihr hoffentlich versteht was ich meine!

Ich verzeifel da echt schon und seh vor lauter Bäumen den Wald nicht mehr!
Ich danke schonmal im voraus für die Hilfe :)

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:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
            if (spieler.Farbe == Color.Yellow)
            {
                int püppchensindimzielweg = 0;
                bool kannfigurbewegen = false;

                for (int i = 57; i <= 60; i++)
                {
                    if (this.spielbrett.Felder[i].Figuren.Count > 0)
                    {
                        püppchensindimzielweg = püppchensindimzielweg + this.spielbrett.Felder[i].Figuren.Count;

                        if (i + würfel.WürfelWert <= 60)
                        {
                            kannfigurbewegen = true;
                        }
                        else kannfigurbewegen = false;
                    }
                    else kannfigurbewegen = true;
                }

                if (this.spielbrett.Felder[41].Figuren.Count > 0 || this.spielbrett.Felder[42].Figuren.Count > 0
                        || this.spielbrett.Felder[43].Figuren.Count > 0 || this.spielbrett.Felder[44].Figuren.Count > 0)
                {
                    if (this.spielbrett.Felder[21].Figuren.Count > 0)
                    {
                        if (this.spielbrett.Felder[21].Figuren[0].Farbe == Color.Yellow)
                        {
                            kannfigurbewegen = false;
                        }
                        else kannfigurbewegen = true;
                    }
                    else kannfigurbewegen = true;
                }

                for (int i = 21; i <= 40; i++)
                {
                    int zielfeld = würfel.WürfelWert + this.spielbrett.Felder[i].Nummer;



                    if (würfel.WürfelWert == 6 && spieler.PuppeDrausen < 4)
                    {
                        // kannfigurbewegen = true;

                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = false;
                                }
                                else kannfigurbewegen = true;
                            }
                        }

                    }
                    else if (this.spielbrett.Felder[i].Figuren.Count > 0)
                    {
                        if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                        {
                            if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                            {
                                if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                {
                                    kannfigurbewegen = false;
                                }
                                else kannfigurbewegen = true;
                            }
                            else kannfigurbewegen = true;
                        }
                    }
                }

                for (int i = 1; i <= 20; i++)
                {
                    int zielfeld = würfel.WürfelWert + this.spielbrett.Felder[i].Nummer;



                    if (i <= 14)
                    {
                        if (würfel.WürfelWert == 6 && spieler.PuppeDrausen < 4)
                        {
                            // kannfigurbewegen = true;

                            if (this.spielbrett.Felder[i].Figuren.Count > 0)
                            {
                                if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                    else kannfigurbewegen = true;
                                }
                            }
                            //else kannfigurbewegen = true;
                        }
                        else if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }
                        }
                    }

                    if (i == 15)
                    {
                        int imziel = 51 + würfel.WürfelWert;
                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (i + würfel.WürfelWert <= 20)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                }
                                else if (this.spielbrett.Felder[imziel].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[imziel].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }

                        }

                    }
                    if (i == 16)
                    {
                        int imziel = 52 + würfel.WürfelWert;
                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (i + würfel.WürfelWert <= 20)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                }
                                else if (this.spielbrett.Felder[imziel].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[imziel].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }
                        }

                    }
                    if (i == 17)
                    {
                        int imziel = 53 + würfel.WürfelWert;
                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (i + würfel.WürfelWert <= 20)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                }
                                else if (this.spielbrett.Felder[imziel].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[imziel].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }
                        }
                    }
                    if (i == 18)
                    {
                        int imziel = 54 + würfel.WürfelWert;
                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (i + würfel.WürfelWert <= 20)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else if (this.spielbrett.Felder[imziel].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[imziel].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }
                        }
                    }
                    if (i == 19)
                    {
                        int imziel = 55 + würfel.WürfelWert;
                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (i + würfel.WürfelWert <= 20)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                }
                                else if (this.spielbrett.Felder[imziel].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[imziel].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }
                        }
                    }
                    if (i == 20)
                    {
                        int imziel = 56 + würfel.WürfelWert;
                        if (this.spielbrett.Felder[i].Figuren.Count > 0)
                        {
                            if (this.spielbrett.Felder[i].Figuren[0].Farbe == Color.Yellow)
                            {
                                if (i + würfel.WürfelWert <= 20)
                                {
                                    if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                                    {
                                        if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == Color.Yellow)
                                        {
                                            kannfigurbewegen = false;
                                        }
                                        else kannfigurbewegen = true;
                                    }
                                }
                                else if (this.spielbrett.Felder[imziel].Figuren.Count > 0)
                                {
                                    if (this.spielbrett.Felder[imziel].Figuren[0].Farbe == Color.Yellow)
                                    {
                                        kannfigurbewegen = false;
                                    }
                                    else kannfigurbewegen = true;
                                }
                                else kannfigurbewegen = true;
                            }
                        }
                    }

                }


                return kannfigurbewegen;
            }


Moderiert von user profile iconTh69: Code überarbeitet: "begin { } end" rauseditiert
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 26.02.13 15:42 
Zitat:
Ich verzeifel da echt schon und seh vor lauter Bäumen den Wald nicht mehr!


Bei so einem Schlangencode geht es hier uns bestimmt nicht besser.
Ich würde dir empfehlen das vielleicht mal in einzelne sauber benannte Methoden zu strukturieren. Entweder du merkst dabei schon wo das Problem liegt oder wir tun uns hier leichter dir zu helfen wenn wir dann entsprechende strukturierten Code sehen.

Hat jede Farbe sein eigenes Spielfeld? Wenn du nur ein Spielfeld hast finde ich es merkwürdig das deine Zielfelder immer den Index 57-60 haben das sollte eigentlich nur das Ziel für eine Farbe sein.
newneo Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 26.02.13 16:12 
Es gibt nur ein Spielfeld. Der index 57-60 ist nur für die Farbe Gelb, die anderen Zielfelder sind halt bis 72 aufgeteilt.
Der Code ist ja auch nur ein auszug, Darunter Folgen die andern Farben in dem gleichen stiel...

Ich werd auch mal versuchen kleinere Methoden zu schreiben ....
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Mi 27.02.13 02:24 
Ich glaube, was Ralf Jansen da meint ist, eine Saubere und getrennte Formatierung.

Ich nehme in Delphi bspw. folgendes, um bestimmte abschnitte zu markieren:
ausblenden Delphi-Quelltext
1:
//---------------------------------------------------------------------					


Eine Umgestaltung der Variablen wäre auch nicht schlecht, sowas wie "püppchensindimzielweg" finde ich persönlich viel zu lang.

Zitat:
Der Code ist ja auch nur ein auszug, Darunter Folgen die andern Farben in dem gleichen stiel...


Dann graut es mir schon langsam. Klar jeder hat sein eigenen Stil, aber wenn der Rest genau so aussieht, dann braucht jemand, der den Code garnicht kennt, ewigkeiten, um sich zurecht zu finden.
Evtl. auch alles gut kommentieren, was jeweils in der Methode gemacht wird. Alles einmal vllt. in einem Netzplan aufbereiten. Und alle schritte mal mit einem Stift und Papier auf Zeichnen, wie was gemacht wird. Wo die Wege hin führen und was passiert, wenn ein Ereignis nicht zu trifft. Wie auch immer ;-)

Das nur als Tipp am Rande...

Und wenn das nicht hilft...Code ausdrucken, den Code stück für Stück auseinander nehmen, bestimmte Stellen markieren. Etc. ;-)

Außerdem ist mir aufgefallen, das du in deinem Code immer wieder 4 stellen abstände nimmst, in nutze nur 2 stellen, das macht alles noch übersichtlicher.

Außerdem steht direkt am anfang "beginn" ich weiß nicht wie das in C# ist, aber in Delphi wird "begin" nur mit einem "n" geschrieben.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 27.02.13 11:46 
Zitat:
Ich glaube, was Ralf Jansen da meint ist, eine Saubere und getrennte Formatierung.


Nein. Ich meine Strukturierung und nicht Formatierung.

Der Codeteil ist zu lang egal wie der formatiert wird. Denn kann man aber wunderbar strukturieren da er sehr viele einzelne begrenzte Aufgaben enthält die man in eigene Methoden mit einem sprechenden Namen auslagern kann dann verschwinden aus dem eigentlichen zentralen Code die unleserlichen Details (und auch z.B. die magischen Nummern) und man hat viele einfacher zu lösende einzelne Aufgaben.

Beispiel

Zitat:
ausblenden C#-Quelltext
1:
2:
if (this.spielbrett.Felder[41].Figuren.Count > 0 || this.spielbrett.Felder[42].Figuren.Count > 0
      || this.spielbrett.Felder[43].Figuren.Count > 0 || this.spielbrett.Felder[44].Figuren.Count > 0)


Hier wird vermutlich geprüft ob sich eine Figur im Ziel befindet. Das gibt vermutlich n mal genau so für jede andere Farbe.
Das kann man wunderbar auslagern in eine Funktion die man einzeln testen kann und eben die Sicht auf das eigentliche Problem freiräumt.
Ein

ausblenden C#-Quelltext
1:
if (IsFigurImZiel(Color.Yellow))					


ist einfach besser lesbar.
newneo Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 27.02.13 13:50 
ja so wie ralf das geschrieben hatt habe ich es auch verstanden mit neu struktorieren . ne das sind die start felder und nicht die zielfelder aber ich weis so grob was gemeint ist.
xearox na das beginn steht da weil ich das aus der hilfe kopiert habe ;) .

danke schonmall für eure tips mal schaun ob ich das so hinbekomme.
newneo Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 06.03.13 15:48 
Hallo,
So nach einer Langen überlegungsphase habe ich den Code mal in drei kleine Häppchen eingeteilt und sogar kleiner hinbekommen :)

Ich habe nun volgendes Problem, wenn die Figuren auf dem Lauffeld sind, sagen wir mal Figur 1 ist auf feld 36, Figur 2 auf 37, Figur 3 auf 38 und Figur 4 auf 5. Wenn nun eine 2 Gewürfelt wird dann lass ich nach den Figuren mit der Feldnummer suchen und errechne mir daraus das ziel index. Da aber dummerweise Figur 1 ja auf feld 36 steht und das zielfeld 38 wäre kann sie sich nicht bewegen, was auch korekt ist, gibt aber das false zurück. Damit ist die abfrage auch beendet und Figur 4 wird nicht abgefragt obwohl diese sich eigentlich bewegen könnte. Mann müste doch irgendwie die möglichkeit haben erst alle 4 Figuren zu überprüfen und dann zu sagen wenn da ein true wert entahlten ist dan bevorzuge den... ??

Hier mal der Code ...

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:
public Boolean figurLaufRichtung(Color farbe)
        {
            List<Figur> figuren = new List<Figur>();
            figuren = this.spielbrett.Figuren;

            foreach (Figur figurfeld in figuren)
            {
                if (figurfeld.Farbe == farbe)
                {
                    if (figurfeld.istimStall == false)
                    {
                        int zielfeld = ZielFeldIndexBerrechnung(farbe, figurfeld.Feld.Nummer);

                        if (zielfeld != -1)
                        {
                            if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                            {
                                if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == farbe)
                                {
                                    return false;
                                }
                                else return true;
                            }
                            else return true;
                        }
                    }
                }
            }
            return false;

        }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 06.03.13 16:36 
Hallo newneo,

dann benutze dafür eine bool Variable, anstatt vorzeitig (mit return) aus der Methode zurückzukehren.
Und diese Variable fragst du dann nach der Schleife ab bzw. gibst den Wert zurück.
newneo Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 06.03.13 18:46 
hi,
Ja das hatte ich ja voher auch schon gehabt, aber wenn z.b Figur 3 (feld 4) vor Figur 4 (feld2) steht und ich dann abfrage, dann wird ja erst in die variable, figur 3 mit true bestätigt und dann kommt Figur 4 und überschreibt dies mit false, was dann wieder Falsch ist da sich ja figur 3 bewegen kann....

edit:
ich glaub hat sich erledigt. Habe einfach die abfrage in altabfrage geschoben und dies dan nochmal abfragen lassen.
Hier mal den Code hoffe das scahut richtig aus :)

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:
public Boolean figurLaufRichtung(Color farbe)
        {
            bool abfrage = false;
            bool altabfrage = false;

            List<Figur> figuren = new List<Figur>();
            figuren = this.spielbrett.Figuren;

            foreach (Figur figurfeld in figuren)
            {
                if (figurfeld.Farbe == farbe)
                {
                    if (figurfeld.istimStall == false)
                    {
                        int zielfeld = ZielFeldIndexBerrechnung(farbe, figurfeld.Feld.Nummer);

                        if (zielfeld != -1)
                        {
                            if (this.spielbrett.Felder[zielfeld].Figuren.Count > 0)
                            {
                                if (this.spielbrett.Felder[zielfeld].Figuren[0].Farbe == farbe)
                                {
                                    altabfrage = abfrage;
                                    abfrage = false;
                                }
                                else abfrage = true;
                            }
                            else abfrage = true;
                        }
                    }
                }
            }

            if (abfrage == true || altabfrage == true)
            {
                return true;
            }
            else return false;

        }