5

I'm trying to code a blackjack game. Until the last part it was going pretty well. My code is as following:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;
//Declarations
void makedeck(int deck[]);
int getTopCard(int deck[]);
void addCardToHand(int hand[], int drewCard);
void firstHand(int pHand[], int dHand[], int deck[]);
void printHands(int pHand[], int dHand[]);
void showCard(int card);
int getHandValue(int hand[]);
int main()
{
 int pHand[10]= {0}; //Player's Hand
 int dHand[10]= {0}; //Dealer's Hand
 int deck[52]; //Deck
 makedeck(deck); //Generating an ordered deck
 random_shuffle(&deck[0],&deck[52]); //Shuffling the deck
 firstHand(pHand,dHand,deck); //Dealing first hands.
 printHands(pHand,dHand); // Printing hands
 return 0;
}
/*Purpose of this function is to create 4 different suits with 14 different cards in all of them, a complete deck*/
void makedeck(int deck[])
{
 int a=0;
 for(int x=101; x<114; x++)
 {
 deck[a]=x;
 a++;
 }
 for(int x=201; x<214; x++)
 {
 deck[a]=x;
 a++;
 }
 for(int x=301; x<314; x++)
 {
 deck[a]=x;
 a++;
 }
 for(int x=401; x<414; x++)
 {
 deck[a]=x;
 a++;
 }
}
/*This function returns a topcard integer as value, that is the card at top of deck, then nullifies it from deck to prevent
it from being drawn again.*/
int getTopCard(int deck[])
{
 int topcard;
 for(int x=0; x<52; x++)
 {
 if(deck[x]!=0)
 {
 topcard=deck[x];
 deck[x]=0;
 break;
 }
 }
 return topcard;
}
/*This function draws four cards from top of deck and deals them respectively to the order of rules*/
void firstHand(int pHand[], int dHand[], int deck[] )
{
 addCardToHand(pHand , getTopCard(deck) );
 addCardToHand(dHand , getTopCard(deck) );
 addCardToHand(pHand , getTopCard(deck) );
 addCardToHand(dHand , getTopCard(deck) );
}
/*This function is for further Hit actions. Adds the drawnCard to the desired hand. The value of drawnCard is returned
from the getTopCard() function*/
void addCardToHand(int hand[], int drawnCard)
{
 for(int x=0; x<=10; x++)
 {
 if(hand[x]!=0)
 {
 continue;
 }
 if(hand[x]==0)
 {
 hand[x]=drawnCard;
 break;
 }
 }
}
/*This function determines the values of cards. Since suits that reside in the 100s part are not relevant to the value
of the cards and are only required for seperating two cards with same value, in order to remove them from the information
that we'll print, we use % on card values*/
void showCard(int card)
{
 if(card==0) cout << " ";
 else
 switch(card%100)
 {
 case 1:
 cout << "A ";
 break;
 case 11:
 cout << "J ";
 break;
 case 12:
 cout << "Q ";
 break;
 case 13:
 cout << "K ";
 break;
 default:
 cout << card%100 << " ";
 }
}
/*Prints both hands*/
void printHands(int pHand[],int dHand[])
{
 cout << "Dealer's hand: ";
 for(int y=0; y<10; y++)
 {
 showCard(dHand[y]);
 }
 cout << getHandValue(dHand) << endl;
 cout << endl << "Player's hand: ";
 for(int x=0; x<10; x++)
 {
 showCard(pHand[x]);
 }
 cout << getHandValue(pHand) << endl;
}
/*Sums all the values of cards in the hand and returns it as an integer*/
int getHandValue(int hand[])
{
 int sum=0;
 for(int x=0; x<10; x++)
 {
 if(hand[x]%100==11) sum+=10;
 if(hand[x]%100==12) sum+=10;
 if(hand[x]%100==13) sum+=10;
 else sum+=hand[x]%100;
 }
 return sum%100;
}

Now when I execute it, I get the following:

Dealer's hand: K 3 13
Player's hand: 5 Q 27

The dealer's hand is correct, however since 5 + Q should be 15 and not 27, there is something wrong that causes a wrong print but I failed to find it so far. Can anyone help?

asked Dec 25, 2015 at 16:17
3
  • Why are there 14 cards per suit? Standard decks have 13... Commented Dec 25, 2015 at 21:30
  • @CanadianLuke Actually there are 13 cards generated per suit by makedeck(). It is just a typo at where it states 14 cards are being generated. Commented Dec 26, 2015 at 10:22
  • Whoops, you're right! Misread the loop Commented Dec 26, 2015 at 18:42

2 Answers 2

5

You used if where you needed else if

 if(hand[x]%100==11) sum+=10;
 if(hand[x]%100==12) sum+=10;
 if(hand[x]%100==13) sum+=10;
 else sum+=hand[x]%100;

should be

 if(hand[x]%100==11) sum+=10;
 else if(hand[x]%100==12) sum+=10;
 else if(hand[x]%100==13) sum+=10;
 else sum+=hand[x]%100;

If you want to also handle ace correctly:

/*Sums all the values of cards in the hand and returns it as an integer*/
int getHandValue(int hand[])
{
 bool ace=false;
 int sum=0;
 for(int x=0; x<10; x++)
 {
 if(hand[x]%100==1) ace=true;
 if(hand[x]%100>=11) sum+=10;
 else sum+=hand[x]%100;
 }
 if ( sum<12 && ace ) sum+=10;
 return sum;
}
answered Dec 25, 2015 at 16:35
1
  • When one of the if statements happen, others don't and else always gets called. How did I miss that? Thank you! Commented Dec 25, 2015 at 16:37
4

In the above code you have used 3 if statements with 1 else statement where you wanted to use 'else if' statements (Only one of the if statements are possible for each value of hand[x]).

if(hand[x]%100==11) sum+=10;
if(hand[x]%100==12) sum+=10;
if(hand[x]%100==13) sum+=10;
else sum+=hand[x]%100;

else if statements like this will work:

if (hand[x]%100==11) 
 sum+=10;
else if (hand[x]%100==12) 
 sum+=10;
else if (hand[x]%100==13) 
 sum+=10;
else sum+=hand[x]%100;
answered Dec 25, 2015 at 16:48

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.