我正在研究C中的二十一点程序,只是因为,而且我被困在了奇怪的bug上。
这是代码(抱歉所有注释行,我正试图追踪这个错误):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define NUM_SUITS 4
#define NUM_RANKS 13
void deal(int *pnum_cards, int *prank) {
static bool in_hand[NUM_SUITS][NUM_RANKS] = {false};
const char rank_code[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K',};
int suit = 0, rank = 0;
srand((unsigned) time(NULL));
suit = rand() % NUM_SUITS;
rank = rand() % NUM_RANKS;
if (!in_hand[suit][rank]) {
in_hand[suit][rank] = true;
*pnum_cards = *pnum_cards - 1;
printf("Pnum_cards In deal %d\n", *pnum_cards);
if (suit == 0){
printf("%c of Clubs \n", rank_code[rank]);
}
else if (suit == 1){
printf("%c of Diamonds \n", rank_code[rank]);
}
else if (suit == 2){
printf("%c of Hearts \n", rank_code[rank]);
}
else if (suit == 3){
printf("%c of Spades \n", rank_code[rank]);
}
}
// return rank;
// printf("Rank In deal %d\n", rank);
*prank = rank+1;
printf("prank in deal %d\n", *prank);
}
}
int main() {
int t, newcard;
int stay = {false};
int f;
int rank = 0, *prank = &rank;
int totrank = 0, *ptotrank = &totrank;
int num_cards = 2, *pnum_cards = &num_cards;
printf("Prima del while %d\n", *pnum_cards);
printf("Your hand: ");
while (*pnum_cards > 0) {
deal(&num_cards, &rank);
// printf("Nel while: %d\n", *pnum_cards);
//totrank_check(&totrank, &rank);
}
printf("\n");
}
return 0;
}
技术上它起作用。问题是,当我到达
时,我无法弄清楚原因 printf("prank in deal %d\n", *prank);
这是函数deal()中的最后一个printf,它在第一个while循环中执行某些操作,它会打印该短语一千次,然后突然停止,它退出函数,执行第二个循环,调用再次运行,打印它所拥有的一切,到达最后一个printf,它打印一次并停止,就像预期一样。
所以我认为这不是while循环的问题,因为它基本上有效,它只是暂时停留在printf上一段时间。它可能是什么?
答案 0 :(得分:3)
time ( NULL)
返回秒数
一秒srand ( time ( NULL))
会获得相同的种子
对于相同的种子,rand将生成相同的随机数列表
将srand ( time ( NULL))
移动到main,以便只调用一次,而不是每次调用交易函数。