2

这是我创建的一个函数,用于尝试从一副牌中处理 n 张牌。当发牌时,它应该从牌堆中“移除”(即不能再次发牌)。我想我通过使用指针解决了这个问题,并通过从牌组后面抽牌减去我迄今为止处理的牌数。如果我再次调用该函数,我需要从缺少卡片的牌组中抽牌,并且由于我不会在任何时候洗牌,我认为这种方法会起作用。

'dealt' 在我的代码前面定义过,从 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

然而,“甲板”是这样订购的:

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 C7 C5 S8 SK HK C8 H4 H2 H7 H6 C3 H5 C9 D2 S4 C6 DT SQ SA DK DJ D9 HJ D3 CK ST

我处理的第一手牌是正确的,但其他手牌不正确。无论如何,“交易”都应该通过甲板类进行,所以我哪里错了?

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;
4

3 回答 3

0

您的第二个 for 循环中有一个错误:

for (int i = 0; i < 52 /* change from 51 to 52 */ - dealt; i++){
    deck[i] = oldDeck[i];
}
于 2013-05-08T04:04:53.937 回答
0

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

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 类会简单得多。但就个人而言,我更喜欢使用链表或类似的堆栈。

于 2013-05-08T04:06:04.997 回答
0

我会使用 2 个数组采取非常不同的方法。第一个数组保存甲板,第二个数组保存已处理/未处理标志。

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

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

于 2013-05-08T03:49:08.667 回答