撲克牌
/****資工一丙 許巧慧 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;
}
Next in This Category: 一般時間運作-先輸入(時 分 秒)










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
感恩!!!!!