Your problem is in shuffle, specifically in the use of duplCheck.
void shuffle(string cards[][FACE])
{
int randFace, randSuit;
// These loops will assign random face values
// and suits to each place in cards[][].
for (int count1 = 0; count1 != SUIT; count1++)
for (int count2 = 0; count2 != FACE; count2++)
{
do
{
randFace = rand() % FACE;
randSuit = rand() % SUIT;
std::cout << count1 << "," << count2 << " trying " << randFace << "/" << randSuit << std::endl;
if (duplCheck(cards, randSuit, randFace) == true) {
std::cout << "duplCheck returned true" << std::endl;
cards[count1][count2] =
FACES[randFace] + SUITS[randSuit];
}
} while(duplCheck(cards, randSuit, randFace) == false);
}
}
I've added some extra output. This demonstrates (http://ideone.com/BkZKD9) that duplCheck isn't returning false the first time you run it.
do
{
randFace = rand() % FACE;
randSuit = rand() % SUIT;
if (duplCheck(cards, randSuit, randFace) == true) {
... this doesn't happen
}
} while(duplCheck(cards, randSuit, randFace) == false);
Because duplCheck returns false, you stay permanently in this loop.
bool duplCheck(string cards[][FACE], int suit, int face)
{
bool status = true;
for (int count1 = 0; count1 != SUIT; count1++)
for (int count2 = 0; count2 != FACE; count2++)
if (cards[count1][count2] == cards[suit][face]
&& suit != count1 && face != count2)
return false;
return status;
}
It appears that duplCheck returns "false" if there is a duplicate and "true" if there isn't, but your use of it expects the opposite: your while loop stops when duplCheck returns true, it expects duplCheck to return true if there IS a duplicate.