**[**Back to DATATYPE SWAG index**]** **[**Back to Main SWAG index**]** **[**Original**]**

**program **CardGame;
*{ Author: John Howard jh
Date: 08-SEP-94
Version: 1.0
Demonstrate two methods to shuffle cards. Swap method is fast!
Demonstrate how to evaluate Bridge hands:
Each hand of 13 cards are arranged by suits and rank within suit (aces are
high). The hand is then evaluated using the following standard bridge
values.
Aces count 4
Kings count 3
Queens count 2
Jacks count 1
Voids (no cards in a suit) count 3
Singletons (one card in a suit) count 2
Doubletons (two cards in a suit) count 1
Long suits with more than five cards in the suit
count 1 for each card over five in number
Example: 2C QD TC AD 6C 3D TD 3H 5H 7H AS JH KH = 16 points
because there are 2 aces, 1 king, 1 queen, 1 jack, 1 singleton.
}
{$DEFINE BridgeHand}
***const
***{$IFDEF BridgeHand}
*points : integer = 0;
*{$ENDIF}
*maxdeck = 52;
maxsuit = 13;
sentinel = 0;
suits = 4;
**type
**card = byte;
suit = **array**[1..maxsuit] **of **card; *{ ace rank is 1, king rank is 13 }
***var
**hearts, diamonds : suit; *{red}
*clubs, spades : suit; *{black}
*deck : **array**[1..maxdeck] **of **card;
i, j, k : integer; *{ indices }
*count : integer; *{ count of used cards }
***procedure **swap(a,b : integer);
**var **temp : integer;
**begin
**temp := deck[a];
deck[a] := deck[b];
deck[b] := temp;
**end**;
**BEGIN ***{main}
*writeln('method one - random swap. Absolutely the fastest!');
randomize;
**for **i := 1 **to **maxdeck **do ***{initialize deck}
*deck[i] := i; *{ Card number MODULO 13 will help to rank }
***for **i := 1 **to **maxdeck **do ***{index card deck}
***begin
**j := random(maxdeck) +1; *{ range is 1..52 }
*SWAP(i, j); *{ shuffle two cards }
***end**;
**for **i := 1 **to **maxdeck **do ***{index card deck}
*write(deck[i], ' '); *{ display card order }
*writeln;
writeln('method two - rank each card. Theoretically may take forever!');
randomize;
**for **i := 1 **to **maxdeck **do ***{initialize deck}
*deck[i] := sentinel; *{ Zero is our sentinel }
***for **i := 1 **to **maxsuit **do ***{initialize suits with their card numbers}
***begin
**hearts[i] := i; *{ range is 1..13 }
*diamonds[i] := i + maxsuit; *{ range is 14..26 }
*clubs[i] := i + 2*maxsuit; *{ range is 27..39 }
*spades[i] := i + 3*maxsuit; *{ range is 40..52 }
***end**;
count := maxdeck;
*{$IFDEF BridgeHand}
*count := maxsuit;
*{$ENDIF}
***repeat
**i := random(maxdeck) +1; *{ range is 1..52 }
***if **deck[i] = sentinel **then
begin
**j := random(maxsuit) +1; *{ range is 1..13 }
*k := random(suits) +1; *{ range is 1..4 }
***case **k **of
**1 :
**if **hearts[j] <> sentinel **then
begin
**hearts[j] := sentinel;
deck[i] := j;
dec(count);
**end**;
2 :
**if **diamonds[j] <> sentinel **then
begin
**diamonds[j] := sentinel;
deck[i] := j+ maxsuit;
dec(count);
**end**;
3 :
**if **clubs[j] <> sentinel **then
begin
**clubs[j] := sentinel;
deck[i] := j+ 2*maxsuit;
dec(count);
**end**;
4 :
**if **spades[j] <> sentinel **then
begin
**spades[j] := sentinel;
deck[i] := j+ 3*maxsuit;
dec(count);
**end**;
**end**; *{case}
***end**;
**until **(count = 0);
**for **i := 1 **to **maxdeck **do ***{index card deck}
*write(deck[i], ' '); *{ display card order }
*writeln;
*{$IFDEF BridgeHand}
{ Only block for Hearts is shown. Code is similar for each suit! }
*count := 0;
**if **hearts[1] = sentinel **then **inc(points, 4); *{ ace }
***if **hearts[13] = sentinel **then **inc(points, 3); *{ king }
***if **hearts[12] = sentinel **then **inc(points, 2); *{ queen }
***if **hearts[11] = sentinel **then **inc(points, 1); *{ jack }
***for **i := 1 **to **maxsuit **do
if **hearts[i] = sentinel **then **inc(count);
**case **count **of
**0: inc(points, 3); *{ void }
*1: inc(points, 2); *{ singleton }
*2: inc(points, 1); *{ doubleton }
*6..13: inc(points, count-5); *{ long suit }
***end**; *{case}
*writeln('Points for Hearts = ', points);
*{$ENDIF}
***END**. *{program}
*

**[**Back to DATATYPE SWAG index**]** **[**Back to Main SWAG index**]** **[**Original**]**