牌组(链表)(节点)洗牌



我又回来了。所以我用链表的方式创建了一副扑克牌,使用纸牌作为节点。然而,我在使用我的随机洗牌功能时遇到了麻烦。该函数应该创建两个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

你的问题在这里:

while (leftHalf.getSIZE() > 0 && rightHalf.getSIZE() > 0){

如果你已经从leftHalf中抽了所有的牌,但rightHalf中仍然有一些牌,那么你的循环结束。在这种情况下,你的洗牌Deck不包含所有的牌。
在这个循环之后,您需要实现两个循环,例如:

while (leftHalf.getSIZE() > 0)
    // Draw all remaining cards from leftHalf
while (rightHalf.getSIZE() > 0)
    // Draw all remaining cards from rightHalf

=============================================
你也可以在这里得到一个"空指针访问"错误:

d.addCard(draw->getVALUE(), draw->getSUIT());

因为draw可以为空。

=============================================

for (int l = SIZE; l > 0; l--){

你抽的牌太多了。您可以从j而不是SIZE开始循环。

==============================================
另一个问题在这里:

int probPile = leftHalf.getSIZE()/(leftHalf.getSIZE() + rightHalf.getSIZE())*100;

probPile总是0,因为你使用整数除法(例如,如果我们使用整数除法,5/100是0)。其中的一种解决方法是使用浮点除法。你可以在除法之前将int的值转换为double,例如,将1.0乘以,然后将结果转换回int:

int probPile = static_cast<int>(leftHalf.getSIZE() * 1.0 /(leftHalf.getSIZE() + rightHalf.getSIZE())*100);

或者你可以在除法前乘以100:

int probPile = leftHalf.getSIZE() * 100/(leftHalf.getSIZE() + rightHalf.getSIZE());

相关内容

  • 没有找到相关文章

最新更新