0

我正在编写一个程序来洗一副牌并分发两只手,但是现在没有输出!我梳理了无限循环的代码,但我找不到任何东西!有人可以帮帮我吗?

// (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])
{

}
4

3 回答 3

2

您的问题出在随机播放中,特别是在使用 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”,但是您对它的使用期望相反:当 duplCheck 返回 true 时,您的 while 循环停止,如果存在重复,它期望 duplCheck 返回 true重复。

于 2013-10-28T00:44:12.857 回答
0

您的显示手功能为空。

void displayHand(string hand[HAND])
{
    cout << "Put some output here";
}
于 2013-10-28T00:37:46.713 回答
0

The issue is that your deck initially starts out with empty ("") values. You can either fill this at the start, before calling shuffle(), or you can add this check to the start of duplCheck():

if(cards[suit][face].length() == 0)
   return true;
于 2013-10-28T00:58:55.237 回答