March 29, 2011

撲克牌


/****資工一丙  許巧慧  b09902147****/
/**************第三版*************** 
*題目:發牌5張後判斷下列的牌種       *
1.    One pair 一對                   *
2.    Two pair 兩對                   *
3.    Three of kind 三條              * 
4.    Stright 順子                    *
5.    Full house 葫蘆                 *
6.    Four of a kind 四條、四梅、鐵支 *
7.    Stright Flush 同花順            *
************************************/
#include<iostream>
  
using namespace std;
/*牌的主鍵:color花色,point數字
 print_card():印出牌的花色和數字,set_a_card():設定牌的花色和數字*/
class Card
{
private:
 char color;     
 int point;
public:
  Card();
  void print_card();
  void set_a_card(char, int);
  int getpoint();
  char getcolor();
};      
/*設定初始值:花色是梅花'S',數字為0*/
Card::Card()
{
  color='S';
  point=0;
}
/*印出結果花色和數字*/ 
void Card::print_card()
{
  cout << color << point << "\n";
};
/*建構子 : 設定管道用參數c來設定private裡的color
用參數p來設定private裡的point*/ 
void Card::set_a_card(char c, int p)
{
  color = c;
  point = p;
};

int Card::getpoint()
{
 int num;
  num=point;
  return num;  
};

char Card::getcolor()
{
  char col;
  col=color;   
  return col;     
};

/*撲克牌的規格有52張牌,操作方法:
card_initialization()  洗牌 
check_dealed(int)      回傳牌是否發牌 
get_a_card()           取得一張未知牌
getPoint(int)          取得數字 
getColor(int)          取得花色*/
class Poker_card
{
  private:
    bool is_dealed[52];
  public:
    void card_initialization();
    bool check_dealed(int);
    int get_a_card();
    int getPoint(int);
    char getColor(int);
};
/*發過牌的,不會重複發*/ 
void Poker_card::card_initialization()
{
  int i;
  for(i=0;i<52;i++) is_dealed[i] = false;
};          
        
bool Poker_card::check_dealed(int i)
{
  return is_dealed[i];
};

int Poker_card::get_a_card()
{
  int i;
  while(1)
  {
    i = rand() % 52;
    if(!check_dealed(i)) 
    {  
       is_dealed[i] = true;
       break;
    }
  } 
  return i;
};
/*取得數字:每個花色有1-13的數字,所以i%13*/ 
int Poker_card::getPoint(int i)
{
    return i % 13 +1;
};
/*取的花色:c1是get_a_card()取得i亂數除以13 
set_a_card()--->color=c; 用c參數成管道設定花色 
黑桃 00-13  所以除以 13為0 設如果c1=0 則c='S'  
愛心 13-26  所以除以 13為1 設如果c1=1 則c='H'
菱形 26-39  所以除以 13為2 設如果c1=1 則c='D'
梅花 39-52  所以除以 13為3 設如果c1=1 則c='C'*/ 
char Poker_card::getColor(int i)
{
    int c1;
    char c;
    c1 = i / 13;
    if(c1 == 0) c = 'S';
    if(c1 == 1) c = 'H';
    if(c1 == 2) c = 'D';
    if(c1 == 3) c = 'C';
    return c;
};



Poker_card pc;
/*Player玩家有name名字Card card_of_hand[5]手上有5張牌
bubble_sort()--->排列(從小到大) 
card_dealing()--->發牌
print_hand_of_card()--->印出手上的牌
check_hand_of_card()--->判斷一對  兩對 三條 葫蘆 鐵支
check_hand_of_card2()--->判斷同花順和順子*/
class Player
{
  private:
    char *name;
    Card card_of_hand[5];
  public:   
    Player(char *);
    void card_dealing();
    void bubble_sort();
    void print_hand_of_card();
    void check_hand_of_card();
    void check_hand_of_card2();
};
/*建構子 : 設定管道用參數x來設定private裡的name*/ 
Player::Player(char *x)
{
  name = x;
}
/*發牌給五個人 pc.get_a_card(): Poker_card pc.取得一張未知牌為亂數j
    p = pc.getPoint(j) --->會用到亂數j 取得數字 
    c = pc.getColor(j) --->會用到亂數j 取得花色
    參數c,p是上述建構子Card::set_a_card(char c, int p) 
    card_of_hand[i].set_a_card(c,p);手上此張牌.設定一張牌的花色和數字*/ 
