The program in Figs. 22.222.4 is based on the card shuffling and dealing simulation discussed in Chapter 8. The program represents the deck of cards as an array of structures and uses high-performance shuffling and dealing algorithms.
Figure 22.2. Header file for DeckOfCards class.
1 // Fig. 22.2: DeckOfCards.h
2 // Definition of class DeckOfCards that
3 // represents a deck of playing cards.
4
5 // Card structure definition
6 struct Card
7 {
8 char *face;
9 char *suit;
10 }; // end structure Card
11
12 // DeckOfCards class definition
13 class DeckOfCards
14 {
15 public:
16 DeckOfCards(); // constructor initializes deck
17 void shuffle(); // shuffles cards in deck
18 void deal(); // deals cards in deck
19
20 private:
21 Card deck[ 52 ]; // represents deck of cards
22 }; // end class DeckOfCards
|
Figure 22.3. Class file for DeckOfCards.
(This item is displayed on pages 1062 - 1064 in the print version)
1 // Fig. 22.3: DeckOfCards.cpp
2 // Member-function definitions for class DeckOfCards that simulates
3 // the shuffling and dealing of a deck of playing cards.
4 #include
5 using std::cout;
6 using std::left;
7 using std::right;
8
9 #include
10 using std::setw;
11
12 #include // prototypes for rand and srand
13 using std::rand;
14 using std::srand;
15
16 #include // prototype for time
17 using std::time;
18
19 #include "DeckOfCards.h" // DeckOfCards class definition
20
21 // no-argument DeckOfCards constructor intializes deck
22 DeckOfCards::DeckOfCards()
23 {
24 // initialize suit array
25 static char *suit[ 4 ] =
26 { "Hearts", "Diamonds", "Clubs", "Spades" };
27
28 // initialize face array
29 static char *face[ 13 ] =
30 { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
31 "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
32
33 // set values for deck of 52 Cards
34 for ( int i = 0; i < 52; i++ )
35 {
36 deck[ i ].face = face[ i % 13 ];
37 deck[ i ].suit = suit[ i / 13 ];
38 } // end for
39
40 srand( time( 0 ) ); // seed random number generator
41 } // end no-argument DeckOfCards constructor
42
43 // shuffle cards in deck
44 void DeckOfCards::shuffle()
45 {
46 // shuffle cards randomly
47 for ( int i = 0; i < 52; i++ )
48 {
49 int j = rand() % 52;
50 Card temp = deck[ i ];
51 deck[ i ] = deck[ j ];
52 deck[ j ] = temp;
53 } // end for
54 } // end function shuffle
55
56 // deal cards in deck
57 void DeckOfCards::deal()
58 {
59 // display each card's face and suit
60 for ( int i = 0; i < 52; i++ )
61 cout << right << setw( 5 ) << deck[ i ].face << " of "
62 << left << setw( 8 ) << deck[ i ].suit
63 << ( ( i + 1 ) % 2 ? ' ' : '
' );
64 } // end function deal
|
Figure 22.4. High-performance card shuffling and dealing simulation.
1 // Fig. 22.4: fig22_04.cpp
2 // Card shuffling and dealing program.
3 #include "DeckOfCards.h" // DeckOfCards class definition
4
5 int main()
6 {
7 DeckOfCards deckOfCards; // create DeckOfCards object
8
9 deckOfCards.shuffle(); // shuffle the cards in the deck
10 deckOfCards.deal(); // deal the cards in the deck
11 return 0; // indicates successful termination
12 } // end main
|
In the program, the constructor initializes the Card array in order with character strings representing the Ace through the King of each suit. Function shuffle is where the high-performance shuffling algorithm is implemented. The function loops through all 52 cards (array subscripts 0 to 51). For each card, a number between 0 and 51 is picked randomly. Next, the current Card structure and the randomly selected Card structure are swapped in the array. A total of 52 swaps are made in a single pass of the entire array, and the array of Card structures is shuffled! Unlike the shuffling algorithm presented in Chapter 8, this algorithm does not suffer from indefinite postponement. Because the Card structures were swapped in place in the array, the high-performance dealing algorithm implemented in function deal requires only one pass of the array to deal the shuffled cards.
Introduction to Computers, the Internet and World Wide Web
Introduction to C++ Programming
Introduction to Classes and Objects
Control Statements: Part 1
Control Statements: Part 2
Functions and an Introduction to Recursion
Arrays and Vectors
Pointers and Pointer-Based Strings
Classes: A Deeper Look, Part 1
Classes: A Deeper Look, Part 2
Operator Overloading; String and Array Objects
Object-Oriented Programming: Inheritance
Object-Oriented Programming: Polymorphism
Templates
Stream Input/Output
Exception Handling
File Processing
Class string and String Stream Processing
Web Programming
Searching and Sorting
Data Structures
Bits, Characters, C-Strings and structs
Standard Template Library (STL)
Other Topics
Appendix A. Operator Precedence and Associativity Chart
Appendix B. ASCII Character Set
Appendix C. Fundamental Types
Appendix D. Number Systems
Appendix E. C Legacy Code Topics
Appendix F. Preprocessor
Appendix G. ATM Case Study Code
Appendix H. UML 2: Additional Diagram Types
Appendix I. C++ Internet and Web Resources
Appendix J. Introduction to XHTML
Appendix K. XHTML Special Characters
Appendix L. Using the Visual Studio .NET Debugger
Appendix M. Using the GNU C++ Debugger
Bibliography