Autor Beitrag
Vamos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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.:

ausblenden volle Höhe 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

//ermitteln der stärksten Hand
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]); //LB1Einer.Items
    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



BeitragVerfasst: So 14.02.10 00:30 
Zerleg den Code in Funktionen.
Vamos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: So 14.02.10 00:45 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: So 14.02.10 00:54 
Dann wird es aber übersichtlicher, weil du die Funktionen sprechende Namen geben kannst.
Vamos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: So 14.02.10 01:03 
Hat sich erledigt, Fehler gefunden.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: So 14.02.10 13:29 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 14.02.10 14:36 
user profile iconVamos hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 14.02.10 15:01 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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 ^^

ausblenden 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;

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 14.02.10 15:14 
Ja, du hast recht (womit erwiesen wäre, dass die Einrückung schlecht ist :P ).