【问题标题】:I need help shuffling integers in blackjack, C我需要帮助在二十一点中洗牌整数,C
【发布时间】:2016-04-12 04:02:39
【问题描述】:

我有三种不同的功能,一种是装满牌组,一种是洗牌,一种是发牌。我已经在函数 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

【问题讨论】:

  • 对于不完整的代码,很难提出任何有用的建议。请发帖Minimal, Complete, and Verifiable example
  • 不清楚value 数组在函数shuffle() 中代表什么,但是您执行简单的赋值而不是执行与Deck 相同的交换类型是非常可疑的。
  • 在您的fillDeck 函数中,您有Deck[s].suits = deck[s % 13];Deck[s].decks = suit[s / 13];。这些看起来有点混乱。
  • 为什么你的shuffle函数需要两个参数?您只需要将指针传递给您的卡片数组(第一个元素)。我还将更改洗牌例程以将Deck[0]Deck[rand() % 52]Deck[1]Deck[1 + rand() % 51]Deck[2]Deck[2 + rand() % 50] 等交换。您可以通过将j = rand() % 52 更改为j = i + rand() % (52 - i) 来做到这一点你的循环。

标签: c struct shuffle blackjack


【解决方案1】:

你告诉编译器你没有改变值的整数:

const int *value

你改变了其中之一:

value[i] = value[j];

另外,你不想交换value[i]value[j]吗?

你还有其他地方滥用了 const。

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

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

【讨论】:

    【解决方案2】:

    由于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 的第四个参数的类型从const int *value[] 更改为const int value[],因为cardvalueint 的数组,而不是int* 的数组

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

    【讨论】:

      【解决方案3】:

      将您的 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);
      

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

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 1970-01-01
        • 2016-04-13
        • 2020-09-26
        • 1970-01-01
        • 2013-04-29
        • 2011-02-02
        • 2018-04-02
        • 2020-06-18
        相关资源
        最近更新 更多