Autor |
Beitrag |
Vamos
      
Beiträge: 44
|
Verfasst: So 14.02.10 00:00
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.:
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
Zuletzt bearbeitet von Vamos am So 14.02.10 00:47, insgesamt 1-mal bearbeitet
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 14.02.10 00:30
Zerleg den Code in Funktionen.
|
|
Vamos 
      
Beiträge: 44
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 14.02.10 00:54
Dann wird es aber übersichtlicher, weil du die Funktionen sprechende Namen geben kannst.
|
|
Vamos 
      
Beiträge: 44
|
Verfasst: So 14.02.10 01:03
Hat sich erledigt, Fehler gefunden.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Vamos 
      
Beiträge: 44
|
Verfasst: So 14.02.10 13:29
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 14.02.10 15:01
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 14.02.10 15:14
Ja, du hast recht (womit erwiesen wäre, dass die Einrückung schlecht ist  ).
|
|
|