我需要帮助改组二十一点中的整数,C

时间:2016-01-07 16:45:55

标签: c struct shuffle blackjack

我有三种不同的功能,一种是填充套牌,一种是太随机,一种是太牌。我在函数fillDeck中实现了我的int value,并且工作正常。但是当我在与它不起作用的同一个函数中重新调整我的值时,我没有得到任何错误但是当我调试visual studio时它说它无法读取内存。我做错了什么?

fillDeck函数

void fillDeck(Card * const Deck, const char *suit[], const char *deck[], const int *value[]){

int s;

for (s = 0; s < 52; s++){
    Deck[s].suits = deck[s % 13];
    Deck[s].decks = suit[s / 13];
    Deck[s].value = value[s % 13];
}
return;
}

随机播放功能

void shuffle(Card * const Deck, const int *value[]){
int i, j;
Card temp;

for (i = 0; i < 52; i++){
    j = rand() % 52;
    temp = Deck[i];
    Deck[i] = Deck[j];
    Deck[j] = temp;
    value[i] = value[j]; // <-- this is not working
}
return;
}

交易功能

void deal(const Card * const Deck, int size, int size_1, int size_2){

int i, j, length;
char anotherCard[2];
char name1[30];
char name2[30];

printf("Name player one > ");
scanf("%s", name1);
printf("Name player two > ");
scanf("%s", name2);

printf("\nWelcome %s and %s, lets begin!\n\n", name1, name2);
getchar();

    printf("%s's card:\n", name1);
    for (i = 0; i < size; i++){
        printf("%5s of %-8s%c", Deck[i].decks, Deck[i].suits, (i + 1) % 2 ? '\t' : '\n');
    }
return;
}

主要功能

int main(void){

Card allCards[52];
Card cardValue[52];
char *suitname[] = { "spades", "hearts", "diamonds", "clubs" };
char *deckname[] = { "ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king" };
int cardvalue[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };

srand(time(NULL));

fillDeck(allCards, suitname, deckname, cardvalue);
shuffle(allCards, cardValue);
deal(allCards, 2, 4, 6);


getchar();
return 0;
}

func.h文件

#ifndef FUNC_H
#define FUNC_H

typedef struct card{
    const char *suits;
    const char *decks;
    int value;
};

typedef struct card Card;

void fillDeck(Card * const Deck, char *suit[], char *deck[], const int *value[]);

void shuffle(Card * const Deck, const int *value[]);

void deal(const Card * const Deck, int size, int size_1, int size_2);

#endif

3 个答案:

答案 0 :(得分:0)

你告诉编译器你没有用以下方法改变价值:

const int *value

你改变了其中一个:

value[i] = value[j];

另外,您不想交换 value[i]value[j]

你还有其他地方滥用const。

最后,另一种调试程序的方法是在其中输入有趣的值等等。例如:

printf("about to swap value[%d]=(%d) and value[%d]=(%d)\n",
    i, j, value[i], value[j]);
value[i] = value[j]

答案 1 :(得分:0)

由于value是您的结构Card的一部分,因此只需对Cards数组进行随机播放就足够了。我无法看到您的完整代码,但我认为没有必要随意调整任何“价值”。像这样调整你的函数shuffle

void shuffle( Card * const Deck ){
   for (int i = 0; i < 52; i++){
        int j = rand() % 52;
        Card temp = Deck[i];
        Deck[i] = Deck[j];
        Deck[j] = temp;
    }
    return;
}

根据此更改,您的功能deal如下:

void deal(const Card * const Deck, int size, int size_1, int size_2) {
    ...
    printf("%s's card:\n", name1);
    for (i = 0; i < size; i++){
        printf to printf("%5s of %-8s %d %d", Deck[i].decks, Deck[i].suits, Deck[i].value, (i + 1) % 2 ? '\t' : '\n'); 
                                                                         // ^^^^^^^
    }
    ...
}

除此之外,您必须将函数fillDeck的第4个参数的类型从const int *value[]更改为const int value[],因为cardvalue是{{1}的数组而不是int

的数组
int*

答案 2 :(得分:0)

将您的shuffle更改为以下内容:

void shuffle(Card * Deck){
    int i, j;
    Card temp;

    for (i = 0; i < 52; i++){
        j = i + rand() % (52 - i);
        temp = Deck[i];
        Deck[i] = Deck[j];
        Deck[j] = temp;
    }
}

并将其称为:

shuffle(allCards);

无需传递值数组 - Card类型已包含卡片的值。