9.23(洗牌和发牌)
编写一个洗牌和发牌的程序。这个程序包含类 Card、类 DeckOfCards 和一个驱动程序。
类 Card 有:
- a) int 型的数据成员 face 和 suit。
- b) 接收两个 int 型的代表面值和花色的构造函数,用于初始化数据成员。
- c) 两个 string 类型的 static 数组,代表面值和花色。
- d) 一个 toString 函数,返回形式为 “face of suit” 的字符串,可使用 + 运算符连接字符串。
类 DeckOfCards 有:
- a) 一个名为 deck 的 Card 类型的 vector,用来存储 Card。
- b) 代表下一个将要处理的牌的整型值 currentCard。
- c) 一个默认构造函数,用于初始化 deck 中的 Card。构造函数使用 vector 的 push_back 函数将产生的牌添加到 vector 末尾,该过程需对 deck 中的 52 张牌都执行一遍。
- d) 函数 shuffle 用于洗牌。洗牌算法在 vector 中反复执行:对每张牌,随机选取另一张牌并交换两者位置。
- e) dealCard 函数返回下一张牌。
- f) moreCards 函数返回一个 bool 值,代表是否还有牌要处理。
驱动程序产生 DeckOfCards 对象,洗牌,然后发牌。
9.24(洗牌和发牌)
修改练习题 9.23 中的程序,使发牌函数发一手 5 张牌,然后编写函数完成下列任务:
- a) 确定手上是否有一副对子。
- b) 确定手上是否有两副对子。
- c) 确定手上是否有 3 张同号牌(如 3 张 J)。
- d) 确定手上是否有 4 张同号牌(如 4 张 A)。
- e) 确定手上是否有同花(即 5 张牌花色相同)。
- f) 确定是否有同顺(即 5 张面值连续的牌)。
#include
<iostream>
#include
<string>
#include
<vector>
#include
<algorithm>
#include
<cstdlib>
#include
<ctime>
using namespace std;
class Card
{
public:
int face;
int suit;
static string faces[];
static string suits[];
private:
public:
Card(int f, int s)
{
face = f;
suit = s;
}
string toString()
{
return faces[face] + "of" + suits[suit];
}
private:
};
string Card::faces[] = { "Ace", "Deuce", "Three", "Four", "Five", "Six",
"Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
string Card::suits[] = { "Hearts", "Diamonds", "Clubs", "Spades" };
class DeckOfCards
{
public:
private:
vector
<Card> deck;
int currentCard;
public:
DeckOfCards()
{
currentCard = 0;
for (int suit = 0; suit < 4; ++suit)
{
for (int face = 0; face < 13; ++face)
{
deck.push_back(Card(face, suit));
}
}
}
void shuffle()
{
for (size_t i = 0; i < deck.size(); ++i)
{
int j = rand() % deck.size();
swap(deck[i], deck[j]);
}
}
Card dealCard()
{
return deck[currentCard++];
}
bool moreCards() { return currentCard <= 51; }
};
int numofPairs(const vector
<Card>& d)
{
int cnt = 0;
int count[13] = { 0 };
for (int i = 0; i < 5; i++)
{
count[d[i].face]++;
}
for (int i = 0; i < 13; i++)
{
if (count[i] == 2)
cnt++;
}
return cnt;
}
int numofTriples(const vector
<Card>& d)
{
int cnt = 0;
int count[13] = { 0 };
for (int i = 0; i < 5; i++)
{
count[d[i].face]++;
}
for (int i = 0; i < 13; i++)
{
if (count[i] == 3)
cnt++;
}
return cnt;
}
int numofFours(const vector
<Card>& d)
{
int cnt = 0;
int count[13] = { 0 };
for (int i = 0; i < 5; i++)
{
count[d[i].face]++;
}
for (int i = 0; i < 13; i++)
{
if (count[i] == 4)
cnt++;
}
return cnt;
}
int numofSameColor(const vector
<Card>& d)
{
int cnt = 0;
int count[4] = { 0 };
for (int i = 0; i < 5; i++)
{
count[d[i].suit]++;
}
for (int i = 0; i < 4; i++)
{
if (count[i] == 5)
cnt++;
}
return cnt;
}
bool isStraight(const vector
<Card>& d)
{
int faces[5];
for (int i = 0; i < 5; i++)
{
faces[i] = d[i].face;
}
sort(faces, faces + 5);
for (int i = 1; i < 5; i++)
{
if (faces[i] - faces[i - 1] != 1)
return false;
}
return true;
}
int main()
{
srand(time(0));
DeckOfCards myDeck;
myDeck.shuffle();
vector
<Card> myHand;
for (int i = 0; i < 5; i++)
{
myHand.push_back(myDeck.dealCard());
}
for (int i = 0; i < 5; i++)
{
cout << myHand[i].toString() << endl;
}
cout << "手上有"<<numofPairs(myHand)<<"副对子" << endl;
if (numofTriples(myHand))
cout << "手上有三张同号牌" << endl;
else
cout << "手上没有三张同号牌" << endl;
if (numofFours(myHand))
cout << "手上有四张同号牌" << endl;
else
cout << "手上没有四张同号牌" << endl;
if (numofSameColor(myHand))
cout << "手上有同花" << endl;
else
cout << "手上没有同花" << endl;
if (isStraight(myHand))
cout << "手上有顺子" << endl;
else
cout << "手上没有顺子" << endl;
} 
