RosettaCodeData/Task/Playing-cards/Delphi/playing-cards.delphi

126 lines
2.2 KiB
Plaintext

program Cards;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
TPip = (pTwo, pThree, pFour, pFive, pSix, pSeven, pEight, pNine, pTen, pJack, pQueen, pKing, pAce);
TSuite = (sDiamonds, sSpades, sHearts, sClubs);
const
cPipNames: array[TPip] of string = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');
cSuiteNames: array[TSuite] of string = ('Diamonds', 'Spades', 'Hearts', 'Clubs');
type
TCard = class
private
FSuite: TSuite;
FPip: TPip;
public
constructor Create(aSuite: TSuite; aPip: TPip);
function ToString: string; override;
property Pip: TPip read FPip;
property Suite: TSuite read FSuite;
end;
TDeck = class
private
FCards: TList;
public
constructor Create;
destructor Destroy; override;
procedure Shuffle;
function Deal: TCard;
function ToString: string; override;
end;
{ TCard }
constructor TCard.Create(aSuite: TSuite; aPip: TPip);
begin
FSuite := aSuite;
FPip := aPip;
end;
function TCard.ToString: string;
begin
Result := Format('%s of %s', [cPipNames[Pip], cSuiteNames[Suite]])
end;
{ TDeck }
constructor TDeck.Create;
var
pip: TPip;
suite: TSuite;
begin
FCards := TList.Create;
for suite := Low(TSuite) to High(TSuite) do
for pip := Low(TPip) to High(TPip) do
FCards.Add(TCard.Create(suite, pip));
end;
function TDeck.Deal: TCard;
begin
Result := FCards[0];
FCards.Delete(0);
end;
destructor TDeck.Destroy;
var
i: Integer;
c: TCard;
begin
for i := FCards.Count - 1 downto 0 do begin
c := FCards[i];
FCards.Delete(i);
c.Free;
end;
FCards.Free;
inherited;
end;
procedure TDeck.Shuffle;
var
i, j: Integer;
temp: TCard;
begin
Randomize;
for i := FCards.Count - 1 downto 0 do begin
j := Random(FCards.Count);
temp := FCards[j];
FCards.Delete(j);
FCards.Add(temp);
end;
end;
function TDeck.ToString: string;
var
i: Integer;
begin
for i := 0 to FCards.Count - 1 do
Writeln(TCard(FCards[i]).ToString);
end;
begin
with TDeck.Create do
try
Shuffle;
ToString;
Writeln;
with Deal do
try
Writeln(ToString);
finally
Free;
end;
finally
Free;
end;
Readln;
end.