Обработка тузов и поиск ошибки в программе блэкджек - PullRequest
0 голосов
/ 12 апреля 2010

Вот что у меня есть ... Мне еще предстоит выяснить, как я собираюсь справиться с ситуацией 11/1 с тузом, и когда игрок выбирает вариант для удара / стойки, я получаю 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;*/              //trying something different

Card cards[DECKSIZE];
/*dealerHand deal[HANDSIZE];        //trying something different
playerHand dealt[HANDSIZE];*/  

char *faceName[]={"two","three", "four","five","six", "seven","eight","nine",
          "ten", "jack","queen", "king","ace"};
char *suitName[]={"spades","diamonds","clubs","hearts"};

Card *deal[HANDSIZE];
Card *dealt[HANDSIZE];

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]=&cards[i]; //first card to player, second to dealer, as per standard dealing practice.
        i++;
        y++;
        deal[x]=&cards[i];
        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]=&cards[i];
                    y++;
                    i++;

                }
            }else{
                if(d<17){
                    printf(" Dealer Hits!");
                    deal[x]=&cards[i];
                    x++;
                    i++;
                }       
            }
        }
    }

    return 0;

}

Ответы [ 3 ]

4 голосов
/ 12 апреля 2010

В целом: компиляция с включенными предупреждениями имеет тенденцию быть полезной (по умолчанию gcc вам мало помогает!).

Сравнить:

$ gcc -o blackjack blackjack.c
$ 

с:

$ gcc -Wall -o blackjack blackjack.c 
blackjack.c: In function 'main':
blackjack.c:124: warning: too many arguments for format
blackjack.c:139: warning: format '%d' expects type 'int *', but argument 2 has type 'int'
$ 

Это сразу же обнаруживает проблему scanf() (и еще одну!).

4 голосов
/ 12 апреля 2010

Чтобы исправить ошибку, используйте scanf("%d",&k); вместо scanf("%d",k);. . k сам по себе не является указателем - добавление & возвращает указатель на k.

Для обработки тузов, при каких условиях тузы переходят от значения в 11 к значению в 1? Какие строки в вашем коде вы ожидаете коснуться, чтобы включить это? Я могу придумать, как реализовать его, используя переменную, которая отслеживает, сколько тузов ушло на вычисление общего счета игрока, или другой способ - это пересчитать счет как раз вовремя, чтобы использовать его.

1 голос
/ 12 апреля 2010

См. этот вопрос о том, как справиться с ситуацией туза.

В качестве общего совета о вашем коде; у вас есть по существу одна и та же структура три раза (карта, дилер и рука, игрок и рука). Было бы достаточно определить структуру один раз для карты и, например, иметь указатели на карты, хранящиеся в качестве рук.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...