拖拉机判定C语言程序

来源:互联网 发布:年度工作总结 知乎 编辑:程序博客网 时间:2024/04/27 06:57
#include<stdbool.h>
#include<stdio.h>
#include<stdlib.h>
#define NUM_RANKS 13
#define NUM_SUITS 4
#define NUM_CARDS 5
bool straight, flush, four, three;
int pairs;
void read_cards(int num_in_rank[],int num_in_suit[]);
void analyze_hand(int num_in_rank[],int num_in_suit[]);
void print_result(void);
int main(void)
{
 int num_in_rank[NUM_RANKS];
 int num_in_suit[NUM_SUITS];
 for(;;){
  read_cards(num_in_rank,num_in_suit);
  analyze_hand(num_in_rank,num_in_suit);
  print_result();
 }
}
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; ignore.\n");
  else if (card_exists[rank][suit])
   printf("Duplicate card; ignore.\n");
  else
  {
   num_in_rank[rank]++;
   num_in_suit[suit]++;
   card_exists[rank][suit]=true;
   cards_read++;
  }
 }
}
void analyze_hand(int num_in_rank[],int num_in_suit[])
{
 int num_consec=0;
 int rank, suit;
 straight=false;
 flush=false;
 four=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(void)
{
 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