Unit CardDek;
interface
uses ptccrt;
Type
CardSuite = (Clubs, Diamonds, Heart, Spade);
CardValue = (Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace);
CardRecord = record
Value : CardValue;
Suite : CardSuite;
BlackJackValue:Integer;
CardSelected:boolean;
end;
CardDeck = record
Card : CardRecord;
Dealt : boolean;
end;
DeckofCards = array[0..51] of carddeck;
Hand = array[0..9] of cardrecord;
var
SuiteCounter : CardSuite;
ValueCounter : CardValue;
Deck : DeckofCards;
DealerHand,PlayerHand: Hand;
Cardname:array[Two..Ace] of string;
CardSuiteName:array[Clubs..Spade] of string;
Function GetcardName(Card:CardRecord):String;
Procedure InitDeck;
Procedure DrawTextCard(Card:CardRecord; Xpos,YPos:Integer);
Function GetACard:Integer;
Procedure CopyCard(Index:Integer;var ACard:Cardrecord);
Function CharLen(Ch:Char;Count:Integer):String;
{for building hands for testing}
Function getTheCardvalue(v:cardvalue):integer;
function GetAnotherSuit(suit:Cardsuite):integer;
implementation
{Cardname:array[Two..Ace] of string;
CardSuiteName:array[Clubs..Spade] of string;}
Function CharLen(Ch:Char;Count:Integer):String;
var
s:string;
J:integer;
begin
S := '';
For J := 1 to Count do
S:= s+ch;
CharLen := S;
end;
Function GetcardName(Card:CardRecord):String;
var
S:String;
begin
S := CardName[Card.Value]+' of '+CardSuiteName[Card.Suite];
GetCardName := S;
end;
Procedure CopyCard(Index:Integer;var ACard:Cardrecord);
Begin
Acard.value := Deck[index].card.value;
Acard.Suite := Deck[index].card.suite;
Acard.BlackJackValue := Deck[index].card.blackjackvalue;
end;
Procedure InitDeck;
var
a:integer;
begin
CardSuiteName[Clubs] := 'Clubs ';
CardSuiteName[Diamonds] := 'Diamonds';
CardSuiteName[Heart] := 'Hearts';
CardSuiteName[Spade] := 'Spades ';
CardName[Two] := '2';
CardName[Three] := '3';
Cardname[Four] := '4';
CardName[Five] := '5';
CardName[Six] := '6';
CardName[Seven] := '7';
CardName[Eight] := '8';
CardName[Nine] := '9';
CardName[Ten] := '10';
CardName[Jack] := 'Jack';
CardName[Queen] := 'Queen';
CardName[King] := 'King';
CardName[Ace] := 'Ace';
Fillchar(deck,sizeof(deck),0);
Fillchar(DealerHand,sizeof(dealerhand),0);
Fillchar(PlayerHand,sizeof(Playerhand),0);
a := 0;
For SuiteCounter :=Clubs to Spade do
Begin
For ValueCounter := Two to Ace do
Begin
Deck[a].Card.Suite := SuiteCounter;
Deck[A].Card.Value := ValueCounter;
Case ValueCounter of
Two..Ten:Deck[a].Card.BlackJackValue := ord(ValueCounter)+2;
Jack..King:Deck[a].Card.BlackjackValue := 10;
Ace:Deck[a].Card.BlackJackValue := 11;
end;
a:=a+1;
End;
end;
end;
Procedure DrawTextCard(Card:CardRecord; Xpos,YPos:Integer);
var
s:string;
begin
TextBackground(15);
Case Card.suite of
Clubs, Spade:Textcolor(0);
Heart,Diamonds:TextColor(4);
End;
GotoXY(Xpos,Ypos);
S := CharLen('*',17);
Write('*',s,'*');
GotoXY(Xpos,YPos+1);
Write(charlen(' ',19));
GotoXY(XPos,YPos+1);
Write('³',Cardname[Card.Value]);
Write(CardSuiteName[Card.Suite]);
GotoXY(Xpos+18,Ypos+1);
Write('*');
GotoXY(Xpos,Ypos+2);
S := CharLen('*',17);
Write('*',S,'*');
end;
function GetAnotherSuit(suit:Cardsuite):integer;
var
k,index :integer;
cardfound:boolean;
begin
k := 0;
cardfound := false;
for index := 0 to 51 do
begin
if not deck[index].dealt and not cardfound then
begin
if deck[index].card.suite = suit then
begin
deck[index].dealt := true;
k := index;
Cardfound := True;
end;
end;
end;
result := k;
end;
Function getTheCardvalue(v:cardvalue):integer;
var
k,
index:integer;
cardfound:boolean;
begin
k := 0;
cardfound:= false;
for index := 0 to 51 do
begin
if not deck[index].dealt then
if not cardfound then
if deck[index].card.value = v then
begin
k := index;
deck[index].dealt := true;
cardfound := true; {just get the first one}
end;
end;
result := k;
end;
Function GetACard:Integer;
Var
A:Integer;
begin
Repeat
A:= random(52); {Pick a card index between 0 and 51}
Until Not Deck[a].dealt; {until not dealt card found}
Deck[a].dealt := true;
GetACard:= a;
end;
end.