[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]