下面的这个程序会对一手牌进行读取和分类,手中的每张牌都有花色,(方块、梅花、红桃和黑桃)和等级(2,3,4,5,6,7,8,9,J,Q,K和A)。不允许使用王牌,并且假设A是最高等级的。程序读取一手五张牌,然后把手中的牌分成下列某一类(列出的顺序从最好到最坏)
1、同花顺(顺序相连又都是同花色)
2、四张(4张牌等级相同)
3、葫芦(3张是同样的花色,而另外2张牌是同样的花色)
4、同花(5张牌是同花色的)
5、顺子(5张牌的等级顺序相连)
6、三张(3张牌的等级相同)
7、两对
8、一对(两张牌的等级相同)
9、其他
为了便于输入
,把牌的等级和花色简化如下(字母可以是大小写):
等级:2 3 4 5 6 7 8 9 t j q k a
花色:c d h s
如果用户输入非法牌或者输入同一张牌两次,程序将把此牌忽略掉,产生出错信息,然后要求输入另一张牌。如果输入2为0而不是一张牌,将会导致程序终止。
程序任务:
1、
读入一手五张牌(read_cards函数)
2、
分析对、顺子等情况(analyse_hand函数)
3、
显示一手牌的分类(print_result函数)
/***********************************************************************************/
/* Classifies a poker hand */
#include<stdbool.h>/*C99 only */
#include<stdio.h>
#include<stdlib.h>
#define NUM_RANKS 13
#define NUM_SUITS 4
#define NUM_CARDS 5
/* external vaviables */
int num_in_rank[NUM_RANKS];
int num_in_suit[NUM_SUITS];
bool straight,flush,four,three;
int pairs;
void read_cards();
void analyze_hand();
void print_result();
int main()
{
for(;;)
{
read_cards();
analyze_hand();
print_result();
}
return 0;
}
void read_cards()
{
bool card_exists[NUM_RANKS][NUM_SUITS];
char ch,rank_ch,suit_ch;
int rank,suit;
bool bad_card;
int cards_read=0;
for(rank=0;rank<NUM_RANKS;rank++)
{
num_in_rank[rank]=0;
for(suit=0;suit<NUM_SUITS;suit++)
{
card_exists[rank][suit]=false;
}
}
for(suit=0;suit<NUM_SUITS;suit++)
num_in_suit[suit]=false;
while(cards_read<NUM_CARDS)
{
bad_card=false;
printf("Please input a card:");
rank_ch=getchar();
switch (rank_ch)
{
case '0': exit(EXIT_SUCCESS);
case '2': rank=0;break;
case '3': rank=1;break;
case '4': rank=2;break;
case '5': rank=3;break;
case '6': rank=4;break;
case '7': rank=5;break;
case '8': rank=6;break;
case '9': rank=7;break;
case 'k': case 'K': rank=8;break;
case 't': case 'T': rank=9;break;
case 'j': case 'J': rank=10;break;
case 'q': case 'Q': rank=11;break;
case 'a': case 'A': rank=12;break;
default: bad_card=true;
}
suit_ch=getchar();
switch (suit_ch)
{
case 'c':case 'C': suit=0;break;
case 'd':case 'D': suit=1;break;
case 'h':case 'H': suit=2;break;
case 's':case 'S': suit=3;break;
default: bad_card=true;
}
while((ch=getchar())!='\n')
{
if(ch!=' ')
bad_card=true;
}
if(bad_card)
printf("Bad card.ignored.\n");
else
{
if(card_exists[rank][suit])
printf("Duplicate card;ignored.\n");
else
{
num_in_rank[rank]++;
num_in_suit[suit]++;
card_exists[rank][suit]=true;
cards_read++;
}
}
}
}
void analyze_hand()
{
int num_consec=0;
int rank,suit;
straight=false;
flush=false;
three=false;
pairs=0;
for(suit=0;suit<NUM_SUITS;suit++)
{
if(num_in_suit[suit]==NUM_CARDS)
{
flush=true;
}
}
rank=0;
while(num_in_rank[rank]==0)
{
rank++;
}
for(;rank<NUM_RANKS && num_in_rank[rank]>0;rank++)
{
num_consec++;
}
if(num_consec==NUM_CARDS)
{
straight=true;
return;
}
for(rank=0;rank<NUM_RANKS;rank++)
{
if(num_in_rank[rank]=4)
four=true;
if(num_in_rank[rank]=3)
three=true;
if(num_in_rank[rank]=2)
pairs++;
}
}
void print_result()
{
if(straight&&flush)
printf("staight flush");
else if(four)
printf("Four of a kind");
else if(three&&pairs==1)
printf("FUll house");
else if(flush)
printf("Flush");
else if(straight)
printf("straight");
else if(three)
printf("Three of a kind");
else if(pairs==2)
printf("Two pairs");
else if(pairs==1)
printf("Pairs");
else
printf("High card");
printf("\n\n");
}
/************************************************************************************/
转载于:https://blog.51cto.com/yuzhou133/463983