Einzelnen Beitrag anzeigen

Benutzerbild von zecke
zecke

Registriert seit: 17. Jan 2004
494 Beiträge
 
Turbo Delphi für Win32
 
#1

showmessage beeinflusst integer-wert eines arrays? niemals..

  Alt 6. Mär 2007, 18:54


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.
mfg zecke
  Mit Zitat antworten Zitat