Code:
type
TSuit = (Spade, Heart, Club, Diamond);
TNumber = (Card2, Card3, Card4, Card5, Card6,
Card7, Card8, Card9, Card10, Jack, Queen, King, Ace);
TCard = record
Suit: TSuit;
Number: TNumber;
end;
TDeck = array[0..51] of TCard;
var
Deck: TDeck;
procedure ResetDeck;
var
I, J, K: Integer;
Suit: TSuit;
Number: TNumber;
begin
I := 0;
for J := 0 to 3 do
for K := 0 to 12 do
begin
Deck[I].Suit := TSuit(J);
Deck[I].Number := TNumber(K);
Inc(I);
end;
end;
function RandIntArr(L: integer): TIntegerArray;
var
I, J, H, C: integer;
RArr: TPointArray;
begin
SetLength(RArr, 1);
RArr[0] := Point(0, L - 1);
SetLength(Result, L);
C := 0;
while (Length(RArr) > 0) do
begin
J := Random(Length(RArr));
Result[C] := RandomRange(RArr[J].X, RArr[J].Y);
if (not ((Result[C] = RArr[J].X) or (Result[C] = RArr[J].Y))) then
begin
SetLength(RArr, Length(RArr) + 1);
RArr[High(RArr)] := Point(Result[C] + 1, RArr[J].Y);
RArr[J].Y := Result[C] - 1;
end else
begin
if ((Result[C] = RArr[J].X) and (Result[C] = RArr[J].Y)) then
begin
H := High(RArr);
for I := J + 1 to H do
RArr[I - 1] := RArr[I];
SetLength(RArr, Length(RArr) - 1);
Inc(C);
Continue;
end;
if (Result[C] = RArr[J].X) then
Inc(RArr[J].X);
if (Result[C] = RArr[J].Y) then
Dec(RArr[J].Y);
end;
Inc(C);
end;
end;
procedure Shuffle;
var
I: integer;
Temp: TIntegerArray;
TempDeck: TDeck;
begin
Temp := RandIntArr(52);
for I := 0 to 51 do
TempDeck[I] := Deck[Temp[I]];
Deck := TempDeck;
end;
function SuitToStr(Suit: TSuit): string;
begin
case Suit of
Spade: Result := 'Spade';
Heart: Result := 'Heart';
Club: Result := 'Club';
Diamond: Result := 'Diamond';
end;
end;
function NumToStr(Num: TNumber): string;
begin
case Num of
Jack: Result := 'Jack';
Queen: Result := 'Queen';
King: Result := 'King';
Ace: Result := 'Ace';
else
Result := IntToStr(Integer(Num) + 2);
end;
end;
procedure DebugDeck;
var
I: integer;
begin
WriteLn('Deck - ');
for I := 0 to 51 do
WriteLn(' Suit: ' + SuitToStr(Deck[I].Suit) + ', Number: ' + NumToStr(Deck[I].Number));
WriteLn('');
end;
begin
ResetDeck;
DebugDeck;
Shuffle;
DebugDeck;
end.