0

如果验证为 1,如何生成新的随机数?

我可以再放一个“生成数字行”吗: cardDrawn=(1+(rand()%52));

#include <iostream>;
#include <cstdlib>;
#include <ctime>;
#include <cmath>;

using namespace std;

int main(){
int deck[52];
bool validate[52]={0};
int hand[5];
int cardDrawn;
int count=0;
int j=0;
bool repeat=0;
string cardNames[52]=   {"Ace of Clubs","2 of Clubs","3 of Clubs","4 of Clubs","5 of Clubs","6 of Clubs","7 of Clubs","8 of Clubs","9 of Clubs","10 of Clubs","Jack of Clubs","Queen of Clubs","King of Clubs",//CLUBS
                        "Ace of Spades","2 of Spades","3 of Spades","4 of Spades","5 of Spades","6 of Spades","7 of Spades","8 of Spades","9 of Spades","10 of Spades","Jack of Spades","Queen of Spades","King of Spades",//SPADES
                        "Ace of Hearts","2 of Hearts","3 of Hearts","4 of Hearts","5 of Hearts","6 of Hearts","7 of Hearts","8 of Hearts","9 of Hearts","10 of Hearts","Jack of Hearts","Queen of Hearts","King of Hearts",//HEARTS
                        "Ace of Diamonds","2 of Diamonds","3 of Diamonds","4 of Diamonds","5 of Diamonds","6 of Diamonds","7 of Diamonds","8 of Diamonds","9 of Diamonds","10 of Diamonds","Jack of Diamonds","Queen of Diamonds","King of Diamonds"//DIAMONDS
                        };//array to hold card abbreviations.

srand(time(0));
for (int i=0; i<52; i++){  // fills arrays with 1-52
deck[i]=i+1;};


cardDrawn=(1+(rand()%52));  //generates first card.
hand[0]=cardDrawn;
validate[cardDrawn]=1;
//cout << "Card 1: " << hand[0];

do{
    cardDrawn=(1+(rand()%52));
    if (validate[cardDrawn]==1)
        {
            //count doesn't update!  :D
        }
    else
        {
            hand[count]=cardDrawn;
            count++;
        }
     }while(count<4);

cout << "Card 1: " << cardNames[hand[0]];
cout << "\ncard 2: " << cardNames[hand[1]];
cout << "\ncard 3: " << cardNames[hand[2]];
cout << "\ncard 4: " << cardNames[hand[3]];
cout << "\ncard 5: " << cardNames[hand[4]];

return 0;
}
4

3 回答 3

1

使用一些 STL,您希望达到的效果要容易得多。您可以轻松地将其扩展到绘制的任意数量的牌(在同一副牌中),其复杂性与绘制第一张牌的复杂性相同。

事实上,我添加了 4 名玩家,每人手里有 5 张牌。缩小到只有一名玩家相当容易。我还简化了为每张卡添加名称的过程。

#include <algorithm> //random_shuffle
#include <cstdlib> //srand
#include <ctime> //time
#include <iostream> //cout
#include <string> //string
#include <vector> //vector

using namespace std;

int main()
{
    srand (time (NULL)); //so random_shuffle gives different values

    const vector<string> values = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};
    const vector<string> suits = {"Clubs", "Spades", "Hearts", "Diamonds"};

    vector<string> cards; //for names of cards

    for (int suit = 0; suit < 4; ++suit)
    {
        for (int value = 0; value < 13; ++value)
        {
            cards.push_back (values [value] + " of " + suits [suit]); //combine suit and value
        }
    }

    vector<vector<string>> playerHands (4); //4 players' hands

    random_shuffle (cards.begin(), cards.end()); //shuffle cards

    for (auto &hand : playerHands) //for each hand
    {
        for (int card = 0; card < 5; ++card) //for 5 cards
        {
            hand.push_back (cards.back()); //add last card to hand
            cards.pop_back(); //remove last card from deck
        }
    }

    int playerCount = 1; //for player's number
    for (auto hand : playerHands) //for each hand
    {
        cout << "Player " << playerCount << ":\n"; //output player number

        int handCount = 1; //for card's number
        for (auto card : hand) //for each card in hand
        {
            cout << "Card " << handCount << ": " << card << '\n'; //output card
            ++handCount; //increase card number
        }

        ++playerCount; //increase player number
        cout << '\n'; //separate players
    }
}

您也可以在每次牌组用完时生成牌名列表,或者只cards为每个牌组使用一个副本 ( vector<string> currentDeck (cards);)。

如果这根本无法编译,则需要 C++11 和适当的编译器选项。否则,for (... : ...)可以用 替换std::for_eachauto可以用类型替换,向量初始化器列表可以用不同的构造向量的方法替换。

于 2012-04-15T02:18:34.707 回答
0

如果您在第二个 for 循环中为迭代变量使用不同的名称,那么i2您的问题可能会消失。

但我认为您拥有的代码应该在任何一组范围规则下都被接受。

于 2012-04-14T23:03:46.363 回答
0
j=0;
do{
    cardDrawn = (1 + (rand() % 52));
    if (validate[cardDrawn] == 0)
    {
        hand[j] = cardDrawn;
        validate[cardDrawn] = 1;
        j++;
    }
}while (j<5);

那可能会起作用

啊,我的坏..现在一定没问题

于 2012-04-14T23:09:30.130 回答