⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pr1201.cpp

📁 practice c++, it is from the book http://www.amazon.com/Schaums-Outline-Programming-John-Hubbard
💻 CPP
字号:
//  Programming with C++, Second Edition, by John R. Hubbard
//  Copyright McGraw-Hill 2000
//  Problem 12.1, page 292
//  Card, Hand, and Deck classes

#include <iostream>
#include "Random.h"
using namespace std;

enum Rank { TWO=2, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE };
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };

class Card
{
  friend class Hand;
  friend class Deck;
  friend ostream& operator<<(ostream&, const Card&);
public:
  char rank() { return rank_; }
  char suit() { return suit_; }
private:
  Card() { }
  Card(Rank rank, Suit suit) : rank_(rank), suit_(suit) { }
  Card(const Card& c) : rank_(c.rank_), suit_(c.suit_) { }
  ~Card() { };
  Rank rank_;
  Suit suit_;
};

ostream& operator<<(ostream& ostr, const Card& card)
{
  switch (card.rank_)
    {
    case TWO    : ostr << "two of ";     break;
    case THREE  : ostr << "three of ";   break;
    case FOUR   : ostr << "four of ";    break;
    case FIVE   : ostr << "five of ";    break;
    case SIX    : ostr << "six of ";     break;
    case SEVEN  : ostr << "seven of ";   break;
    case EIGHT  : ostr << "eight of ";   break;
    case NINE   : ostr << "nine of ";    break;
    case TEN    : ostr << "ten of ";     break;
    case JACK   : ostr << "jack of ";    break;
    case QUEEN  : ostr << "queen of ";   break;
    case KING   : ostr << "king of ";    break;
    case ACE    : ostr << "ace of ";     break;
    }
  switch (card.suit_)
    {
    case CLUBS     : ostr << "clubs";    break;
    case DIAMONDS  : ostr << "diamonds"; break;
    case HEARTS    : ostr << "hearts";   break;
    case SPADES    : ostr << "spades";   break;
    }
  return ostr;
}

class Hand
{
  friend class Deck;
public:
  Hand(unsigned n=5) : size(n) { cards = new Card[n]; }
  ~Hand() { delete [] cards; }
  void display();
  int isPair();
  int isTwoPair();
  int isThreeOfKind();
  int isStraight();
  int isFlush();
  int isFullHouse();
  int isFourOfKind();
  int isStraightFlush();
private:
  unsigned size;
  Card* cards;
  void sort();
};

int Hand::isThreeOfKind()
{
  if (cards[0].rank_ == cards[1].rank_
   && cards[1].rank_ == cards[2].rank_
   && cards[2].rank_ != cards[3].rank_
      && cards[3].rank_ != cards[4].rank_) return 1;
  if (cards[0].rank_ != cards[1].rank_
   && cards[1].rank_ == cards[2].rank_
   && cards[2].rank_ == cards[3].rank_
   && cards[3].rank_ != cards[4].rank_) return 1;  
if (cards[0].rank_ != cards[1].rank_
   && cards[1].rank_ != cards[2].rank_
   && cards[2].rank_ == cards[3].rank_
   && cards[3].rank_ == cards[4].rank_) return 1;
 return 0;
}

int Hand::isFlush()
{
  for (int i = 1; i < size; i++)
    if (cards[i].suit_ != cards[0].suit_) return 0;
  return 1;
}

class Deck
{
public:
  Deck();
  void shuffle();
  void deal(Hand&, unsigned =5);
private:
  unsigned top;
  Card cards[52];
  Random random;
};

void Deck::deal(Hand& hand, unsigned size)
{
  for (int i = 0; i < size; i++)
    hand.cards[i] = cards[top++];
  hand.sort();
}

Deck::Deck()
{
  for (int i=0; i<52; i++)
    {
      cards[1].rank_ = Rank(i%13);
      cards[i].suit_ = Suit(i%4);
    }
  top = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -