Also ich glaube, ich habe noch nie so auf dem Schlauch gestanden, wie jetzt
Ich bastel zur Zeit nebenbei an einem Pokerspielchen herum. Da kommt wieder ein Problem, aber dazu später mehr.
Meine 1. Frage: Delphi (Turbo Delphi) bearbeitet doch Funktion nach Funktion durch oder? Wenn das nicht so ist (Das wäre eine Überraschung für mich), kann das eine Fehlerquelle sein, ansonsten fällt mir Nichts mehr ein...
Ich habe einen Typ TKarte, mit verschiedenen Variablen, in die ich per Zufallsgenerator die Werte hineinlade. Das funktioniert einwandfrei. Nach einem Päärchen und einem Flush zu schauen, funktioniert auch schon zuverlässig. Jetzt bin ich bei der Erkennung eines Drillings.
Ich habe eine Funktion in der ich auf einen Drilling prüfe. Wenn das der Fall ist, wird ein true ausgegeben (bool'sche Funkion). Ansonsten bleibt das Ergebnis false.
Innerhalb der Funktion hatte ich zu Testzwecken ein Showmessage-Befehl, der mir Zwischenwerte anzeigt. Das funktionierte dann einwandfrei, also die Erkennung eines Drillings. Kaum nehme ich lediglich den Showmessage-Befehl heraus, bekomme ich plötzlich bei der Funktion immer ein true zurück...
Das ist komisch, sehr komisch. zum nachvollziehen, die relevanten Stellen des Codes:
Delphi-Quellcode:
type
TKartenWert = 1..13; // 1 = AS, 11 = Bube, 12 = Dame, 13 = König
TKartenFarbe = (kfKaro, kfHerz, kfPik, kfKreuz);
TKartenPosition = 1..5;
TKarte = class(TObject)
private
FWert: TKartenWert;
FFarbe: TKartenFarbe;
FPosition: TKartenPosition;
FUsedCount: Integer;
FUsedBool: Boolean;
FUsedPosition: Boolean;
public
constructor Create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
property Wert: TKartenWert read FWert write FWert;
property Farbe: TKartenFarbe read FFarbe write FFarbe;
property Position: TKartenPosition read FPosition write FPosition;
property UsedCount: Integer read FUsedCount write FUsedCount;
property UsedBool: Boolean read FUsedBool write FUsedBool;
property UsedPosition: Boolean read FUsedPosition write FUsedPosition;
end;
var
Form1: TForm1;
ABlatt: Array[1..5] of TKarte;
AsBlatt: Array[1..5] of TKarte;
PairOneCard,PairTwoCard,UsedCountSumme: Integer;
PairOneCard2,PairTwoCard2,UsedWertSumme,RFarbe: Integer;
ThreeCard1,ThreeCard2,ThreeCard3: Integer;
Delphi-Quellcode:
constructor TKarte.create(Wert : TKartenWert;Farbe : TKartenFarbe;Position : TKartenPosition);
begin
inherited create;
FWert := Wert;
FPosition := Position;
FFarbe := Farbe;
end;
Hier die Funktion zum Testen des Drillings (hier das showmessage auskommentiert):
Delphi-Quellcode:
function isThreeOfAKind():boolean;
var a,b :integer;
begin
ThreeCard1:=0;
ThreeCard2:=0;
ThreeCard3:=0;
UsedCountSumme:=0;
for a:= 1 to 5 do begin
ABlatt[a].UsedCount:=0;
ABlatt[a].UsedBool:=false;
ABlatt[a].UsedPosition:=false;
end;
for a := 1 to 5 do begin
for b := 1 to 5 do begin
if ((ABlatt[a].Wert = ABlatt[b].Wert)and(ABlatt[a].Position <> ABlatt[b].Position)) then
begin
ABlatt[a].UsedCount:=(ABlatt[a].UsedCount+1);
ABlatt[b].UsedCount:=(ABlatt[b].UsedCount+1);
end
end;
end;
for a:=1 to 5 do begin
if (ABlatt[a].UsedCount)=4 then
begin
ABlatt[a].UsedBool:=true;
end
end;
for a:=1 to 5 do begin
if (ABlatt[a].UsedBool=true) then
begin
ThreeCard1:=a;
ABlatt[a].UsedBool:=false;
break;
end;
end;
for a:=1 to 5 do begin
if (ABlatt[a].UsedBool=true) then
begin
ThreeCard2:=a;
ABlatt[a].UsedBool:=false;
break;
end;
end;
for a:=1 to 5 do begin
if (ABlatt[a].UsedBool=true) then
begin
ThreeCard3:=a;
ABlatt[a].UsedBool:=false;
break;
end;
end;
{showmessage(inttostr(ABlatt[1].UsedCount)+' '+
inttostr(ABlatt[2].UsedCount)+' '+
inttostr(ABlatt[3].UsedCount)+' '+
inttostr(ABlatt[4].UsedCount)+' '+
inttostr(ABlatt[5].UsedCount)); }
if ((ThreeCard1>0)and(ThreeCard2>0)and(ThreeCard3>0)) then
begin
for a:=1 to 5 do
begin
UsedCountSumme:=UsedCountSumme+ABlatt[a].UsedCount;
end;
if UsedCountSumme=12 then
begin
result:=true;
end else
begin
result:=false;
end;
end;
end;
Die Funktion rufe ich so auf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
drawKarten(); // die Karten werden per random zugeordnet. Doppelte etc. alles berücksichtigt, hier
// kann der Fehler nicht sein.
if isOnePair()=true then
begin
showmessage('Ein Paar!');
end;
if isFlush()=true then
begin
showmessage('Ein Flush!');
end;
if isThreeOfAKind()=true then
begin
showmessage('Ein Drilling!');
end;
end;
Nehme ich also das Showmessage in der isThreeOfAKind()-function heraus, bekomme ich die Meldung "Ein Drilling!"
immer, egal ob ein Drilling offen liegt oder nicht. Lasse ich das showmessage auskommentiert, bekomme ich nur "Ein Drilling!", wenn wirklich einer da liegt.
So kurios... ich steh' total auf dem Schlauch... bin dankbar für jeden Tipp
ps: die Werte werden auch von anderen Funktionen genutzt, aber wie am Anfang der Funktion zu sehen, setze ich alle Werte auf 0 zurück um zu prüfen, was auf dem Tisch liegt.