首先,这是我的代码:
#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;
}
基本上,这是一个“模拟”二十一点牌局的代码。它开始时,rand()
会选择两个数字,即卡牌的等级和花色,并将它们设为矩阵中的 true,以便不能在同一组合中再次选择,然后打印出来。
有一个检查卡牌总等级的功能(因此如果超过21,你就会自动输掉),然后询问你是否要再要一张牌或者停止。
问题在于:如果你选择再要一张牌,那么这张新牌将与上一张相同。基本上,你得到了黑桃A和方块2,然后你想再要一张牌,你又得到了方块2。如果你在第二个 while 循环中删除等级检查,你可以看到等级是根据上一张牌的等级增长的。
之前,printf 在 print_hand()
函数中,你可以看到你总是得到相同的牌,现在我将它们移到了 main_hand()
函数中,因为我认为这可能是问题所在(但实际上不是),而且将打印单独作为一个函数是多余的。但你可以看到技术上说,if(!in_hand[suit][rank])
是有效的,因为由于卡牌相同,它不会进入 if 并且不会被打印出来。
我不知道是什么原因导致了这个问题。有什么想法吗?
请注意,我已经使用 srand((unsigned) time(NULL));
来生成 rand()
的种子。
main_hand
程序只会随机选择一张卡牌,即使它已经被选过了。你需要重试直到找到一张未被选中的卡牌(虽然有些粗糙,但可以完成任务),或者维护一个“自由”卡牌数组供你选择。 - Jongware