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