This is the code for a blackjack game that deciacco and I worked on for a project for a class that I had. Documentation is in the code itself.
Update:
- By deciacco: I uploaded a zip file with the c file and a compiled exe so you can give it a try! You should be able to run the exe in Windows without a problem.
/*
Copyright (C) 2007 Bojan M.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/**********************************************************************************/
/** Bojan M. *****************************************************************/
/** blackjack.c *****************************************************************/
/** This will play a game of blackjack with the house, and 1 - 3 players for a **/
/** max of 10 hands. Since this game will not employ a wager, the scoring *******/
/** will be as follows: When the player or house get blackjack --> 2pts. ********/
/** If the player or house bust --> 0pts. If the player or house win --> 1pt. ***/
/** Pressing zero will exit the game. *******************************************/
/**********************************************************************************/
#define _CRT_SECURE_NO_DEPRECATE = 1 //Avoid Visual Studio warning
#include
#include
#include
#include
//Required for system()
#include //Required for rand() and srand()
//Value defenitions
#define TRUE 1
#define FALSE 0
#define BUFFSIZE 10
#define NOCARDS 52 //Will need to gen deck later
#define MAXPLAYERS 3
#define MAXHANDS 10
#define RANDSHUF 100
#define PLAYERSIZE 12
#define NEWCARDPOS 11
#define SCORE 0
#define SUM 1
//Function prototypes
void init_cards(int cards[]);
int get_card(int cards[], int *);
void shuf_cards(int cards[], int *);
void show_deck(int cards[]);
int random_int(int, int);
void show_p_hand(int player[][PLAYERSIZE], int);
void show_h_hand(int house[]);
void calc_p_sum(int player[][PLAYERSIZE], int);
void calc_h_sum(int house[]);
void summary(int house[], int player[][PLAYERSIZE], int);
void score(int house[], int player[][PLAYERSIZE], int);
/****************************** START main *********************************/
void main()
{
int i, j, no_players, no_hands, cur_hand = 0;
int cards[NOCARDS]; //Deck of cards
int player[MAXPLAYERS][PLAYERSIZE]; //Holds player stats during game
int house[PLAYERSIZE]; //Holds house stats during game
int play, ask, playhand; //Flags
int nextplayer; //Flag
int deckpos; //Keeps track of where to store next card
char yesno[BUFFSIZE]; //Input buffer
char hitstay[BUFFSIZE];
play = FALSE;
ask = playhand = TRUE;
house[SCORE] = 0; //Initializing the house total score
init_cards(cards); //Calling two functions to generate cards and shuffle them
shuf_cards(cards, &deckpos);
printf("BBBB LL AAA CCCCCC KK KK n");
printf("BB BB LL AA AA CC CC KK KK n");
printf("BB BB LL AA AA CC CC KK KK n");
printf("BB BB LL AA AA CC KK KK n");
printf("BB BB LL AA AA CC KK KK n");
printf("BB BB LL AA AA CC KK KK n");
printf("BB BB LL AA AA CC KKK n");
printf("BBBB LL AA AA CC KK KK n");
printf("BB BB LL AA AA CC KK KK n");
printf("BB BB LL AAAAAAAAA CC KK KK n");
printf("BB BB LL AAAAAAAAA CC KK KK n");
printf("BB BB LL AA AA CC KK KK n");
printf("BB BB LL AA AA CC CC KK KKn");
printf("BB BB LLLLLLL AA AA CC CC KK KKn");
printf("BBBB LLLLLLL AA AA CCCCCC KK KKnnn");
printf(" JJ AAA CCCCCC KK KKn");
printf(" JJ AA AA CC CC KK KKn");
printf(" JJ AA AA CC CC KK KKn");
printf(" JJ AA AA CC KK KKn");
printf(" JJ AA AA CC KK KKn");
printf(" JJ AA AA CC KK KKn");
printf(" JJ AA AA CC KKKn");
printf(" JJ AA AA CC KK KKn");
printf(" JJ AA AA CC KK KKn");
printf(" JJ AAAAAAAAA CC KK KKn");
printf(" JJ AAAAAAAAA CC KK KKn");
printf(" JJ JJ AA AA CC KK KKn");
printf(" JJ JJ AA AA CC CC KK KKn");
printf(" JJ JJ AA AA CC CC KK KKn");
printf(" JJJJJJJ AA AA CCCCCC KK KKnnnnn");
printf("Let's play some BlackJack!!!nn");
printf("Please enter '1' - '%d' for the number of players, or enter '0' to quit.n", MAXPLAYERS);
//If the user enters '0' ask will equal FALSE and will break out of loop
//Else it will take the input and go on to ask for how many hands
while(ask == TRUE)
{
printf("Enter choice: ");
scanf("%d", &no_players);
if(no_players == 0)
{
ask = FALSE;
}
else if(no_players >= 1 && no_players <= MAXPLAYERS)
{
play = TRUE;
ask = FALSE;
}
}
ask = TRUE;
//system("cls");
//If the user enters '0' ask will equal FALSE and will break out of loop
//Else it will take the input and go on to play the game
if(play == TRUE)
{
play = FALSE;
printf("How many hands do you want to play (max %d hands, '0' to quit.n", MAXHANDS);
while(ask == TRUE)
{
printf("Enter choice: ");
scanf("%d", &no_hands);
if(no_hands == 0)
{
ask = FALSE;
}
else if(no_hands >= 1 && no_hands <= MAXHANDS)
{
play = TRUE;
ask = FALSE;
}
}
//Initializing player score
for(i=0; i
{
player[i][SCORE] = 0;
}
//If the user entered 1 - 3 players play will equal to TRUE so the game starts
if(play == TRUE)
{
//system("cls");
printf("OK, let's play %d hands with %d players!!!nn", no_hands, no_players);
while(playhand == TRUE && cur_hand < no_hands)
{
//Give out current hand to each player
for(i = 0; i < no_players; i++)
{
for(j = 2; j < 4; j++)
{
player[i][j] = get_card(cards, &deckpos);
}
player[i][NEWCARDPOS] = 4; //Next available empty slot in player array
//must always be called after assigning empty slot
calc_p_sum(player, i);
}
//Take out two cards for house
for(j = 2; j < 4; j++)
{
house[j] = get_card(cards, &deckpos);
}
house[NEWCARDPOS] = 4;//Next available empty slot in house array
//must always be called after assigning empty slot
calc_h_sum(house);
//Go through every player for hit or stay
for(i = 0; i < no_players; i++)
{
nextplayer = FALSE;
while(nextplayer == FALSE)
{
printf("Player %dn", i+1);
show_p_hand(player,i); //Will show player X hand
if(player[i][SUM] == 21) //If it's 21, player will get
{ //blackjack and go on to next player
printf("Player %d got BLACKJACK!!!nn", i+1);
nextplayer = TRUE;
}
else
{
if(player[i][SUM] < 21)
{
//Must enter h or s to hit or stay, anything else
//will go to next playesr
printf("Player %d, hit or stay (h or s)?: ", i+1);
scanf("%s", hitstay);
if(hitstay[0] == 'h' || hitstay[0] == 'H')
{
player[i][player[i][NEWCARDPOS]] = get_card(cards, &deckpos);
player[i][NEWCARDPOS] += 1;
calc_p_sum(player, i);
}
else
nextplayer = TRUE;
}
else
{ //If a player get more then 21 it's a Bust and go to
//next player
printf("BUST!!!!nn");
nextplayer = TRUE;
}
}
}
}
//Process house and display it's hand
//if house has 17 or less, draw another card then calc sum
while(house[SUM] < 17)
{
house[house[NEWCARDPOS]] = get_card(cards, &deckpos);
house[NEWCARDPOS] += 1;
calc_h_sum(house);
}
show_h_hand(house); //Shows the house hand
summary(house, player, no_players); //Prints the current hand summary
//Next hand?
//If no, game quits
if (cur_hand < no_hands-1)
{
printf("Next hand? (y,n): ");
scanf("%s", yesno);
printf("n");
if(yesno[0] == 'y' || yesno[0] == 'Y')
{
playhand = TRUE;
shuf_cards(cards, &deckpos);
}
else
{
playhand = FALSE;
}
}
else
playhand = FALSE;
cur_hand += 1;//Increase the hand counter
}
}
}
score(house, player, no_players); //Score at the end of all hands
printf("nnThank you for playing BlackJack.n");
system("PAUSE");
}
/******************************** END main *********************************/
/**************************** START init_cards *****************************/
//Will fill the cards array (can change the number of decks to play
void init_cards(int cards[])
{
int base_cards[13];
int i,j;
//Fill base cards array
for(i = 0; i < 13; i++)
{
if (i <= 9 )
base_cards[i] = i+1;
else
base_cards[i] = 10;
}
//Fill deck with NOCARDS
i = 0;
for(j = 0; j < NOCARDS; j++)
{
cards[j] = base_cards[i];
if(i < 12)
i += 1;
else
i = 0;
}
}
/**************************** END init_cards *******************************/
/**************************** START show_deck ******************************/
//This will show the deck after the cards shuffled, can be used for cheating (kind of)
void show_deck(int cards[])
{
int i;
for(i = 0; i < NOCARDS; i++)
{
printf("%dn",cards[i]);
}
}
/***************************** END show_deck *******************************/
/**************************** START shuf_cards *****************************/
//Shuffles the cards 100 times in the cards array
//Basically it takes one card and swithes it with another in the array
void shuf_cards(int cards[], int *deckpos)
{
int i, tempvalue, randpos, x;
for(i = 0; i <= RANDSHUF; i++)
{
for(x = 0; x < NOCARDS; x++)
{
tempvalue = cards[x];
randpos = random_int(x,NOCARDS-1);
cards[x] = cards[randpos];
cards[randpos] = tempvalue;
}
}
*deckpos = 0; //Reset the card that we are on
//Keeps track of the current array position so all cards that have been
//taken out cannot be taken out anymore
}
/**************************** END shuf_cards *******************************/
/**************************** START random_int *****************************/
//Random function to pick random numbers to pick out of array and swap
int random_int(int min, int max)
{
int rand_int, i;
time_t seconds;
time(&seconds);
srand((unsigned int) seconds); //Seed generator
for (i=0; i
rand_int = rand() % (max - min + 1) + min;
return rand_int;
}
/**************************** END random_int *******************************/
/**************************** START get_card *******************************/
//If user says hit, this function gets the card out of the shuffled array and increases
//the deckpos counter to the next slot in array
int get_card(int cards[], int *deckpos)
{
int cardval;
cardval = cards[*deckpos];
*deckpos += 1;
return cardval;
}
/***************************** END get_hand ********************************/
/*************************** START show_p_hand *****************************/
//Shows player hand
void show_p_hand(int player[][PLAYERSIZE], int p)
{
int i;
for(i = 2; i < player[p][NEWCARDPOS]; i++)
printf("%d ", player[p][i]);
printf(" = %dn", player[p][SUM]);
}
/**************************** END show_p_hand ******************************/
/*************************** START show_h_hand *****************************/
//Shows house hand
void show_h_hand(int house[])
{
int i;
printf("Housen");
for(i = 2; i < house[NEWCARDPOS]; i++)
printf("%d ", house[i]);
printf(" = %dnn", house[SUM]);
}
/**************************** END show_h_hand ******************************/
/*************************** START calc_p_sum ******************************/
//Calculates the player sum, determines if an Ace is 1 or 11
void calc_p_sum(int player[][PLAYERSIZE], int p)
{
int i;
int acepos = 1;
player[p][SUM] = 0; //Reset sum to calc
//Raw sum for player
for(i = 2; i < player[p][NEWCARDPOS]; i++)
{
player[p][SUM] += player[p][i];
}
//Lets check for 1 or 11
for(i = 2; i < player[p][NEWCARDPOS]; i++)
if(player[p][i] == 1)
acepos = i;
if(acepos > 1) //We have either have a 1 or an 11
{
if((player[p][SUM] - 1 + 11) <= 21){
player[p][acepos] = 11;
//New sum for player
player[p][SUM] = 0; //Reset sum to calc
for(i = 2; i < player[p][NEWCARDPOS]; i++)
{
player[p][SUM] += player[p][i];
}
}
}
}
/**************************** END calc_p_sum *******************************/
/************************** START calc_h_sum *******************************/
//Calculates the house sum, determines if an Ace is 1 or 11
void calc_h_sum(int house[])
{
int i;
int acepos = 1;
house[SUM] = 0; //Reset sum to calc
//Raw sum for player
for(i = 2; i < house[NEWCARDPOS]; i++)
{
house[SUM] += house[i];
}
//Lets check for 1 or 11
for(i = 2; i < house[NEWCARDPOS]; i++)
if(house[i] == 1)
acepos = i;
if(acepos > 1) //We have either a 1 or an 11
{
if((house[SUM] - 1 + 11) <= 21){
house[acepos] = 11;
//New sum for player
house[SUM] = 0; //Reset sum to calc
for(i = 2; i < house[NEWCARDPOS]; i++)
{
house[SUM] += house[i];
}
}
}
}
/**************************** END calc_h_sum *******************************/
/***************************** START summary *******************************/
//Goes through all scenarios to determine if it's a Bust, Blackjack, Win, Loss, Push/Tie
void summary(int house[], int player[][PLAYERSIZE], int no_players)
{
int i;
//Go through every player and check score for hand summary
printf("Current Hand summary:n");
for(i = 0; i < no_players; i++)
{
if(house[SUM] > 21 && player[i][SUM] < 21)
{
player[i][SCORE] += 1;
printf("Player %d - Winsn",i+1);
}
else if (player[i][SUM] == 21 && house[SUM] != 21)
{
player[i][SCORE] += 2;
printf("Player %d - BlackJack!n",i+1);
}
else if(player[i][SUM] < house[1] && house[SUM] <= 21)
{
house[SCORE] += 1;
printf("Player %d - Loosesn",i+1);
}
else if(player[i][SUM] > house[SUM] && player[i][SUM] <= 21)
{
player[i][SCORE] += 1;
printf("Player %d - Winsn",i+1);
}
else if(player[i][SUM] > 21)
{
printf("Player %d - Bustn",i+1);
}
else
{
printf("Player %d - Push/Tien",i+1);
}
}
}
/***************************** END summary *********************************/
/***************************** START score *********************************/
//Displays the final overall score for players and house
void score(int house[], int player[][PLAYERSIZE], int no_players)
{
int i;
//Go through every player for hit or stay
printf("nnOverall game scores:n");
for(i = 0; i < no_players; i++)
{
printf("Player %d score: %dn", i+1, player[i][SCORE]);
}
printf("House score: %dn", house[SCORE]);
}
/***************************** END score ************************************/
Download the source file and compiled binary here
If you want to compile it yourself, take a look at this page: MinGW
Dhanish says:
hi there....your program surely is great...ive been trying to write 1 myself for the last 1 week and frankly speaking it sure is a lot of work. Lol. Need a favour on your part...do you think you might alter your program in such a way so as instead of displaying only the number obtained by each player the player get to see also the what type of card he got. Like for example instead of displaying
Player 1
7 10 = 17
the screen shows
Player 1
[7 spades] [10 hearts] = 17 points
also my program is intended to be for only 2 players and there need not be a house to be playing....soo its only between 2 players
i'm a university student and i got a programming course to catch up on my points. And i really suck in programming. I would very much appreciate if you would help me :-)
October 11, 2008, 02:30deciacco says:
Dhanish,
I have forwarded your request to the author of the program. I would be happy to help you if you have specific questions, but I don't want to simply write it for you. Your suggestion would surely make the game more complete.
If you end up making modifications to the code, please send me a copy! Good Luck!
October 12, 2008, 23:47Dhaish says:
Thankz a lot...well i'll ttry working on it myself but as i already told you im a complete novice on C and as my friends often told me lately....i dont really have a head for programming. lolz....anyway.....i wanted to know how to implement the type of the card together with the number....also there need be only 1 type of each type of card drawn....like if a player already drew a 7 of spades this card cannot be drawn again....ive been trying how to implement that bit but think its a bit too much thinking for me...lol...need help...thnx
October 13, 2008, 03:11BojanM says:
Hi Dhaish,
It has been a while since I looked at this program. In fact, that's one thing that I tried doing, inserting the suit of the cards. This makes the program very complex. just by looking at it, i think the easiest way of doing it is to create another array and fill it up with all the different suits, then shuffling them, and finally drawing cards. this will make it easy to still keep track of score, and should give you the suit in the output as well.
Good luck on your program.
Again, like deciacco said, if you end up making changes to it, send up a copy so we can see it as well, and I will post a copy of it on my blog.
October 13, 2008, 06:57vikesh says:
hi dear as am very bad in programing i wish to get your help in order to write a black jack program will it be possible dr that you help to write the pseudocode and z algorithm plz thank you in anticioation
November 7, 2008, 12:49vikesh says:
hi plz help me for the algorithm and flow chart
November 10, 2008, 07:51BojanM says:
Hi vikesh,
What exactly are you trying to do? I don't know what algorithm you are referring to. As far as the flow chart goes, it's really easy, however, you will have to write multiple flow charts for this program because it has different sections to it.
BojanM
November 10, 2008, 08:01Derick Sonneborn says:
Hey may I use some of the material from this blog if I provide a link back to your site?
May 20, 2010, 18:07