我需要帮助在 21 点中洗牌,C
I need help shuffling integers in blackjack, C
我有三种不同的功能,一种是填满牌组,一种是洗牌,一种是发牌。我已经在函数 fillDeck 中实现了我的 int value
并且工作正常。但是当我在与 deck 相同的函数中洗牌时它不起作用,我没有收到任何错误但是当我调试 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
您告诉编译器您没有更改值的整数:
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]
由于 value
是您的结构 Card
的一部分,因此单独洗牌 Cards
数组就足够了。我看不到你的完整代码,但我认为没有必要洗牌 'valus'。像这样调整您的函数 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
是 int
而不是 int*
的数组
void fillDeck(Card * const Deck, const char *suit[], const char *deck[], const int value[] );
// ^
将您的 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
类型已经包含卡片的值。
我有三种不同的功能,一种是填满牌组,一种是洗牌,一种是发牌。我已经在函数 fillDeck 中实现了我的 int value
并且工作正常。但是当我在与 deck 相同的函数中洗牌时它不起作用,我没有收到任何错误但是当我调试 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
您告诉编译器您没有更改值的整数:
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]
由于 value
是您的结构 Card
的一部分,因此单独洗牌 Cards
数组就足够了。我看不到你的完整代码,但我认为没有必要洗牌 'valus'。像这样调整您的函数 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
是 int
而不是 int*
void fillDeck(Card * const Deck, const char *suit[], const char *deck[], const int value[] );
// ^
将您的 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
类型已经包含卡片的值。