【发布时间】:2014-05-07 10:53:35
【问题描述】:
我又回来了。所以我使用卡片作为节点以链表方式创建了一个卡片组。但是,我的 riffle shuffle 功能有问题。该函数应该创建两个 Deck 对象,每个对象存储我的 Deck drawPile 的一半。然后,这两个半堆应该一次取出一张牌并将其添加回drawPile。我没有收到错误,但它根本没有洗牌。我这样调用函数:drawPile.shuffle(drawPile);
Deck::Deck()
{
top = NULL;
SIZE = 0;
}
Deck::Deck(Card *n)
{
top = n;
}
void Deck::shuffle(Deck &d)
{
srand((unsigned)time(0));
for (int i = 0; i < 7; i++){
//split deck in half -- leftHalf and rightHalf
Deck leftHalf, rightHalf;
int j = SIZE/2;
for (int k = SIZE; k > j; k--){
drawCard(leftHalf); //drawCard off Deck and addCard to leftHalf
}
for (j; j > 0; j--){
drawCard(rightHalf); //drawCard off Deck and addCard to rightHalf
}
while (leftHalf.getSIZE() > 0 && rightHalf.getSIZE() > 0){
int probPile = leftHalf.getSIZE()/(leftHalf.getSIZE() + rightHalf.getSIZE())*100;
int randomNum = rand() % 100 + 1;
if (randomNum <= probPile){
leftHalf.drawCard(d); //drawCard off leftHalf and addCard to Deck
}
else{
rightHalf.drawCard(d); //drawCard off rightHalf and addCard to Deck
}
}
while (leftHalf.getSIZE() > 0){
leftHalf.drawCard(d);
}
while (rightHalf.getSIZE() > 0){
rightHalf.drawCard(d);
}
}
}
void Deck::drawCard(Deck &d)
{
Card *draw = top;
if (draw != NULL){
top = top->getNext();
SIZE--;
d.addCard(draw->getVALUE(), draw->getSUIT());
}
}//end drawCard
void Deck::addCard(int val, string s)
{
top = new Card(val, s, top);
SIZE++;
}//end addCard
【问题讨论】:
-
与其制作自己的容器,不如考虑使用(或至少包装)standard container,例如
std::vector。 -
至于您的问题,您是否尝试过在调试器中逐行执行代码?只用一个小“牌组”(比如十张“牌”)就可以更容易。
-
这是一个类,我不允许使用链表以外的任何结构。 ://
-
忽略你试图创造的任何人为的概率,最终这是分裂牌组,然后随机抽取一堆或另一堆,直到一侧用尽,最后附加剩余的无论哪一边有最后一张牌,你就完成了。这对吗?如果是这样,这方式比它需要的更复杂。 (看起来你忘记附加至少剩下一张牌的“一半”作为最后一招)。
-
是的,这就是目标。但是,我不确定如何附加您提到的“一半”。
标签: c++ linked-list shuffle dynamic-allocation