2013-05-08 54 views
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

我处理的第一手是正确的,但其他人没有。 'dealt'应该通过甲板课继续进行,无论如何,我会在哪里出错?

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

你的问题是什么? – user1118321 2013-05-08 03:41:51

+0

对不起。我试图弄清楚我在代码中做错了什么,不能正确处理卡片。 – user2105982 2013-05-08 03:47:57

+0

你必须为此使用数组吗?使用类似'std :: stack'或者'std :: vector'来持有你的卡片可能会容易得多。 – Xymostech 2013-05-08 03:51:50

回答

0

您的第二的差一错误的for循环:

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

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

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

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

+3

这在处理最后几张牌时效率很低 - 例如,在最后两张牌之间做出决定时,只有4%的随机数是有效的。 – Patashu 2013-05-08 03:50:59

+0

好点,其效率肯定会降低,因为卡被发放出去。但如果你不打算处理整个套牌,那么我认为这不是一个担心。 – 2013-05-08 03:58:19

+0

当设计未破解的算法非常容易编码时,为什么选择具有如此差的渐近行为的东西? – Patashu 2013-05-08 04:00:44

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类供您使用将更加简单。但个人而言,我更喜欢使用链表或类似的堆栈。