c++ - 用于防止重复和语法错误问题的 boolean 数组?

标签 c++ arrays boolean duplicates playing-cards

如果验证为 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;
}

最佳答案

使用一些 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_each , auto可以替换为类型,并且 vector 初始化列表可以替换为构造 vector 的不同方法。

关于c++ - 用于防止重复和语法错误问题的 boolean 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158037/

相关文章:

c++ - std::format() 是否接受不同的字符串类型作为格式和参数?

PHP函数数组参数引用

javascript - 如何将 JSON 数组属性值从数组转换为键

java - 如何让我的百分比在我的 Dice 计划中发挥作用?

matlab - 在 MatLab 中查找通过 boolean 矩阵的路径长度

javascript - 为什么在表达式前使用 '!!' ?

c++ - 有没有办法让这个 tolower( ... ) 代码更快?

c++ - map::count 后跟 map::operator[] 的效率

c++ - 为什么 lambda 会减慢排序速度

java - if 语句因未知原因返回 false