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