首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >牌(节点)牌(链表)

牌(节点)牌(链表)
EN

Stack Overflow用户
提问于 2014-03-28 05:38:35
回答 1查看 1.6K关注 0票数 0

我又回来了。所以我用卡片作为节点,以链表的方式创建了一个卡片。不过,我的洗牌功能有问题。该函数应该创建两个Deck对象,每个对象存储我的Deck drawPile的一半。然后,这两个半堆应该一次取下一张卡片,并将其添加到drawPile中。我没有得到一个错误,但它根本没有洗牌。我这样调用函数:drawPile.shuffle(drawPile);

代码语言:javascript
代码运行次数:0
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-28 06:25:48

你的问题是:

代码语言:javascript
代码运行次数:0
运行
复制
while (leftHalf.getSIZE() > 0 && rightHalf.getSIZE() > 0){

如果您已经从leftHalf中提取了所有的卡片,但是rightHalf仍然包含一些卡片,那么您的循环就结束了。在这种情况下,您的洗牌Deck并不包含所有的卡片。

例如,在这个周期之后,您需要实现这样的两个循环:

代码语言:javascript
代码运行次数:0
运行
复制
while (leftHalf.getSIZE() > 0)
    // Draw all remaining cards from leftHalf
while (rightHalf.getSIZE() > 0)
    // Draw all remaining cards from rightHalf

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

此外,您还可以在这里获得"Null指针访问“错误:

代码语言:javascript
代码运行次数:0
运行
复制
d.addCard(draw->getVALUE(), draw->getSUIT());

因为draw可以是空的。

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

也是在这里:

代码语言:javascript
代码运行次数:0
运行
复制
for (int l = SIZE; l > 0; l--){

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

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

另一个问题是:

代码语言:javascript
代码运行次数:0
运行
复制
int probPile = leftHalf.getSIZE()/(leftHalf.getSIZE() + rightHalf.getSIZE())*100;

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

代码语言:javascript
代码运行次数:0
运行
复制
int probPile = static_cast<int>(leftHalf.getSIZE() * 1.0 /(leftHalf.getSIZE() + rightHalf.getSIZE())*100);

或者除法前可以乘以100:

代码语言:javascript
代码运行次数:0
运行
复制
int probPile = leftHalf.getSIZE() * 100/(leftHalf.getSIZE() + rightHalf.getSIZE());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22705021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档