Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#17

Re: Skatblatt darstellen durch Random?

  Alt 11. Nov 2009, 14:23
Delphi-Quellcode:
Type
  TSkatKarte = (
    skKaro7, skKaro8, skKaro9, skKaro10, skKaroBube, skKaroDame, skKaroKoenig, skKaroAs,
    skHerz7, skHerz8, skHerz9, skHerz10, skHerzBube, skHerzDame, skHerzKoenig, skrzAs,
    skPik7, skPik8, skPik9, skPik10, skPikBube, skPikDame, skPikKoenig, skPikAs,
    skKreuz7, skKreuz8, skKreuz9, skKreuz10, skKreuzBube, skKreuzDame, skKreuzKoenig, skKreuzAs);
  TSkatBlatt = Set of TSkatKarte;
  TSkatFarbe = (sfKaro, sfHerz, sfPik, sfKreuz);
  TSkatWert = (sw7, sw8, sw9, sw10, swBube, swDame, swKoenig, swAs);

Const sbVollesBlatt = [skKaro7..skKreuzAs];
  ssFarbe: Array[TSkatFarbe] of String = ('Karo', 'Herz', 'Pik', 'Kreuz');
  ssWert: Array[TSkatWert] of String = ('7', '8', '9', '10', 'Bube', 'Dame', 'Koenig', 'As');

Function Skat_Ziehe(Var Blatt: TSkatBlatt): TSkatKarte;
  Var K: TSkatKarte;
    i: Integer;

  Begin
    If Blatt = [] Then Raise Exception.Create('keine Karten vorhanden');
    i := 0;
    For K := skKaro7 to skKreuzAs do If K in Blatt Then Inc(i);
    i := Random(i);
    Result := TSkatKarte(-1);
    Repeat
      Inc(Result);
      While not (Result in Blatt) do Inc(Result);
      Dec(i);
    Until i < 0;
    Exclude(Blatt, Result);
  End;

Function Skat_Farbe(Karte: TSkatKarte): TSkatFarbe;
  Begin
    Result := TSkatFarbe(Ord(Karte) div 8);
  End;

Function Skat_Wert(Karte: TSkatKarte): TSkatWert;
  Begin
    Result := TSkatWert(Ord(Karte) mod 8);
  End;

Function Skat_String(Karte: TSkatKarte): String;
  Begin
    Result := ssFarbe[Skat_Farbe(Karte)] + ' ' + ssWert[Skat_Wert(Karte)];
  End;

Procedure TForm1.FormCreate(Sender: TObject);
  Var i: Integer;
    Blatt: TSkatBlatt;
    Karte: TSkatKarte;

  Begin
    Randomize;
    Blatt := sbVollesBlatt;
    For i := 1 to 4 do Begin
      Karte := Skat_Ziehe(Blatt);
      Memo1.Lines.Add(Skat_String(Karte));
    End;
  End;
Schneller geht es nur, wenn man das SET z.B. gegen ein Boolean-Array ersetzt,
aber vom Speicher her, ist dieses das Optimalste, was geht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat