C语言程序


#include<stdbool.h>
#include<stdio.h>
#include<stdlib.h>


#define NUM_RANKS 13
#define NUM_SUITS 4
#define NUM_CARDS 5


/*prototypes  */
void read_cards(int num_in_rank[],int num_in_suit[]);
void analyze_hand(int num_in_rank[],int num_in_suit[],bool *straight,bool *flush,bool *four,bool *three,int *pairs);
void print_result(bool straight,bool flush,bool four,bool three,int pairs);


/*******************************************************
 * main:Call read_cards,analyze_hand,and print_result  *
 *      repeatedly.                                    *
 ******************************************************/
int main(void)
{
    int num_in_rank[NUM_RANKS];
    int num_in_suit[NUM_SUITS];
    bool straight,flush,four,three;
    int pairs;
for(;;){
read_cards(num_in_rank,num_in_suit);
analyze_hand(num_in_rank,num_in_suit,&straight,&flush,&four,&three,&pairs);
print_result(straight,flush,four,three,pairs);
}
}


/********************************************************
 * read_cards:Reads the cards into the external         *
 *            variables num_in_rank and num_in_suit;    *
 *            checks for bad cards and duplicate cards. *
 *******************************************************/
void read_cards(int num_in_rank[],int num_in_suit[])
{
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] = 0;


while (cards_read < NUM_CARDS){
bad_card = false;


printf("Enter 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 't': case 'T':        rank = 8;break;
 case 'j': case 'J':        rank = 9;break;
          case 'q': case 'Q':        rank = 10;break;
          case 'k': case 'K':        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++;
        }
}
}
/*******************************************************
* analyze_hand:Determines whether the hand contains a  *
*              straight,a flush,four-of-a-kind,        *
*              and/or three-of-a-kind;determines the   *
*              number of pairs;stores the results into *
*              the external variables straight,flush,  *
*              four,three,and pairs.                   *
*******************************************************/
void analyze_hand(int num_in_rank[],int num_in_suit[],bool *straight,bool *flush,bool *four,bool *three,int *pairs)
{


    int num_consec = 0;
    int rank,suit;


    *straight = false;
    *flush = false;
    *four = false;
    *three = false;
    *pairs = 0;


    /* check for flush  */
    for (suit = 0;suit < NUM_SUITS;suit++)
        if (num_in_suit[suit] == NUM_CARDS)
          *flush = true;


    /* check for straight */
    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;
    }
    /* check for 4-of-a-kind,3-of-a-kind,and pairs */
    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++;
    }
}
/***********************************************************
*print_result:prints the classification of the hand,       *
*             based on the values of the external          *
*             variables straight ,flush,four,three,        *
*             and pairs.                                   *
***********************************************************/
void print_result(bool straight,bool flush,bool four,bool three,int pairs)
{
    if (straight && flush) printf("Straight 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("Pair");
    else                   printf("High card");


    printf("\n\n");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值