Kartenspiel

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Ja k , benutze abjetzt diese WriteLn funktion aber die TRect Werte sind einfach falsch.

Left und Top sind am sinnlosesten, die haben 6-Stellige Werte wobei Right und Bottom nur 3 Stellige haben

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Schau dir nochmal den vorherigen Beitrag an, hatte ihn vor ein paar Minuten "ge-editet"

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Jop habe ich grade gelesen^^

Es lag an dem SCheiß - ".free" , ich habe mir gedacht wenn es überall steht das man free'n muss dann mache ich es auch , aber habe dabei vergessen das die Karten in diese Liste eingetragen werden bzw nur die Pointer dazu und wenn ich dann free machen würde wären diese Punkte sinnlos^^

Also Danke , auf sowas muss man ersmal kommen , vielen Dank ;)

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Brauche wieder hilfe^^

Beitrag von EugenE »

Hey leute

ich bekomme manchmal diesen Fehler "List index out of bounce" wenn ich das Programm erstelle/ausführe

irgendeine meiner TList's erzeugt wohl diesen Fehler
ich denke das passiert in der Prozedur KartenAufteilen aber habe extra noch die davorige Prozedur gepostet, denn erst wird SetCards danach Kartenaufteilen aufgerufen

Code: Alles auswählen

procedure TSpielfeld.SetCards;
var
   i,j,l  : Integer;
   ct     : TCardTypen;
   cTyp   : String;
   cName  : String;
   Card   : PCard;
begin
    for j := 0 to 51 do
    begin
       //l := CardList.add(TCard.Create(Self));
       New(Card);
       Card^ := TCard.Create(Self);
       CardList.add(Card);
       with Card^ do
       begin
           Parent := Self;
           DoubleBuffered := True;
           rRaster := Self.rRaster;
           Left:=Self.Width-Width;
           Top:= Self.Height-Height;
           Moveable:=false;
           ZeigeDeck:=true;
           //Spielfeld:=@Self;
           //WriteSpieler(Spieler);
       end;
    end;
 
    j := 0;
 
    for ct := ctHerz to ctPik do
    begin
        case ct of
             ctHerz: cTyp := 'herz';
             ctCaro: cTyp := 'caro';
             ctKreuz:cTyp := 'kreuz';
             ctPik:  cTyp := 'pik';
        end;
 
        for i := 2 to 14 do
        begin
            Card := CardList.Items[j];
            with Card^ do
            begin
                CardType:=ct;
                CardValue:=i;
 
                case i of
                     11: cName := 'bube';
                     12: cName := 'dame';
                     13: cName := 'koenig';
                     14: cName := 'ass'
                     else cName := IntToStr(i);
                end;
 
                CardName:=cTyp+'_'+cName;
                Inc(j);
            end;
            { with CardList...}
        end; { for }
    end; {for}
 
end;
 
procedure TSpielfeld.KartenAufteilen;
var
   i,j,l,x : Integer;
   fertig, ok: Boolean;
   Card    : PCard;
   tempCard: PCard;
   tempList: TList;
begin
   tempList := TList.Create;
   tempList.AddList(CardList);
   WriteCardList(CardList);
   fertig := false;
   ok := false;
   Randomize;
   i := Random(4);
   case i of
        0: Trumpf := ctHerz;
        1: Trumpf := ctCaro;
        2: Trumpf := ctKreuz;
        3: Trumpf := ctPik;
   end;
 
   i := 0;
   l := 0;
 
   while not fertig do
   begin
      Randomize;
 
      j := Random(tempList.Count);
      Card := tempList.Items[j];
      with Card^ do
      begin
        if not AufDerHand AND (Spieler <> Self.Spieler) then
        begin
            if l <> 0 then
            begin
                tempCard := tempList.Items[l];
                x := ((tempCard^).CardValue) - ((Card^).CardValue);
                if x < 0 then
                   x := x * (-1);
                if x > 5 then
                begin
                    ok := true;
                end;
            end
            else
                ok := true;
 
            if ok then
            begin
              l := j;
              AufDerHand:=true;
              Spieler := Self.Spieler; { Später wenn netzwerk dann anders halt ne^^ }
 
              HandList.Add(Card);
              //CardList.Pack;
              //WriteCard(Card^);
              CardList.Delete(j);
              //CardList.Remove(Card);
 
              Inc(i);
            end;
        end;
      end;
 
      if i = 6 then
         fertig := true;
   end;
 
   //Card := CardList.Items[j];
 
   { karten auf feld legen }
   i := 0;
   fertig := false;
   MussLegen := false;
   CardList.Pack;
   Randomize;
 
   while not fertig do
   begin
      Randomize;
      j := Random(tempList.Count);
      //Card:= Pointer(CardList.Items[j]);
      //WriteCard(Card^);
      Card := tempList.Items[j];
      with Card^ do
      begin
        if (Spieler <> Self.Spieler) AND (Spieler <> sp2) then
        begin
            //AufDerHand := true;
            Spieler := sp2; { Später wenn netzwerk dann anders halt ne^^ }
 
            //MouseDown(mbLeft,[ssCtrl],rRaster[((1+i)*2)-1].Rect.Left,rRaster[((1+i)*2)-1].Rect.Top);
            //Left := rRaster[((1+i)*2)-1].Rect.Left;
            //Top  := rRaster[((1+i)*2)-1].Rect.Top;
            //MouseUp(mbLeft,[ssCtrl],rRaster[((1+i)*2)-1].Rect.Left,rRaster[((1+i)*2)-1].Rect.Top);
            LegeKarte(@rRaster[((1+i)*2)-1],tempList.Items[j]);
            ZeigeDeck:= false;
 
            Inc(i);
            BringToFront;
            //WriteCard(Card^);
        end;
 
      end;
 
      if i = 6 then
         fertig := true;
   end;
 
  tempList.Free;
  CardList.Pack;
  WriteCardList(CardList);
 
  //AlignCards;
end;
Ich finde da keinen Fehler o.ä :(

Falls nötig lade ich noch alle Quellcodes hoch^^

MfG

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wiso nimmst du nicht den Debugger ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

weil ich mit dem nicht klar komme, zu blöd dafür^^

Habs gelöst^^
hab ja am anfang die TList kopiert und dann immer von der originalen Gelöscht, da es noch in der kopie drinne ( und schleife nur auf die kopie zugreif ) kam es manchmal zu diesem fehler weil es den index nicht mehr in der originalen gab^^

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

EugenE hat geschrieben:weil ich mit dem [Debugger] nicht klar komme
1. Am rechten Rand des Quelltexteditors an gewünschter Stelle einen Breakpoint setzen. Hier hält der Debugger das Programm an, wenn er die Stelle im Code erreicht.
2. Die Maus über fragliche Variablen halten ---> Der Wert der Variable wird angezeigt
3. Sich vorsichtig durch F8 - und wenn notwendig durch F7 - im Code vorantasten. Durch F8 wird jeweils nur die nächste Programmzeile ausgeführt. Dadurch kann man sich dann an die Fehlerstelle recht gut annähern.
4. Fehler beheben.

Gibt daneben noch viele andere nützliche Funktionen. Lohnt sich also, den Debugger mal zu probieren ;)

Gruß, Euklid

Antworten