从一副牌中发牌(不重复的牌)

Dealing from a deck of cards (non repeating cards)

本文关键字:一副      更新时间:2023-10-16

这是我创建的一个函数,用于尝试从牌组类中发n张牌。当发牌时,它应该从牌组中"移除"(即不能再发牌)。我认为我通过使用指针解决了这个问题,并从牌组的后面减去我目前发的牌的数量。如果我再次调用这个函数,我需要从缺少牌的那副牌中抽取牌,因为我在任何时候都没有洗牌,所以我认为这个方法是可行的。

' dealing '在前面的代码中定义,从0开始。Card是一个持有一定花色和值的类。

当我调用dealNumber函数6次且n = 5时,我放置了处理手牌的示例输出。

ST CK D3 HJ D9
HK DK SA SQ DT
HK S4 D2 C9 H5
HK H6 H7 H2 H4
HK HK SK S8 C5
HK H9 S3 D8 H8

'deck'的顺序是这样的:

S6 S2 S7 D7 S9 CQ D4 CA CJ SJ HQ DQ D5 HA DA C4 HT H3 CT D6 C2 S5 H8 D8 S3 H9 C7C5 S8 SK HK C8 H4 H2 H7 H6 C3 H5 C9 D2 S4 C6 DT SQ SA DK DJ D9 HJ D3 CK ST

我发的第一手牌是对的,但其他的不是。无论如何,"处理"应该贯穿deck类,所以我哪里出错了?

Hand* Deck::dealingNumber(int p){   
Card* dealtCards = new Card[p];
Card* oldDeck = deck;
for (int i = 0; i<n; i++){
    dealtCards[i] = deck[(51-dealt)-i];
}
dealt = dealt+n;
deck = new Card[52-dealt];
for (int i = 0; i < 51-dealt;i++){
deck[i] = oldDeck[i];
}
delete[] oldDeck;
PokerHand* hand = new PokerHand(dealtCards);
return hand;

你的第二个for循环出现了一个off-by- 1错误:

for (int i = 0; i < 52 /* change from 51 to 52 */ - dealt; i++){
    deck[i] = oldDeck[i];
}

我将采用一个非常不同的方法使用两个数组。第一个数组保存牌组,第二个数组保存已发牌/未发牌标志。

char cards[52][3]; // 52 cards @ 3 characters each
int dealtFlag[52]; // 0=not dealt, 1=dealt

然后从0-51中选择一个随机数,检查dealtFlag[randNum]是否为零,如果为零则使用该卡。

不确定这本身就是问题所在。无论如何,这是一个问题:修改

for (int i = 0; i < 51-dealt;i++){
deck[i] = oldDeck[i];
}

for (int i = 0; i < 52-dealt;i++){
deck[i] = oldDeck[i];
}

使用STL类会简单得多。但就我个人而言,我更喜欢使用链表或类似的堆栈。