德州扑克QWER

德州扑克:写一个程序循环读取 5 张手牌 (输入 0 结束程序),然后把手中的牌分为下面某一类:1.同花顺 2.四张 3.葫芦 (3 + 2) 4. 同花 5. 顺子 6.三张 7.两对 8. 一对 9.高牌。程序对话如下:

Enter a card: 2s
Enter a card: 5s
Enter a card: 4s
Enter a card: 3s
Enter a card: 6s
Straight flush

Enter a card: 8c
Enter a card: as
Enter a card: 8c
Duplicate card; ignored.
Enter a card: 7c
Enter a card: ad
Enter a card: 3h
Pair

Enter a card: 6s
Enter a card: d2
Bad card; ignored.
Enter a card: 2d
Enter a card: 9c
Enter a card: 4h
Enter a card: ts
High card

Enter a card: 0

#define _CRT_SECURE_NO_WARNINGS 1

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

//德克萨斯扑克全称Texas Hold’em poker

//判花色
//同花(Flush,简称“花”:五张同一花色的牌。

//判点数+花色
//判同花+顺子
//同花顺(Straight Flush):同一花色,顺序的牌。

//判点数
//对子(One Pair):两张相同点数的牌。
//两对(Two Pairs):两张相同点数的牌,加另外两张相同点数的牌。

//三条(Three of a kind,亦称“三张”):有三张同一点数的牌。
// 
// 三条+对子
//葫芦(Fullhouse,亦称“俘虏”、“骷髅”、“夫佬”、“满堂红”):三张同一点数的牌,加一对其他点数的牌。[8]

//四条(Four of a Kind,亦称“铁支”、“四张”或“炸弹”):有四张同一点数的牌。

//顺子(Straight,亦称“蛇”):五张顺连的牌。

//高牌(high card):不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成,以点数决定大小

// const char ranks[13] = {'2', '3', ...., 't', 'j', 'q', 'k', 'a'};
// const char suits[4] = {'d', 'c', 'h', 's'};

bool play_texas_poker();
//发完5张牌判情况
void judge_game(const char* ranks, const char* suits, int ranks_size, int suits_size);

int rank_number(char rank);
int suit_number(char suit);

bool flush(char* suits,int n);
bool straight(char* ranks, int n);
int pairs_count(char* ranks, int n);
bool three_kind(char* ranks, int n);
bool four_kind(char* ranks, int n);


#define SIZE(a) (sizeof(a)/sizeof(a[0]))

int main(void) {
	while (true)
	{
		if (play_texas_poker() == false) {
			break;
		}
	}
	return 0;
}

bool play_texas_poker() {
	char suit;
	char rank;

	int count = 0;

	char cards_flag[13][4] = {0};

	char ranks[13] = {0};
	char suits[4] = {0};
	while (true)
	{
		printf("Enter a card: ");
		scanf(" %c", &rank);
		if (rank == '0') {
			return false;
		}
		scanf(" %c", &suit);

		int rank_num = rank_number(rank);
		int suit_num = suit_number(suit);

		if (rank_num == -1 || suit_num == -1) {
			printf("Bad card; ignored.\n");
			continue;
		}

		if (cards_flag[rank_num][suit_num] == 1) {
			printf("Duplicate card; ignored.\n");
			continue;
		}
		else
		{
			cards_flag[rank_num][suit_num] = 1;
			count++;
			ranks[rank_num]++;
			suits[suit_num]++;
		}

		if (count == 5) {
			judge_game(ranks, suits, SIZE(ranks), SIZE(suits));
			return true;
		}
	}

}

void judge_game(const char* ranks, const char* suits, int ranks_size, int suits_size) {
	if (flush(suits, suits_size) == true) {
		if (straight(ranks, ranks_size) == true) {
			printf("Straight flush\n\n");
			return;
		}
		else {
			printf("Flush\n\n");
			return;
		}
	}

	if (straight(ranks, ranks_size) == true) {
		printf("Straight\n\n");
		return;
	}

	int p_count = pairs_count(ranks, ranks_size);
	bool t_kind = three_kind(ranks, ranks_size);
	if (p_count != 0) {
		if (p_count == 2) {
			printf("Two Pairs\n\n");
			return;
		}
		else if (t_kind == true) {
			printf("Fullhouse\n\n");
			return;
		}
		else {
			printf("Pairs\n\n");
			return;
		}
	}

	if (t_kind == true) {
		printf("Three of a kind\n\n");
		return;
	}

	if (four_kind(ranks, ranks_size) == true) {
		printf("Four of a kind\n\n");
		return;
	}

	printf("High card\n\n");
	return;
}

bool flush(char* suits,int n) {
	for (int i = 0; i < n; i++)
	{
		if (suits[i] == 5) {
			return true;
		}
	}
	return false;
}

bool straight(char* ranks, int n) {
	for (int i = 0; i < n; i++) {
		if (ranks[i] == 1 && i <= 8) {
			if (
				ranks[i + 1] == 1
				&& ranks[i + 2] == 1 
				&& ranks[i + 3] == 1 
				&& ranks[i + 4] == 1) {
				return true;
			}
		}
	}
	return false;
}

int pairs_count(char* ranks, int n) {
	int count = 0;
	for (int i = 0; i < n; i++) {
		if (ranks[i] == 2) {
			count++;
		}
	}
	return count;
}


bool three_kind(char* ranks, int n) {
	for (int i = 0; i < n; i++) {
		if (ranks[i] == 3) {
			return true;
		}
	}
	return false;
}


bool four_kind(char* ranks, int n) {
	for (int i = 0; i < n; i++) {
		if (ranks[i] == 4) {
			return true;
		}
	}
	return false;
}

int rank_number(char rank) {
	int num;
	switch (rank)
	{
	case '2':
		num = 0;
		break;
	case '3':
		num = 1;
		break;
	case '4':
		num = 2;
		break;
	case '5':
		num = 3;
		break;
	case '6':
		num = 4;
		break;
	case '7':
		num = 5;
		break;
	case '8':
		num = 6;
		break;
	case '9':
		num = 7;
		break;
	case 't':
		num = 8;
		break;
	case 'j':
		num = 9;
		break;
	case 'q':
		num = 10;
		break;
	case 'k':
		num = 11;
		break;
	case 'a':
		num = 12;
		break;
	default:
		num = -1;
	}
	return num;
}


int suit_number(char suit) {
	int num;
	switch (suit)
	{
	case 'd':
		num = 0;
		break;
	case 'c':
		num = 1;
		break;
	case 'h':
		num = 2;
		break;
	case 's':
		num = 3;
		break;
	default:
		num = -1;
		break;
	}
	return num;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值