Code:
* Poker program */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define num_faces 13
#define num_suits 4
#define cards_in_hand 5
#define TRUE 1
#define FALSE 0
typedef int BOOL;
BOOL bStraight, bFlush, bFour, bThree;
int iPairs; /* can be 0, 1, or 2 */
char *suit[num_suits]={"Clubs", "Diamonds", "Hearts", "Spades"};
char *face[num_faces]={"Ace", "Deuce", "Three", "Four", "Five", "Six",
"Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
int num_in_rank[num_faces];
int num_in_suit[num_suits];
int fivecardarray[num_faces][num_suits];
void shuffle(int [][num_faces]);
void deal(int [][num_faces], char *[], char *[]);
void PrintSelectedCards(void)
{
int iRow = 0, iColumn = 0;
int iTempRow, iRowCount;
if ((bThree && iPairs == 1) || (bStraight || bFlush))
{
for(iColumn = 0; iColumn < num_faces; iColumn++)
{
for(iRow = 0; iRow < num_suits; iRow++)
{
if(fivecardarray[iColumn][iRow] == 1)
{
printf("%s of %s ", face[iColumn] ,suit[iRow]);
fivecardarray[iColumn][iRow] = 0;
}
}
}
}
else if (bThree || bFour)
{
for(iColumn = 0; iColumn < num_faces; iColumn++)
{
iRowCount = 0;
for(iRow = 0; iRow < num_suits; iRow++)
{
if(fivecardarray[iColumn][iRow] == 1)
++iRowCount;
if(iRowCount == 3)
{
for(iTempRow = 0; iTempRow < num_suits; iTempRow++ )
{
if(fivecardarray[iColumn][iTempRow] == 1)
{
printf("%s of %s ", face[iColumn] ,suit[iTempRow]);
fivecardarray[iColumn][iTempRow] = 0;
}
}
if(bThree)
break;
}
}
}
}
else if (iPairs == 2 || iPairs == 1)
{
for(iColumn = 0; iColumn < num_faces; iColumn++)
{
iRowCount = 0;
for(iRow = 0; iRow < num_suits; iRow++)
{
if(fivecardarray[iColumn][iRow] == 1)
++iRowCount;
if(iRowCount > 1)
{
for(iTempRow = 0; iTempRow < num_suits; iTempRow++ )
{
if(fivecardarray[iColumn][iTempRow] == 1)
{
printf("%s of %s ", face[iColumn] ,suit[iTempRow]);
fivecardarray[iColumn][iTempRow] = 0;
}
}
if(iPairs == 1)
break;
}
}
}
}
else
{
// Check for ace first;
for(iRow = 0; iRow < num_suits; iRow++)
if(fivecardarray[iColumn][iRow] == 1)
{
printf("%s of %s\n", face[iColumn] ,suit[iRow]);
return;
}
for(iColumn = 12; iColumn > 0; iColumn--)
for(iRow = 0; iRow < num_suits; iRow++)
if(fivecardarray[iColumn][iRow] == 1)
{
printf("%s of %s\n", face[iColumn] ,suit[iRow]);
return;
}
}
}
void AnalyzeHand(void)
{
int iNumberConsecutive = 0;
int iRank, iSuit;
bStraight = FALSE;
bFlush = FALSE;
bFour = FALSE;
bThree = FALSE;
iPairs = 0;
/* Flush? */
for (iSuit = 0; iSuit < num_suits; iSuit++)
if (num_in_suit[iSuit] == cards_in_hand)
bFlush = TRUE;
/* Straight */
iRank = 0;
while (num_in_rank[iRank] == 0) iRank++;
for (; iRank < num_faces && num_in_rank[iRank]; iRank++)
iNumberConsecutive++;
if (iNumberConsecutive == cards_in_hand) {
bStraight = TRUE;
return;
}
/* 4 of a kind, 3 of a kind or pairs ? */
for (iRank = 0; iRank < num_faces; iRank++) {
if (num_in_rank[iRank] == 4) bFour = TRUE;
if (num_in_rank[iRank] == 3) bThree = TRUE;
if (num_in_rank[iRank] == 2) iPairs++;
}
}
void PrintHand(void)
{
printf("\n");
if (bStraight && bFlush) printf("Straight Flush\n\n");
else if (bFour) printf("Four of a kind\n\n");
else if (bThree &&
iPairs == 1) printf("Full house\n\n");
else if (bFlush) printf("Flush\n\n");
else if (bStraight) printf("Straight\n\n");
else if (bThree) printf("Three of a kind\n\n");
else if (iPairs == 2) printf("Two pairs\n\n");
else if (iPairs == 1) printf("Pair\n\n");
else
printf("High card\n\n");
PrintSelectedCards();
}
int main(void)
{
int deck[num_suits][num_faces] = {0};
srand(time(0));
shuffle(deck);
deal(deck, face, suit);
return 0;
}
/* Function to use random generator to get random suit and random card values */
void shuffle(int workdeck[][13])
{
int card, row, column;
for(card = 1; card <= num_suits * num_faces; card++)
{
row = rand() % num_suits;
column = rand() % num_faces;
while(workdeck[row][column] != 0)
{
row = rand() % num_suits;
column = rand() % num_faces;
}
workdeck[row][column] = card;
}
}
/* Function to output to console (print) suit and card values */
void deal(int workdeck2[][13], char *workface[], char *worksuit[])
{
int card, row, column;
for (card = 1; card <= cards_in_hand; card++)
{
for (row = 0; row <= 3; row++)
{
for (column = 0; column <= 12; column++)
if (workdeck2[row][column] == card)
{
printf("\n%5s of %-8s ",
workface[column], worksuit[row]);
fivecardarray[column][row] = 1;
num_in_rank[column]++;
num_in_suit[row]++;
}
}
}
AnalyzeHand();
PrintHand();
}