PROGRAMMING WITH C
7.12 (Card Shuffling and
Dealing) Modify the program in Fig. 7.24 so that the card-dealing
function deals a
five-card poker hand. Then write the following additional functions:
a) Determine whether
the hand contains a pair.
b) Determine whether
the hand contains two pairs.
c) Determine whether
the hand contains three of a kind (e.g., three jacks).
d) Determine whether
the hand contains four of a kind (e.g., four aces).
e) Determine whether
the hand contains a flush (i.e., all five cards of the same suit).
f) Determine whether the hand contains a
straight (i.e., five cards of consecutive face values)
ANSWER
7.12
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//main functions
void shuffle( int wDeck[][ 13 ] );
void deal( const int wDeck[][ 13 ],
const char *wface[], const char *wSuit[], char *wfSuit[], char *wfFace[] );
//operation functions
void pair( const char *wfSuit[], const
char *wfFace[]);
void twoPair( const char *wfSuit[],
const char *wfFace[] );
void threeKind( const char *wfSuit[],
const char *wfFace[] );
void fourKind( const char *wfSuit[],
const char *wfFace[] );
void flush( const char *wfSuit[], const
char *wfFace[] );
void straight( const char *wfSuit[],
const char *wfFace[], const char *wFace[] );
//sub-operation functions
void result( const int compare, const
int compareTo, const char *wfFace[], const char *wfSuit[], const char
statement[] );
int main(void){
//initilize suit array
const char *suit[ 4 ] = { "Hearts",
"Diamonds", "Clubs", "Spades" };
//initialize face array
const char *face[ 13 ] = { "Ace",
"Deuce", "Three", "Four",
"Five",
"Six", "Seven", "Eight",
"Nine",
"Ten", "Jack", "Queen", "King" };
//initialize suit and face array for storing five-hand card
char *fSuit[ 5 ] ;// Hearts
char *fFace[ 5 ] ;// Seven, Ace, Ace, Four, Five
//initialize deck array
int deck[ 4 ][ 13 ] = { 0 };
//seed random number generator
srand( time( 0 ) );
shuffle( deck );//shuffle the deck
deal( deck, face, suit, fSuit, fFace );//deal
five-hand card
pair( fSuit, fFace );//compute for pair
twoPair( fSuit, fFace );//compute for two-pair
threeKind( fSuit, fFace );//compute for three
of a kind
fourKind( fSuit, fFace );//compute for four of
the kind
flush( fSuit, fFace );//compute for flush
straight( fSuit, fFace, face );//compute for
straight
system("pause");
return 0;
}
void shuffle( int wDeck[][ 13 ] ){
int row, column, card;
for(card = 1; card <= 52; card++){
do{
row = rand() % 4;
column = rand() % 13;
}
while(wDeck[ row ][ column ] != 0);
wDeck[ row ][ column ] = card;
}
}
void deal( const int wDeck[][ 13 ],
const char *wFace[], const char *wSuit[], char *wfSuit[], char *wfFace[] ){
int card, row, column, i;
//deal 5-card poker hand
for(card = 1, i = 0; card <= 5; card++,
i++){
for(row = 0; row < 4; row++){
for(column = 0; column < 13; column++){
if(wDeck[ row ][ column ] == card){
wfSuit[ i ] = wSuit[ row ];
wfFace[ i ] = wFace[ column ];
}
}
}
}
//display 5-card poker hand
printf("Your five-card poker hand...\n\n");
for(i = 0; i < 5; i++){
printf("%10s of %-8s\n", wfFace[ i ], wfSuit[ i ]);
}
}
void pair(const char *wfSuit[], const
char *wfFace[]){
int card, i, j = 0, k;
int pair[ 5 ] = { 0 };
//compute whether the five-hand card contains a pair
printf("\nPair...\n");
for(card = 0; card < 5; card++){
for(i = card + 1; i < 5; i++){
if(wfFace[ card ] == wfFace[ i ]){
j++;
pair[ card ] = i;
}
}
}
//display result
if(j == 1){
for(card = 0; card < 5; card++){
if(pair[ card ] != 0){
k = pair[ card ];
printf("\n%10s of %-8s and %5s
of %-8s\n", wfFace[ card ], wfSuit[ card ], wfFace[ k ], wfSuit[ k ] );
}
}
}
else{
printf("\n Your five-hand
card doesn't contains any pair.\n");
}
}
void twoPair( const char *wfSuit[],
const char *wfFace[] ){
int card, i, j = 0, k;
int pair[ 5 ] = { 0 };
//compute whether the five-hand card contains two pair
printf("\nTwo-pair...\n");
for(card = 0; card < 5; card++){
for(i = card + 1; i < 5; i++){
if(wfFace[ card ] == wfFace[ i ]){
j++;
pair[ card ] = i;
}
}
}
//display result
if(j == 2){
for(card = 0; card < 5; card++){
if(pair[ card ] != 0){
k = pair[ card ];
printf("\n%10s of %-8s and
%5s of %-8s\n", wfFace[ card ], wfSuit[ card ], wfFace[ k ], wfSuit[ k ]
);
}
}
}
else{
printf("\n Your five-hand
card doesn't contains two pair.\n");
}
}
void threeKind( const char *wfSuit[],
const char *wfFace[] ){
int card, i, j = 0, k, x;
int pair[ 3 ] = { 0 };
//compute whether the five-hand card contains three of a kind
printf("\nThree of a kind...\n");
for(card = 0; card < 3; card++){
for(i = card + 1; i < 5; i++){
if(wfFace[ card ] == wfFace[ i ]){
for(x = i + 1; x < 5; x++){
if(wfFace[ i ] == wfFace[ x
]){
j++;
pair[ 0 ] = card;
pair[ 1 ] = i;
pair[ 2 ] = x;
}
}
}
}
}
//display result
if(j == 1){
for(card = 0; card < 3; card++){
k = pair[ card ];
printf("\n%10s of
%-8s\n", wfFace[ k ], wfSuit[ k ] );
}
}
else{
printf("\n Your five-hand
card doesn't contains three of a kind.\n");
}
}
void fourKind( const char *wfSuit[],
const char *wfFace[] ){
int card, i, indi = 0, pair[ 5 ] = { 0 };
//compute whether your five-hand card contains four-of-a-kind
printf("\nFour of a kind...\n");
for(card = 0; card < 2; card++){
for(i = card + 1; i < 5; i++){
if(wfFace[ card ] == wfFace[ i ]){
indi++;
if(indi == 1)
pair[ i - 1 ] = 1;
pair[ i ] = 1;
}
}
if(indi == 3)
break;
else if(indi > 3)
break;
else{
indi = 0;
for(i = 0; i < 5; i++)
pair[ i ] = 0;
}
}
//display result
if(indi == 3){
for(i = 0; i < 5; i++){
if( pair[ i ] == 1)
printf("\n%5s of %-9s\n",
wfFace[ i ], wfSuit[ i ] );
}
printf("\n");
}else{
printf("\n Your five-hand
card doesn't contains four-of-a-kind.\n");
}
}
void flush ( const char *wfSuit[], const
char *wfFace[] ){
int i, j = 0;
//compute whether your five-hand card contains a flush
printf("\nFlush...\n");
for(i = 1; i < 5; i++){
if(wfSuit[ 0 ] == wfSuit[ i ] )
j++;
}
//display result
result( j, 0, wfFace, wfSuit, "\n
Not flush!\n" );
}
void straight( const char *wfSuit[],
const char *wfFace[], const char *wFace[] ){
int i, j, k, pass, count, hold, check = 1;
int faceValue[ 5 ] = { 0 };
printf("\nStraight...\n");
//locate face value and store in an array
for(i = 0 ; i < 5; i++){
for(j = 0 ; j < 13; j++){
if(wfFace[ i ] == wFace[ j ]){
faceValue[ i ] = j;
}
}
}
//sort face value in ascending order using bubble sort
for(pass = 0; pass < 4; pass++){
for(count = 0; count < 4; count++){
if(faceValue[ count ] > faceValue[ count + 1 ]){
//swap
hold = faceValue[ count ];
faceValue[ count ] = faceValue[
count + 1 ];
faceValue[ count + 1 ] = hold;
}
}
}
//check if the hand contains a straight
for(i = 0; i < 4; i++){
if(faceValue[ i ] + 1 != faceValue[ i + 1 ]){
check = 0;
}
}
//display result
result( check, 1, wfFace, wfSuit, "\n Not a straight hand.\n" );
printf("\n");
}
//sub-operation functions
void result( const int compare, const
int compareTo, const char *wfFace[], const char *wfSuit[], const char
statement[] ){
int i;
if(compare == compareTo){
for(i = 0; i < 5; i++){
printf("\n %5s of
%-8s\n", wfFace[ i ], wfSuit[ i ] );
}
}
else{
printf("%s", statement );
}
}
Comments