高程作业留档

发布于 20 天前 43 次阅读


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;

}