Code:
/* Filename: BlakJack.c */
#include <stdio.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
/************ Define constants ***********/
#define BELL '\a'
#define DEALER 0
#define PLAYER 1
#define ACELOW 0
#define ACEHIGH 1
int askedForName = 0;
/************ Prototypes *****************/
void dispTitle(void);
void initCardsScreen(int cards[52], int playerPoints[2], int dealerPoints[2], int total[2], int * numCards);
int dealCard(int * numCards, int cards[52]);
void dispCard(int * cardDrawn, int points[2]);
void totalIt(int points[2], int total[2], int who);
void dealerGetsCard(int *numCards, int cards[52], int playerPoints[2]);
char getAns(char mesg[]);
void findWinner (int total[2]);
/************ Main Function **************/
main() {
int numCards; /* Equals 52 at beginning of each game */
int cards[52], playerPoints[2], dealerPoints[2], total[2];
char ans; /* for users Hit/Stand or Yes/No Response */
do { initCardsScreen(cards, playerPoints, dealerPoints, total, &numCards);
dealerGetsCard(&numCards, cards, dealerPoints);
printf("\n");
playerGetsCard(&numCards, cards, playerPoints);
playerGetsCard(&numCards, cards, playerPoints);
do {
ans = getAns("Hit or stand (H/S)? ");
if (ans == 'H')
{ playerGetsCard(&numCards, cards,
playerPoints);
}
} while (ans != 'S');
totalIt(playerPoints, total, PLAYER); /* players Total */
do {
dealerGetsCard(&numCards, cards, dealerPoints);
} while (dealerPoints[ACEHIGH] < 17); /* Dealer Stops */
totalIt(dealerPoints, total, DEALER);
/* Dealer's total */
findWinner(total);
ans = getAns("\nPlay again (Y/N)? ");
} while (ans == 'Y');
return 0;
}
/* This function initializes the face values of the deck of cards by putting
four sets of 1-13 in the 52-card array. Also clears the screen and displays
a title */
void initCardsScreen(int cards[52], int playerPoints[2], int dealerPoints[2], int total[2], int *numCards) {
int sub, val = 1; /* This function's Work Variables */
char firstName[15]; /* Hold's user's First name */
*numCards = 52; /* Holds running total of number of cards */
for (sub = 0; sub <= 1; sub++) { /* Counts from 0 to 51 */
val = (val == 14) ? 1 : val; /* If val is 14, reset to 1 */
cards[sub] = val;
val++; }
for (sub = 0; sub <= 1; sub++) /* Counts from 0 to 1 */
{ playerPoints [sub]= dealerPoints[sub]=total[sub]=0; }
dispTitle();
if (askedForName == 0) /* Name asked for only once */
{ printf("\nWhat is your first name? ");
scanf(" %s", firstName);
askedForName = 1; /* Don't ask prompt again */
printf("Ok, %s, get ready for Blackjack Action!\n\n", firstName);
getchar(); /* Discards newline. You can safely ignore compiler warning here. */
return;
}
/************* This function gets a card for the player and updates the player's points ***/
void playerGetsCard(int *numCards, int cards[52], int playerPoints[2])
{
int newCard;
newCard = dealCard(numCards, cards);
printf("You Draw: ");
dispCard(newCard, playerPoints);
}
/************* This function gets a card for thet dealer and updates the dealer's points. */
void dealerGetsCard(int *numCards, int cards[52], int dealerPoints[2])
{
int newCard;
newCard = dealCard(numCards, cards);
printf("The Dealer Draws: ");
dispCard(newCard, dealerPoints);
}
/************ This function gets a card from the deck and stores it in either the dealer's or the playe's hold of cards. */
int dealCard(int * numCards, int cards[52])
{
int cardDrawn, subDraw;
time_t t; /* Gets time for a random value */
srand(time(&t)); /* Seeds random number generator */
subDraw = (rand() % (*numCards)); /* from 0 to numcards */
cardDrawn = cards[subDraw];
cards[subDraw] = cards[*numCards -1]; /* puts top card in place of drawn one */
(*numCards)-;
return cardDrawn;
}
/*********** Displays the last-drawn card and updates points with it */
void dispCard(int cardDrawn, int points[2])
{
switch (cardDrawn) {
case(11) : printf("%s\n", "Jack");
points[ACELOW] += 10;
points[ACEHIGH] += 10;
break;
case(12) : printf("&s\n", "Queen");
points[ACELOW] += 10;
points[ACEHIGH += 10;
break;
case(13) : printf("%s\n", "King");
points[ACELOW] += 10;
points[ACEHIGH] += 10;
break;
default : points[ACELOW] += cardDrawn;
if (cardDrawn == 1)
{ printf("%s\n", "Ace");
points[ACEHIGH] += 11;
}
else
{ points[ACEHIGH] += cardDrawn;
printf("&d\n", cardDrawn); }
}
return;
}
/****** Figures the total for player or dealer to see who won. This function
takes into account the fact that Ace is either 1 or 11. */
void totalIt(int points[2], int total[2], int who)
{
/* the follow routine fist looks to see if the total points counting aces as 1 is equal
to the total points counting aces as 11. If so, or if the total points counting aces as 11 is more the 21, the program
uses the total with aces as 1 only. */
if ((points[ACELOW] == points[ACEHIGH]) || (points[ACEHIGH] > 21))
{ total[who] = points[ACELOW]; } /* Keeps all Aces as 1 */
else
{ total[who] = points[ACEHIGH]; } /* Keeps all Aces as 11 */
if (who == player) /* Determines the message printed */
{ printf("You have a total of %d\n\n", total[PLAYER]); }
else
{ printf("The house stands with a total of %d\n\n", total[DEALER]); }
return;
}
/********** Prints the winning player. ******/
void findWinner(int total[2])
{
if (total[DEALER] == 21)
{ printf(" The house Wins.\n");
return;}
if ((total[DEALER] > 21) && (total[PLAYER] > 21))
{ printf("%s", "Nobody wins.\n");
return; }
if ((total[DEALER]>=total[PLAYER])&&(total[DEALER] < 21))
{ printf("The House Wins.\n");
return; }
if ((total[PLAYER] > 21) && (total[DEALER] < 21))
{ printf("The House Wins.\n");
return; }
printf("%s%c", "You Win!\n", BELL);
return;
}
/****** Gets the user's uppercase, single-character response ***/
char getAns(char mesg[])
{
char ans;
printf("%s", mesg); /* Prints the prompt message passed */
ans = getchar();
getchar(); /* discard newline, ignore compiler warning here */
return toupper(ans);
}
/* Clears everything on screen */
void dispTitle(void)
{
int i = -;
while (i <25) /* clears screen by printing 25 blank */
{ printf("\n");
i++; }
printf("\n\n*Step Right up to the Blackjack Table*\n\n");
return;
}