#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SUITS 4
#define FACES 13
#define CARDS 52
#define HAND_SIZE 5
void shuffle(int deck[][FACES]);
void getCard(int deck[][FACES],
int cardNumber,
int card[]);
void printHand(int hand[][2],
const char *face[],
const char *suit[]);
int handValue(int hand[][2]);
int containsPair(int hand[][2]);
int containsThreeOfKind(int hand[][2]);
int containsFourOfKind(int hand[][2]);
int containsFlush(int hand[][2]);
int containsStraight(int hand[][2]);
void dealerDraw(int deck[][FACES],
int hand[][2],
int *nextCard);
int main(void)
{
int deck[SUITS][FACES] = { 0 };
int playerHand[HAND_SIZE][2];
int dealerHand[HAND_SIZE][2];
const char *suit[SUITS] =
{ "Hearts", "Diamonds", "Clubs", "Spades" };
const char *face[FACES] =
{
"Ace", "Deuce", "Three", "Four", "Five",
"Six", "Seven", "Eight", "Nine", "Ten",
"Jack", "Queen", "King"
};
shuffle(deck);
for (int i = 0; i < HAND_SIZE; ++i)
{
getCard(deck, i + 1, playerHand[i]);
}
for (int i = 0; i < HAND_SIZE; ++i)
{
getCard(deck,
HAND_SIZE + i + 1,
dealerHand[i]);
}
printHand(playerHand, face, suit);
printf("\nDealer hand before drawing:\n"); printHand(dealerHand, face, suit);
int nextCard = 11;
dealerDraw(deck, dealerHand, &nextCard);
printf("\nDealer hand after drawing:\n"); printHand(dealerHand, face, suit);
printf("\nPlayer hand value = %d\n", handValue(playerHand));
printf("Dealer hand value = %d\n", handValue(dealerHand));
if (handValue(playerHand) > handValue(dealerHand))
{
}
else if (handValue(dealerHand) > handValue(playerHand))
{
}
else
{
printf("\nThe two hands are equal.\n"); }
return 0;
}
void shuffle(int deck[][FACES])
{
for (int card = 1; card <= CARDS; ++card)
{
int row;
int column;
do
{
}
while (deck[row][column] != 0);
deck[row][column] = card;
}
}
void getCard(int deck[][FACES],
int cardNumber,
int card[])
{
for (int row = 0; row < SUITS; ++row)
{
for (int column = 0; column < FACES; ++column)
{
if (deck[row][column] == cardNumber)
{
card[0] = row;
card[1] = column;
return;
}
}
}
}
void printHand(int hand[][2],
const char *face[],
const char *suit[])
{
for (int i = 0; i < HAND_SIZE; ++i)
{
face[hand[i][1]],
suit[hand[i][0]]);
}
}
void dealerDraw(int deck[][FACES],
int hand[][2],
int *nextCard)
{
int value = handValue(hand);
if (value >= 3)
{
return;
}
int keep[HAND_SIZE] = { 0 };
if (containsFourOfKind(hand))
{
for (int i = 0; i < HAND_SIZE; ++i)
{
int count = 0;
for (int j = 0; j < HAND_SIZE; ++j)
{
if (hand[i][1] == hand[j][1])
{
++count;
}
}
if (count == 4)
{
keep[i] = 1;
}
}
}
else if (containsThreeOfKind(hand))
{
for (int i = 0; i < HAND_SIZE; ++i)
{
int count = 0;
for (int j = 0; j < HAND_SIZE; ++j)
{
if (hand[i][1] == hand[j][1])
{
++count;
}
}
if (count == 3)
{
keep[i] = 1;
}
}
}
else if (containsPair(hand))
{
for (int i = 0; i < HAND_SIZE; ++i)
{
int count = 0;
for (int j = 0; j < HAND_SIZE; ++j)
{
if (hand[i][1] == hand[j][1])
{
++count;
}
}
if (count == 2)
{
keep[i] = 1;
}
}
}
for (int i = 0; i < HAND_SIZE; ++i)
{
if (keep[i] == 0)
{
getCard(deck, *nextCard, hand[i]);
++(*nextCard);
}
}
}
int containsPair(int hand[][2])
{
for (int i = 0; i < HAND_SIZE; ++i)
{
for (int j = i + 1; j < HAND_SIZE; ++j)
{
if (hand[i][1] == hand[j][1])
{
return 1;
}
}
}
return 0;
}
int containsThreeOfKind(int hand[][2])
{
for (int i = 0; i < HAND_SIZE; ++i)
{
int count = 0;
for (int j = 0; j < HAND_SIZE; ++j)
{
if (hand[i][1] == hand[j][1])
{
++count;
}
}
if (count == 3)
{
return 1;
}
}
return 0;
}
int containsFourOfKind(int hand[][2])
{
for (int i = 0; i < HAND_SIZE; ++i)
{
int count = 0;
for (int j = 0; j < HAND_SIZE; ++j)
{
if (hand[i][1] == hand[j][1])
{
++count;
}
}
if (count == 4)
{
return 1;
}
}
return 0;
}
int containsFlush(int hand[][2])
{
for (int i = 1; i < HAND_SIZE; ++i)
{
if (hand[i][0] != hand[0][0])
{
return 0;
}
}
return 1;
}
int containsStraight(int hand[][2])
{
int values[FACES] = { 0 };
for (int i = 0; i < HAND_SIZE; ++i)
{
values[hand[i][1]] = 1;
}
for (int start = 0; start <= 8; ++start)
{
int straight = 1;
for (int i = 0; i < HAND_SIZE; ++i)
{
if (values[start + i] == 0)
{
straight = 0;
}
}
if (straight == 1)
{
return 1;
}
}
if (values[0] == 1 &&
values[1] == 1 &&
values[2] == 1 &&
values[3] == 1 &&
values[4] == 1)
{
return 1;
}
return 0;
}
int handValue(int hand[][2])
{
if (containsFourOfKind(hand))
{
return 6;
}
if (containsFlush(hand) &&
containsStraight(hand))
{
return 5;
}
if (containsThreeOfKind(hand) &&
containsPair(hand))
{
return 4;
}
if (containsFlush(hand) ||
containsStraight(hand))
{
return 3;
}
if (containsThreeOfKind(hand))
{
return 2;
}
if (containsPair(hand))
{
return 1;
}
return 0;
}