发牌(C语言)

1.0

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#define NUM_SUITS 4
#define NUM_RANKS 13

int main()
{
	bool in_hand[NUM_SUITS][NUM_RANKS] = { false };
	int num_cards, rank, suit;
	const char rank_code[] = { '2','3','4','5','6','7','8','9','t','j'
		,'q','k','a' };
	const char suit_code[] = { 'c','d','h','s' };
	srand((unsigned)time(NULL));

	printf("Enter number of cards in hand: ");
	scanf("%d", &num_cards);

	printf("Your hand:");
	while (num_cards > 0) {
		suit = rand() % NUM_SUITS;
		rank = rand() % NUM_RANKS;
		if (!in_hand[suit][rank] ) {
			in_hand[suit][rank] = true;
			num_cards--;
			printf(" %c%c", rank_code[rank], suit_code[suit]);
		}
	}
	printf("\n");

	return 0;
}

1.2

/* Classifies a poker hand */
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

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

/* external variables */

int num_in_rank[NUM_RANKS];
int num_in_suit[NUM_SUITS];
bool straight, flush, four, three;
int pairs;/* can be 0,1,or 2*/

/* prototypes */

void read_cards(void);
void analyze_hand(void);
void print_result(void);

/********************************************************
*	main:Calls read_cards,analyze_hand,and print_result *
*	repertedly.                                         *
*********************************************************/
int main(void)
{
	for (;;) {
		read_cards();
		analyze_hand();
		print_result();
	}
/***********************************************************
*	read_cards:Reads the cards into the external varoables *
*			   num_in_rank and num_in_suit;checks for bad  *
*			   cards and duplicate cards.				   *
************************************************************/
}

void read_cards(void)
{
	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:Datermines whether the hand contains a   *
*				straight, a flush, four-of-a-kind,		 *
*				and/or a 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(void)
{
	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-kinf, 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*
*                steaight, flush, four, three,and 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值