Entwickler-Ecke
Algorithmen, Optimierung und Assembler - If then else chaos
Vamos - So 14.02.10 00:00
Titel: If then else chaos
Hallo Ihr Lieben,
und wieder muss ich mich an euren Sachverstand wenden.
Kontext:
Ich programmiere z.Zt. ein Kartenspiel (eine alte Version des Pokers) - Ich versuche als Halblaie einfach mal soweit zu kommen, wie möglich um dazu zu lernen :)
Im Moment beurteile ich bei 3 PC-Gegnern, ob diese Geld auf Ihr Blatt setzen.
Jeder Spieler hat 8 Karten, Werte: 1-8 (Sieben-Ass)
Diese werte stehen in einer Listbox (Farben spielen dort keine Rolle)
Ich habe nun versucht eine IF-THEN-ELSE-Anweisung zu kreieren, welche die stärkste Hand ermittelt:
Es gibt (HighCard), Doppel, Dreier und Quartett. - Bei HighCard, setzen die PC-Spieler nicht, erst ab einem 2er.
Ein "3"er Doppel schlägt ein "2"-er Doppel, ein Dreier schlägt ein Doppel und ein Quartett einen Dreier. Das ganze sieht bei mir Folgendermaßen aus, funktioniert aber richtig nur mit 3ern und 4ern.:
Delphi-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:
| Procedure (blabla) Begin
Begin Poch1anz :=0; Poch1wert :=0; end;
For i:= 0 to 4 do begin Showmessage(IntToStr(zahl1)); LTest.Caption:=IntToStr(Poch1anz); LTest2.Caption:=IntToStr(Poch1wert); zahl1:=StrToInt(LB1Einer.Items[i]); zahl2:=StrToInt(LB1Einer.Items[i+1]); zahl3:=StrToInt(LB1Einer.Items[i+2]); zahl4:=StrToInt(LB1Einer.Items[i+3]); if zahl1 = zahl2 then begin if poch1anz <2 then begin Poch1anz:=2; Poch1wert:=zahl1*2; end; if zahl2 = zahl3 then begin if poch1anz <3 then begin Poch1anz:=3; Poch1wert:=zahl2*3; end; if zahl3 = zahl4 then begin Poch1anz:=4; Poch1wert:=zahl3*4; end; end; end
else if zahl2 = zahl3 then begin if poch1anz <2 then begin Poch1anz:=2; Poch1wert:=zahl2*2; end; if zahl3 = zahl4 then begin if poch1anz <3 then begin Poch1anz:=3; Poch1wert:=zahl3*3; end; end; end
else if zahl3 = zahl4 then begin if poch1anz <2 then begin Poch1anz:=2; Poch1wert:=zahl3*2; end; end; end; MessageDlg('Spieler1: '+' Anzahl: '+IntToStr(Poch1anz)+' = ' +IntToStr(Poch1wert), mtInformation, [mbOK], 0); end; |
Hoffentlich sieht jemand den Fehler.
Gruß, Vamos
Delete - So 14.02.10 00:30
Zerleg den Code in Funktionen.
Vamos - So 14.02.10 00:45
Luckie hat folgendes geschrieben : |
Zerleg den Code in Funktionen. |
Das behebt doch dann aber mein Problem nicht?
Bei der Nutzung von Funktionen würde ich das nur zerstückeln... aber macht das bei knapp 30 Zeilen Sinn? Ich würde es eigentlich gern so lassen, nur eben richtig
Delete - So 14.02.10 00:54
Dann wird es aber übersichtlicher, weil du die Funktionen sprechende Namen geben kannst.
Vamos - So 14.02.10 01:03
Hat sich erledigt, Fehler gefunden.
Xion - So 14.02.10 11:16
Du musst auf jeden fall aufpassen dass du da bei dem einrücken nicht durcheinander kommst...du hast verschiedene IFs, die eigentlich hintereinander ausgeführt werden, verschieden eingerückt so dass es wie ein untergeordneter Block aussieht => verwirrend :?!?:
Vamos - So 14.02.10 13:29
Xion hat folgendes geschrieben : |
Du musst auf jeden fall aufpassen dass du da bei dem einrücken nicht durcheinander kommst...du hast verschiedene IFs, die eigentlich hintereinander ausgeführt werden, verschieden eingerückt so dass es wie ein untergeordneter Block aussieht => verwirrend :?!?: |
Oh, dabei hatte ich das Einrücken-Tutorial gelesen und mir solche Mühe gegeben ;-/
Jakob_Ullmann - So 14.02.10 14:36
Vamos hat folgendes geschrieben : |
Xion hat folgendes geschrieben : | Du musst auf jeden fall aufpassen dass du da bei dem einrücken nicht durcheinander kommst...du hast verschiedene IFs, die eigentlich hintereinander ausgeführt werden, verschieden eingerückt so dass es wie ein untergeordneter Block aussieht => verwirrend :?!?: |
Oh, dabei hatte ich das Einrücken-Tutorial gelesen und mir solche Mühe gegeben ;-/ |
Also ich weiß gerade nicht, welches Tutorial du meinst, aber entweder war das Tutorial schlecht oder du hast was falsch verstanden. Bei folgendem Ausschnitt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| zahl4:=StrToInt(LB1Einer.Items[i+3]); if zahl1 = zahl2 then begin if poch1anz <2 then begin Poch1anz:=2; <table width="98%" cellspacing="1" cellpadding="3" border="0" align="center"><tr> <td><span class="genmed"><b>Zitat:</b></span></td> </tr> <tr> <td class="quote">Poch1wert:=zahl1*2;</td> </tr></table> end; if zahl2 = zahl3 then begin if poch1anz <3 then begin Poch1anz:=3; Poch1wert:=zahl2*3; end; if zahl3 = zahl4 then begin Poch1anz:=4; Poch1wert:=zahl3*4; end; |
Die markierten
ifs sind alle dieselbe Ebene und sollten gleich eingerückt werden. So wie du es jetzt hast, könnte man annehmen, dass das zweite if mit dem Poch1wert:=... zusammen auf einer Ebene steht (was natürlich absoluter Blödsinn ist). Gut wäre z. B. sowas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| zahl4 := StrToInt(LB1Einer.Items[i + 3]); if zahl1 = zahl2 then begin if poch1anz < 2 then begin Poch1anz := 2; Poch1wert := zahl1 * 2; end; if zahl2 = zahl3 then begin if poch1anz < 3 then begin Poch1anz := 3; Poch1wert := zahl2 * 3; end; if zahl3 = zahl4 then begin Poch1anz := 4; Poch1wert := zahl3 * 4; end; |
Sodass Befehle, die gleichbedingt ausgeführt werden, auf derselben Einrückebene stehen.
Du siehst, dass sich die Anweisungen Poch1anz := ; Poch1wert := ständig wiederholen, weshalb es sinnvoll wäre, zahl als array zu deklarieren und den Code in Funktionen und Prozeduren zu gliedern.
Xion - So 14.02.10 15:01
Jakob_Ullmann hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| zahl4:=StrToInt(LB1Einer.Items[i+3]); if zahl1 = zahl2 then begin if poch1anz <2 then begin Poch1anz:=2; <table width="98%" cellspacing="1" cellpadding="3" border="0" align="center"><tr> <td><span class="genmed"><b>Zitat:</b></span></td> </tr> <tr> <td class="quote">Poch1wert:=zahl1*2;</td> </tr></table> end; if zahl2 = zahl3 then begin if poch1anz <3 then begin Poch1anz:=3; Poch1wert:=zahl2*3; end; if zahl3 = zahl4 then begin Poch1anz:=4; Poch1wert:=zahl3*4; end; |
Die markierten ifs sind alle dieselbe Ebene |
Hehe, reingefallen, stimmt garnicht ^^
Delphi-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:
| zahl4:=StrToInt(LB1Einer.Items[i+3]);
if zahl1 = zahl2 then begin if poch1anz <2 then begin Poch1anz:=2; Poch1wert:=zahl1*2; end; if zahl2 = zahl3 then begin if poch1anz <3 then begin Poch1anz:=3; Poch1wert:=zahl2*3; end; if zahl3 = zahl4 then begin Poch1anz:=4; Poch1wert:=zahl3*4; end; end; end; |
Jakob_Ullmann - So 14.02.10 15:14
Ja, du hast recht (womit erwiesen wäre, dass die Einrückung schlecht ist :P ).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!