德州扑克:写一个程序循环读取 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;
}