1 static char *sccsid = "@(#)cards.c 1.4 (Berkeley) 05/19/83"; 2 3 #include <stdio.h> 4 #include "deck.h" 5 6 7 /* 8 * initialize a deck of cards to contain one of each type 9 */ 10 11 makedeck( d ) 12 13 CARD d[]; 14 { 15 register int i, j, k; 16 long time(); 17 18 i = time( (long *) 0 ); 19 i = ( (i&0xff) << 8 ) | ( (i >> 8)&0xff ) | 1; 20 srand( i ); 21 k = 0; 22 for( i = 0; i < RANKS; i++ ) { 23 for( j = 0; j < SUITS; j++ ) { 24 d[k].suit = j; 25 d[k++].rank = i; 26 } 27 } 28 } 29 30 31 32 /* 33 * given a deck of cards, shuffle it -- i.e. randomize it 34 * see Knuth, vol. 2, page 125 35 */ 36 37 shuffle( d ) 38 39 CARD d[]; 40 { 41 register int j, k; 42 CARD c; 43 44 for( j = CARDS; j > 0; --j ) { 45 k = ( rand() >> 4 ) % j; /* random 0 <= k < j */ 46 c = d[j - 1]; /* exchange (j - 1) and k */ 47 d[j - 1] = d[k]; 48 d[k] = c; 49 } 50 } 51 52 53 54 /* 55 * return true if the two cards are equal... 56 */ 57 58 eq( a, b ) 59 60 CARD a, b; 61 { 62 return( ( a.rank == b.rank ) && ( a.suit == b.suit ) ); 63 } 64 65 66 67 /* 68 * isone returns TRUE if a is in the set of cards b 69 */ 70 71 isone( a, b, n ) 72 73 CARD a, b[]; 74 int n; 75 { 76 register int i; 77 78 for( i = 0; i < n; i++ ) { 79 if( eq( a, b[i] ) ) return( TRUE ); 80 } 81 return( FALSE ); 82 } 83 84 85 86 /* 87 * remove the card a from the deck d of n cards 88 */ 89 90 remove( a, d, n ) 91 92 CARD a, d[]; 93 int n; 94 { 95 register int i, j; 96 97 j = 0; 98 for( i = 0; i < n; i++ ) { 99 if( !eq( a, d[i] ) ) d[j++] = d[i]; 100 } 101 if( j < n ) d[j].suit = d[j].rank = EMPTY; 102 } 103 104 105 106 /* 107 * sorthand: 108 * Sort a hand of n cards 109 */ 110 sorthand(h, n) 111 register CARD h[]; 112 int n; 113 { 114 register CARD *cp, *endp; 115 CARD c; 116 117 for (endp = &h[n]; h < endp - 1; h++) 118 for (cp = h + 1; cp < endp; cp++) 119 if ((cp->rank < h->rank) || 120 (cp->rank == h->rank && cp->suit < h->suit)) { 121 c = *h; 122 *h = *cp; 123 *cp = c; 124 } 125 } 126 127