从一副牌(非重复牌)处理

时间:2013-05-08 03:37:30

标签: c++ class pointers

这是我创建的一个功能,试图从卡类卡中处理n张牌。当发牌时,它应该从牌组中“移除”(即不能再发牌)。我以为我通过使用指针解决了这个问题,并从甲板的后面画了减去我到目前为止所处理的牌数。如果我再次调用该函数,我需要从缺少卡片的卡片中抽取,因为我不会在任何时候洗牌,我认为这种方法会起作用。

'deals'在我的代码中已经定义,从0开始。 卡是一个拥有某种诉讼和价值的阶级。

当我调用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;

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

你的第二个for循环中有一个off-by-one错误:

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

答案 2 :(得分: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类将更加简单。 但就个人而言,我更喜欢使用链表或类似的堆栈。