Handling aces and finding a segfault in a blackjack program
Posted
by Bill Adams
on Stack Overflow
See other posts from Stack Overflow
or by Bill Adams
Published on 2010-04-11T23:00:53Z
Indexed on
2010/04/11
23:43 UTC
Read the original article
Hit count: 505
Here's what i have so far... I have yet to figure out how i'm going to handle the 11 / 1 situation with an ace, and when the player chooses an option for hit/stand, i get segfault.
HELP!!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define DECKSIZE 52
#define VALUE 9
#define FACE 4
#define HANDSIZE 26
typedef struct {
int value;
char* suit;
char* name;
}Card;
typedef struct {
int value;
char* suit;
char* name;
}dealerHand;
typedef struct {
int value;
char* suit;
char* name;
}playerHand;
Card cards[DECKSIZE];
dealerHand deal[HANDSIZE];
playerHand dealt[HANDSIZE];
char *faceName[]={"two","three", "four","five","six", "seven","eight","nine",
"ten", "jack","queen", "king","ace"};
char *suitName[]={"spades","diamonds","clubs","hearts"};
void printDeck(){
int i;
for(i=0;i<DECKSIZE;i++){
printf("%s of %s value = %d\n ",cards[i].name,cards[i].suit,cards[i].value);
if((i+1)%13==0 && i!=0) printf("-------------------\n\n");
}
}
void shuffleDeck(){
srand(time(NULL));
int this;
int that;
Card temp;
int c;
for(c=0;c<10000;c++){ //c is the index for number of individual card shuffles should be set to c<10000 or more
this=rand()%DECKSIZE;
that=rand()%DECKSIZE;
temp=cards[this];
cards[this]=cards[that];
cards[that]=temp;
}
}
/*void hitStand(i,y){ // I dumped this because of a segfault i couldn't figure out.
int k;
printf(" Press 1 to HIT or press 2 to STAND:");
scanf("%d",k);
if(k=1){
dealt[y].suit=cards[i].suit;
dealt[y].name=cards[i].name;
dealt[y].value=cards[i].value;
y++;
i++;
}
}
*/
int main(){
int suitCount=0;
int faceCount=0;
int i;
int x;
int y;
int d;
int p;
int k;
for(i=0;i<DECKSIZE;i++){ //this for statement builds the deck
if(faceCount<9){
cards[i].value=faceCount+2;
}else{ //assigns face cards as value 10
cards[i].value=10;
}
cards[i].suit=suitName[suitCount];
cards[i].name=faceName[faceCount++];
if(faceCount==13){ //this if loop increments suit count once
cards[i].value=11; //all faces have been assigned, and also
suitCount++; //assigns the ace as 11
faceCount=0;
} //end building deck
}
/*printDeck(); //prints the deck in order
shuffleDeck(); //shuffles the deck
printDeck(); //prints the deck as shuffled
This was used in testing, commented out to keep the deck hidden!*/
shuffleDeck();
x=0;
y=0;
for(i=0;i<4;i++){ //this for loop deals the first 4 cards,
dealt[y].suit=cards[i].suit; //first card to player, second to dealer,
dealt[y].name=cards[i].name; //as per standard dealing practice.
dealt[y].value=cards[i].value;
i++;
y++;
deal[x].suit=cards[i].suit;
deal[x].name=cards[i].name;
deal[x].value=cards[i].value;
x++;
}
printf(" Dealer's hand is: %s of %s and XXXX of XXXX. (Second card is hidden!)\n",deal[0].name,deal[0].suit,deal[1].name,deal[1].suit);
printf(" Player's hand is: %s of %s and %s of %s.\n",dealt[0].name,dealt[0].suit,dealt[1].name,dealt[1].suit);
printf(" the current value of the index i=%d\n",i); //this line gave me the value of i for testing
d=deal[0].value+deal[1].value;
p=dealt[0].value+dealt[1].value;
if(d==21){
printf(" The Dealer has Blackjack! House win!\n");
}else{
if(d>21){
printf(" The dealer is Bust! You win!\n");
}else{
if(d>17){
printf(" Press 1 to HIT or 2 to STAND");
scanf("%d",k);
if(k==1){
dealt[y].suit=cards[i].suit;
dealt[y].name=cards[i].name;
dealt[y].value=cards[i].value;
y++;
i++;
}
}else{
if(d<17){
printf(" Dealer Hits!");
deal[x].suit=cards[i].suit;
deal[x].name=cards[i].name;
deal[x].value=cards[i].value;
x++;
i++;
}
}
}
}
return 0;
}
© Stack Overflow or respective owner