void Player::card_dealing()
{
  int i,j,p;
  char c;
  for(i=0;i<5;i++)
  {
    j = pc.get_a_card();
    p = pc.getPoint(j);
    c = pc.getColor(j);
    card_of_hand[i].set_a_card(c,p);
  }
};

void Player::bubble_sort()
{
   int j,k;
   Card pc;          
      for(j=5;j>1;j--)          
      {
         for(k=0;k<j-1;k++)                           
         {                        
           if(card_of_hand[k+1].getpoint() <card_of_hand[k].getpoint()||(card_of_hand[k+1].getpoint() == card_of_hand[k].getpoint() && card_of_hand[k+1].getcolor() < card_of_hand[k].getcolor()))
           {                                   
              pc = card_of_hand[k+1];
             card_of_hand[k+1] = card_of_hand[k];
              card_of_hand[k] = pc;
              
              }
         }    
      }               
}
/*印出手上的五張牌*/ 
void Player::print_hand_of_card()
{
   int num;
   char col;   
  int i,j;
  cout << "\n-----------------------";
  cout << " \n The cards of " << name << " :\n";  
  for(i=0;i<5;i++)
  {
      num=card_of_hand[i].getpoint();
      col=card_of_hand[i].getcolor();
      cout<< col << num <<"\n";         
  }

};

void Player::check_hand_of_card()
{
int i,j,sum=0;
  
for(i=0;i<5;i++)
{
 for(j=i+1;j<5;j++)                
  {
  if(card_of_hand[i].getpoint()==card_of_hand[j].getpoint())                     
   sum++;  
   }              
 }
  switch(sum)
  {
   case 1:
   cout<<" "<< name <<" have one pair \n";   break;
   case 2:
   cout<<" "<< name <<" have two pair \n";   break;         
   case 3:
   cout<<" "<< name <<" have three of kind  \n";   break;
   case 4:
   cout<<" "<< name <<" have full house  \n";   break;                  
   case 6:
   cout<<" "<< name <<" have four of a kind  \n";   break;             
  }   
};
/*利用迴圈算,順子和同花順*/ 
void Player::check_hand_of_card2()
{
 int j,sum2=0;
 for(j=0;j<5;j++)
   {
    if(card_of_hand[j+1].getpoint()-card_of_hand[j].getpoint()==1)
    sum2++;
   }
 if(sum2==4)
   {
   if(card_of_hand[j].getcolor()==card_of_hand[j+1].getcolor())   
      cout<<" "<< name <<" have flush straight  \n";  
   else
     cout<<" "<< name <<" have straight  \n"; 
  } 
}; 

/*
1.玩家設定4人 
2.洗牌
3.發牌給每個人
4.排列(從小到大) 
5.印出每個人手上的五張牌
6.判斷一對  兩對 三條 葫蘆 鐵支
7.判斷同花順 和順子*/
int main(void)
{
int i;
Player pp[10]={"cherry","moon","fish","big knife","black","峰哥","pig","x.x","sister",">.<"};
srand(time(NULL)); //針對不同的時間取亂數 

pc.card_initialization();

for(i=0;i<10;i++)
{
pp[i].card_dealing();
pp[i].bubble_sort();
pp[i].print_hand_of_card();
pp[i].check_hand_of_card();
pp[i].check_hand_of_card2();
}

system("pause");
return 0;
}

0推薦此文章
Today's Visitors: 0 Total Visitors: 42
Personal Category: 學校專業課程(作業) c++ Topic: learning / education / linguistic
Next in This Category: 一般時間運作-先輸入(時 分 秒)
[Trackback URL]

Reply
  • 1樓

    1樓搶頭香

    請問一下 有辦法印出
    C2 C3 C5 C7 C9 之後
    在順便印它所對應的0~51數字
    1 2 4 6 8
    PS:0~51是指C1~C13 D1~D13
    H1~H13 S1~H13
    感恩!!!!!

  • FU at December 7, 2011 11:47 PM comment | email
Post A Comment









Yes No



Please input the magic number:

( Prevent the annoy garbage messages )
( What if you cannot see the numbers? )
Please input the magic number

誰來收藏
Loading ...
unlog_NVPO 0