首先,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define NUM_SUITS 4
#define NUM_RANKS 13
bool in_hand[NUM_SUITS][NUM_RANKS] = {false};
bool newcard = {false};
int num_cards, rank, suit, totrank;
const char rank_code[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K',};
const char suit_code[] = {'C','D','H','S'};
int main_hand ()
{
suit = rand() % NUM_SUITS;
rank = rand() % NUM_RANKS;
if (!in_hand[suit][rank]) {
in_hand[suit][rank] = true;
num_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]);
}
}
}
int print_hand (suit)
{
}
int totrank_check (totrank)
{
if (totrank > 21) {
printf ("You lose!");
}
else if (totrank == 21) {
printf ("You win!");
}
}
int main()
{
bool stay = {false};
srand((unsigned) time(NULL));
totrank = 0;
num_cards = 2;
printf("Your hand: ");
while (num_cards > 0) {
main_hand();
totrank = totrank + (rank + 1);
}
printf("Total rank: %d\n", totrank);
totrank_check(totrank);
printf("\n");
while (totrank < 24 && stay == false) {
printf("Another card? 1. Yes 0. No\n");
scanf("%d", &newcard);
if(!newcard) {
main_hand();
}
totrank = totrank + (rank + 1);
totrank_check(totrank);
printf("Total rank: %d\n", totrank);
printf("Stay? 1. Yes 0. No\n");
scanf("%d", &stay);
}
return 0;
}
基本上它是一个模拟&#34;模拟&#34;和二十一点的手。
它开始,rand()
选择两个数字,即卡片的等级和套装,在矩阵中设置为true,这样就不能再以相同的组合选择它们然后打印。
检查卡的总排名(如果超过21,则自动丢失)然后会询问您是否需要另一张卡或者您想留下。
这里出现错误:如果您选择要另外一张卡,这张新卡将与最后一张卡相同。 基本上,你得到一个黑桃王牌和两个钻石,然后你想要另一张牌,你得到另外两个钻石。而另一个,另一个。如果您在第二个中删除了排名检查,而您可以看到排名根据最后一张卡的排名而增长。
之前,printfs在print_hand()
函数中,你可以看到你总是得到同一张卡,现在我把它们移到了main_hand()
函数中因为我认为它可能是问题(它不是)并且因为具有单独的打印功能是多余的。但是你可以从技术上看,if(!in_hand[suit][rank])
有效,因为,由于卡片是相同的,它不会输入if而且它不会被打印。
我不知道造成这个问题的原因。有什么想法吗?
请注意我已经使用srand((unsigned) time(NULL));
种子rand()
。
答案 0 :(得分:3)
scanf("%d", &newcard);
和scanf("%d", &stay);
是一个问题,因为变量是bool
,但格式说明符适用于int
。在2个地方,改变如:
// scanf("%d", &newcard);
int t;
scanf("%d", &t);
newcard = !!t;
3个函数返回int
但不返回任何内容。更改为无效功能。
// int main_hand() {
void main_hand() {
似乎还存在其他逻辑问题 1)代码有时存在而不知道是否赢了 2)@Jongware评论以上正确:
最后:如果仍然出现相同的随机序列,请将代码剥离为裸main srand time printf rand
并查看是否有效。 time()
,如果不工作,则总是返回-1
或者简单地添加以下内容并验证使用不同值调用的srand()
。
int main(void) {
unsigned now = (unsigned) time(NULL);
printf("now = %u\n", now);
srand(now);