C++ 循环在多次(非常精细)迭代后崩溃/损坏
我正在为一个学校项目做一个程序,该项目旨在输出21点游戏中的所有牌值,并告诉你一些关于这些牌的可能组合的事情 该循环设计用于将一张卡放入手牌,并在放入另一张卡之前检查一些不同的可能性,然后执行相同的操作。当达到五张卡时,它清除手牌并移动到一组新的卡值,直到它使用了牌组中的所有卡 现在每第四张和第五张牌都会在循环过程中被打破。请记住,尽管我正在使用指针、数组和类(以及更多),但我仍然不能完全理解所有的事情,即使我已经通读了《C++早期对象第八版》一书,直到第10章 这是一个发生的输出示例,它表明记分员记分正确,但放在手上的卡在循环的第五次迭代中开始出错,这似乎反映在分数中 AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AH2H3H4H5H6H7H8H9HTHJHQHKH AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD 同2s3s4s5s6s7s8s9sJSQSKS AC:AC:1:11:0:0:1:1 2C:AC2C:3:13:0:0:2:1 3C:AC2C3C:6:16:0:0:3:1 4C:AC2C3C4C:10:20:0:0:4:1 5C:AC2C3C AC:7:20:0:1:5:0 清理手 6C:6C:6:6:0:0:1:1 7C:6C7C:13:13:0:0:2:1 8C:6C7C8C:21:21:0:0:3:1 9C:6C7C8C9C:30:30:1:0:4:1 TC:6C7C8C C6C:27:27:1:1:5:0 ……这里还有几个,但我把它们拿出来了,因为它一次又一次地出现在同一个问题上 清理手 QS:QS:10:10:0:0:1:1 KS:QSKS:20:20:0:0:2:1 …就在这里,它崩溃了,而不是完成手 为了让它更容易阅读,我将告诉你每一部分(用冒号分隔)在一行中代表什么 ((显示第一张/下一张卡)X:0:0:0:0:0:0:0:0:0 (显示手里的任何东西)0:X:0:0:0:0:0:0:0 (假设任何A都是1的分数)0:0:X:0:0:0:0:0:0:0 (假设手上第一张A是11分,其他都是1分)0:0:0:X:0:0:0:0:0:0 (表示手是否半身像的布尔值)0:0:0:0:X:0:0:0:0 (代表一手完整的牌)0:0:0:0:0:X:0:0 (手中的牌数)0:0:0:0:0:0:0:X:0 (确定是否可以提取另一张卡的布尔值)0:0:0:0:0:0:0:X 最上面的部分只是显示所有可能的卡值,并且似乎工作正常。我想知道的是,为什么第五次迭代似乎很难将第四张牌单独留下,而没有弄乱第五张牌,当然,为什么它会崩溃。这是我的密码 我的主文件必须是正确的,因为老师给了我们,我们不应该弄乱它:C++ 循环在多次(非常精细)迭代后崩溃/损坏,c++,arrays,pointers,for-loop,C++,Arrays,Pointers,For Loop,我正在为一个学校项目做一个程序,该项目旨在输出21点游戏中的所有牌值,并告诉你一些关于这些牌的可能组合的事情 该循环设计用于将一张卡放入手牌,并在放入另一张卡之前检查一些不同的可能性,然后执行相同的操作。当达到五张卡时,它清除手牌并移动到一组新的卡值,直到它使用了牌组中的所有卡 现在每第四张和第五张牌都会在循环过程中被打破。请记住,尽管我正在使用指针、数组和类(以及更多),但我仍然不能完全理解所有的事情,即使我已经通读了《C++早期对象第八版》一书,直到第10章 这是一个发生的输出示例,它表明记
#include <iostream>
#include "BlackJackHand.h"
#include "PlayingCard.h"
using namespace std;
int main() {
// Create a Blackjack hand object
BlackJackHand myHand;
// arrays of values and suits for normal cards
char
*values = "A23456789TJQK",
*suits = "CHDS";
const int DECK_SIZE = 52;
const int SUIT_SIZE = 13;
PlayingCard *deck[DECK_SIZE]; // array of pointers to class objects
// Initialize and display a card deck
int
i,
j;
for(i = 0; i < 4; i++) {
for(j = 0; j<SUIT_SIZE; j++) {
deck[i * SUIT_SIZE + j] = new PlayingCard(values[j], suits[i]);
cout << deck[i * SUIT_SIZE + j]->getCardCode();
cout << " ";
}
cout << endl;
}
cout << endl;
// Add each from deck to hand, then remove card from hand
// before adding next card. Check funcs.
for(i = 0; i < DECK_SIZE; i++) {
cout << deck[i]->getCardCode();
myHand.addCard(deck[i]);
deck[i] = NULL; // Remove card from deck
cout << " : ";
cout << myHand.getAllCardCodes();
cout << " : " << myHand.getLowScore()
<< " : " << myHand.getHighScore()
<< " : " << myHand.isBust()
<< " : " << myHand.isFull()
<< " : " << myHand.getCardCount()
<< " : " << myHand.canTakeCard()
<< endl;
if(!myHand.canTakeCard()) {
cout << "\nClearing hand\n";
myHand.clearHand();
}
} // end for
cout << "\nClearing hand\n";
myHand.clearHand();
PlayingCard
*card1 = new PlayingCard('J', 'C'),
*card2 = new PlayingCard('A', 'S'),
*card3 = new PlayingCard('A', 'D');
BlackJackHand hand2 = BlackJackHand(card1,card2);
card1 = card2 = 0;
cout << hand2.getAllCardCodes();
cout << " : " << hand2.getLowScore()
<< " : " << hand2.getHighScore()
<< " : " << hand2.isBust()
<< " : " << hand2.isFull()
<< " : " << hand2.getCardCount()
<< " : " << hand2.canTakeCard()
<< endl;
cout << "\nAdding a second ace:\n";
hand2.addCard(card3);
card3 = 0;
cout <<hand2.getAllCardCodes();
cout << " : " << hand2.getLowScore()
<< " : " << hand2.getHighScore()
<< " : " << hand2.isBust()
<< " : " << hand2.isFull()
<< " : " << hand2.getCardCount()
<< " : " << hand2.canTakeCard()
<< endl;
for (int i = 0; i < DECK_SIZE; i++)
if (deck[i] != NULL)
delete deck[i];
return 0;
} // end main
#包括
#包括“BlackJackHand.h”
#包括“PlayingCard.h”
使用名称空间std;
int main(){
//创建21点手对象
黑手我的手;
//普通卡的值数组和套装
烧焦
*values=“A23456789TJQK”,
*诉讼=“CHDS”;
甲板内部构件尺寸=52;
服装尺寸=13;
PlayingCard*deck[deck_SIZE];//指向类对象的指针数组
//初始化并显示卡片组
int
我
J
对于(i=0;i<4;i++){
对于(j=0;j好的,这可能需要几次迭代。让我们看看……当我启动PlayingCard
并运行代码时,它不会崩溃。您说它会在以下时间后崩溃:
KS : QSKS : 20 : 20 : 0 : 0 : 2 : 1
这应该是牌组的结尾。在我的版本中,它继续清理牌组并制作一些新的牌。让我们确定它在这里崩溃。(我怀疑不是)。在代码中添加几行代码:
} // end for
cout << "deck is empty" << endl;
cout << "\nClearing hand\n";
myHand.clearHand();
cout << "done" << endl;
}//结束
您的代码太长了。请确保您没有越界访问。您需要先缩小范围!因此不是调试服务!if(getLowScore()<21 | | getLowScore())<21
似乎您希望其中一个是不同的函数,根据您的逻辑,您可以将一张卡添加到一手牌中,只要总数小于21。我认为您超出了数组的范围。我还鼓励您使用
进行大小比较,因为一旦您将一张卡错误地添加到fu中我会交给你的,因为精确的尺寸比较,它将不再完整。谢谢大家的快速反应,我会尽量缩小范围,但我很难做到这一点,因为我不知道我到底在做什么。我会试试你的建议退休忍者!一个是高分的,不确定我什么时候把它弄糟了。我改变了isfull()函数来检查它是否大于或等于5,因此它应该是一个更好的过滤器,但它仍然在同一个地方崩溃,并且执行相同的迭代错误我不确定您打算将此代码放在哪里,我不能将其添加到main,因为我根本不允许更改主文件…@DiJiT:复制主文件,然后monkey w为了测试的目的。我们不会告诉你。我不知道崩溃是不是正确的词,但是程序在我的计算机上在那一点之后“死亡”。好的,我会试试这个:)@DiJiT:如果它不继续说“清除手”并开始制作{JK,AS,AD}手,那么那里就出了问题。
KS : QSKS : 20 : 20 : 0 : 0 : 2 : 1
} // end for
cout << "deck is empty" << endl;
cout << "\nClearing hand\n";
myHand.clearHand();
cout << "done" << endl;
int main() {
// CUT!
PlayingCard
*card1 = new PlayingCard('J', 'C'),
*card2 = new PlayingCard('A', 'S'),
*card3 = new PlayingCard('A', 'D');
...
<< endl;
// comment these lines out, since the deck no longer exists:
// for (int i = 0; i < DECK_SIZE; i++)
// if (deck[i] != NULL)
// delete deck[i];
return 0;
} // end main