Я делаю программу для перетасовки колоды карт и раздачи двух рук, но сейчас нет выхода! Я прочесал код для бесконечных циклов, но ничего не могу найти! Может кто-нибудь, пожалуйста, помогите мне?
// (Description in Word File)
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
unsigned seed = time(0); // for use of rand()
const int SUIT = 4;
const int FACE = 13;
const int HAND = 5;
// A couple of reference arrays.
const string SUITS[SUIT] = {" Hearts", " Diamonds", " Clubs", " Spades"};
const string FACES[FACE] = {"Ace of", "Two of", "Three of",
"Four of", "Five of", "Six of", "Seven of",
"Eight of", "Nine of", "Ten of",
"Jack of", "Queen of", "King of"};
// The reason that these functions are in Main is because
// it gives me error 2065: undeclared identifier otherwise.
void shuffle(string[][FACE]);
void deal(string[][FACE], string[HAND]);
void displayDeck(string[][FACE]);
void displayHand(string[HAND]);
int main()
{
string deck[SUIT][FACE];
string hand1[HAND];
string hand2[HAND];
srand(seed); // for use of rand()
// Shuffle the deck.
shuffle(deck);
// Now display the deck
displayDeck(deck);
// Deal for each hand.
deal(deck, hand1);
deal(deck, hand2);
// Now display each hand.
displayHand(hand1);
displayHand(hand2);
return 0;
}
// This function will keep track of face values
// for the shuffle function
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;
}
// This function will shuffle the deck.
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;
if (duplCheck(cards, randSuit, randFace) == true)
cards[count1][count2] =
FACES[randFace] + SUITS[randSuit];
} while(duplCheck(cards, randSuit, randFace) == false);
}
}
// This function deals out a hand of five random cards.
void deal(string cards[][FACE], string hand[HAND])
{
for (int count = 0; count != HAND; count++)
{
// make random suit and face numbers
int randSuit = rand() % SUIT;
int randFace = rand() % FACE;
// If random card is not obsolete...
if (cards[randSuit][randFace] != "null")
// ...assign that card to hand.
hand[count] = cards[randSuit][randFace];
// obsolete that card
cards[randSuit][randFace] = "null";
}
}
void displayDeck(string cards[][FACE])
{
std::cout << "\t\tThe Deck:\n\n";
for (int count1 = 0; count1 != SUIT; count1++)
for (int count2 = 0; count2 != FACE; count2++)
{
std::cout << ((count1 * FACE) + count2 + 1) << " "<< cards[count1][count2] << endl;
}
}
void displayHand(string hand[HAND])
{
}
Ваша проблема в случайном порядке, особенно в использовании 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);
}
}
Я добавил дополнительный вывод. Это демонстрирует (http://ideone.com/BkZKD9) что duplCheck не возвращает false при первом запуске.
do
{
randFace = rand() % FACE;
randSuit = rand() % SUIT;
if (duplCheck(cards, randSuit, randFace) == true) {
... this doesn't happen
}
} while(duplCheck(cards, randSuit, randFace) == false);
Поскольку duplCheck возвращает false, вы постоянно находитесь в этом цикле.
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;
}
Похоже, что duplCheck возвращает «false», если есть дубликат, и «true», если его нет, но использование его предполагает противоположное: ваш цикл while останавливается, когда duplCheck возвращает true, он ожидает, что duplCheck вернет true, если есть IS дубликат
Ваша функция отображения руки пуста.
void displayHand(string hand[HAND])
{
cout << "Put some output here";
}
Проблема в том, что ваша колода изначально начинается с пустых («») значений. Вы можете либо заполнить это в начале, перед вызовом shuffle (), либо добавить эту проверку в начало duplCheck ():
if(cards[suit][face].length() == 0)
return true;