这是我最近改写的一个课本c程序

该c程序算是我在学习c语言这三个月来接触的最长并且修改起来最麻烦的一个程序了

/*
 * poker_p166_change_point.c
 *
 *  Created on: 2016年12月1日
 *      Author: PC
 */
#include<stdbool.h>
#include<stdio.h>
#include<stdlib.h>


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


/* external variables*/
//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:Calls read_cards, analyze_hand,and print_result *
 *      repeatedly.                                     *
 *******************************************************/
 int main(void)
 {
bool straight,flush,four,three;
int pairs;
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,&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: ");
  setvbuf(stdout,NULL,_IONBF,0);


  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 +=1;
}
 }
 /**********************************************************
  * 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");
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值