我又回来了。所以我用卡片作为节点,以链表的方式创建了一个卡片。不过,我的洗牌功能有问题。该函数应该创建两个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
发布于 2014-03-27 22:25:48
你的问题是:
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
=============================================
此外,您还可以在这里获得"Null指针访问“错误:
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());
https://stackoverflow.com/questions/22705021
复制