|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)cards.c 5.4 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: #include <stdio.h>
25: #include "deck.h"
26:
27:
28: /*
29: * initialize a deck of cards to contain one of each type
30: */
31:
32: makedeck( d )
33:
34: CARD d[];
35: {
36: register int i, j, k;
37: long time();
38:
39: i = time( (long *) 0 );
40: i = ( (i&0xff) << 8 ) | ( (i >> 8)&0xff ) | 1;
41: srand( i );
42: k = 0;
43: for( i = 0; i < RANKS; i++ ) {
44: for( j = 0; j < SUITS; j++ ) {
45: d[k].suit = j;
46: d[k++].rank = i;
47: }
48: }
49: }
50:
51:
52:
53: /*
54: * given a deck of cards, shuffle it -- i.e. randomize it
55: * see Knuth, vol. 2, page 125
56: */
57:
58: shuffle( d )
59:
60: CARD d[];
61: {
62: register int j, k;
63: CARD c;
64:
65: for( j = CARDS; j > 0; --j ) {
66: k = ( rand() >> 4 ) % j; /* random 0 <= k < j */
67: c = d[j - 1]; /* exchange (j - 1) and k */
68: d[j - 1] = d[k];
69: d[k] = c;
70: }
71: }
72:
73:
74:
75: /*
76: * return true if the two cards are equal...
77: */
78:
79: eq( a, b )
80:
81: CARD a, b;
82: {
83: return( ( a.rank == b.rank ) && ( a.suit == b.suit ) );
84: }
85:
86:
87:
88: /*
89: * isone returns TRUE if a is in the set of cards b
90: */
91:
92: isone( a, b, n )
93:
94: CARD a, b[];
95: int n;
96: {
97: register int i;
98:
99: for( i = 0; i < n; i++ ) {
100: if( eq( a, b[i] ) ) return( TRUE );
101: }
102: return( FALSE );
103: }
104:
105:
106:
107: /*
108: * remove the card a from the deck d of n cards
109: */
110:
111: remove( a, d, n )
112:
113: CARD a, d[];
114: int n;
115: {
116: register int i, j;
117:
118: j = 0;
119: for( i = 0; i < n; i++ ) {
120: if( !eq( a, d[i] ) ) d[j++] = d[i];
121: }
122: if( j < n ) d[j].suit = d[j].rank = EMPTY;
123: }
124:
125:
126:
127: /*
128: * sorthand:
129: * Sort a hand of n cards
130: */
131: sorthand(h, n)
132: register CARD h[];
133: int n;
134: {
135: register CARD *cp, *endp;
136: CARD c;
137:
138: for (endp = &h[n]; h < endp - 1; h++)
139: for (cp = h + 1; cp < endp; cp++)
140: if ((cp->rank < h->rank) ||
141: (cp->rank == h->rank && cp->suit < h->suit)) {
142: c = *h;
143: *h = *cp;
144: *cp = c;
145: }
146: }
147:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.