mioj德州扑克

版权声明:spark https://blog.csdn.net/qq_35619728/article/details/89016137

小米oj

德州扑克


描述
德州扑克是风靡全球的一种扑克游戏。扑克有四种花色,分别为黑桃(S)、红桃(H)、梅花(C)、方片(D)。每种花色有13张牌,从小到大分别为2、3、4、5、6、7、8、9、10、J、Q、K、A。


考虑德州扑克中的如下三种牌形: 同花顺(Straight Flush):同一花色,并且连续的五张牌。 例如:{SK SQ SJ S10 S9} 对于连续的五张牌,有一个特例,即 {A、2、3、4、5} 也算作连续的五张牌。但 {K、A、2、3、4},{Q、K、A、2、3},{J、Q、K、A、2} 不算作连续的五张牌。


同花(Flush):同一花色但不连续的五张牌。 例如:{H10 H7 H4 H3 H2}

顺子(Straight):连续但不是同一花色的五张牌。 例如:{SA H2 D3 C4 D5}

这三种牌形的大小关系是:顺子 < 同花 < 同花顺。 现在,我们为了游戏的趣味性,在扑克中加入了5张魔术牌(用M表示),你可以将每张魔术牌变成你想要的任何一张牌。 你从牌堆里随机抽了五张牌,请你给出最大可能的牌形。如果三种牌形都无法组成,请输出GG。


输入
一行字符串,表示使用空格分隔的五张牌,每张牌由花色与点数组成(或使用M来表示魔术牌)。


输出
单组输入。 一行字符串,表示能够组成的最大牌形。 只有Flush、Straight、Straight Flush、GG四种结果。


这个题和昨天做的那个扑克游戏类似,难度稍微低一些,不用比较两副牌的大小,虽然增加了花色和癞子。。。。有了上回的530行的坑,这回的读取相对就比较的容易了。

while (~scanf("%c", &a))
	{
		if (a == 'p')//p作为输出结束标志       最后提交没有这一项
			break;
		if (a == ' ');
		else
		{
			if (a == 'S')
			{
				b[i] = 1;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'H')
			{
				b[i] = 2;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'C')
			{
				b[i] = 3;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'D')
			{
				b[i] = 4;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'M')
			{
				b[i] = 5;
				i++;
				d[j] = 0;
				j++;
			}

		}
	}

…然后所有的花色被存入了b这个数组里面 我把SHCD 映射成1 2 3 4把癞子 M映射到5.然后我把牌的点数大小放在了d这个数组里。2-14然后。。。。。开始写程序。。。。。。 上午。。。。写了一个多小时。。。(此时的我比较菜。。。。)然后写好了。。贴下代码

#include <stdio.h>
#include "stdlib.h"


int compare(const void *a, const void *b);//排序比较函数
int compare(const void *a, const void *b)
{
	return *(int*)b - *(int*)a;  //降序排列
}
int main()
{
	static int b[5], d[5];//用来存放字母和数字的数组
	static int i, j, k, h;
	static char a;
	while (~scanf("%c", &a))
	{
		if (a == 'p')//p作为输出结束标志       最后提交没有这一项
			break;
		if (a == ' ');
		else
		{
			if (a == 'S')
			{
				b[i] = 1;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'H')
			{
				b[i] = 2;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'C')
			{
				b[i] = 3;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'D')
			{
				b[i] = 4;
				i++;
				scanf("%c", &a);
				if (a == '1')
				{
					scanf("%c", &a);//在看下一个a是多少
					if (a == '0')
						h = 10;
					else if (a == ' ')
						h = 1;
				}
				else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
				else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
				else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
				else if (a == 'K')h = 13; else if (a == 'A')h = 14;
				d[j] = h;
				j++;
			}
			else if (a == 'M')
			{
				b[i] = 5;
				i++;
				d[j] = 0;
				j++;
			}

		}
	}
	/*排序函数给b d 排序*/
	int length = sizeof(b) / sizeof(int);
	int length1 = sizeof(d) / sizeof(int);
	qsort(b, length, sizeof(int), compare);
	qsort(d, length1, sizeof(int), compare);

	//printf("%d %d  %d  %d   %d  %d  %d  %d\n", b[0], b[1], b[2], b[3], d[0], d[1], d[2], d[3]);

	int flag1=2, flag2=2,count=0;//同花和顺子
	if (  
		((b[0] == 5 || b[0] == 1) && (b[4] == 5 || b[4] == 1) && (b[1] == 5 || b[1] == 1) && (b[2] == 5 || b[2] == 1) && (b[3] == 5 || b[3] == 1)) ||
		((b[0] == 5 || b[0] == 2) && (b[4] == 5 || b[4] == 2) && (b[1] == 5 || b[1] == 2) && (b[2] == 5 || b[2] == 2) && (b[3] == 5 || b[3] == 2)) ||
		((b[0] == 5 || b[0] == 3) && (b[4] == 5 || b[4] == 3) && (b[1] == 5 || b[1] == 3) && (b[2] == 5 || b[2] == 3) && (b[3] == 5 || b[3] == 3)) ||
		((b[0] == 5 || b[0] == 4) && (b[4] == 5 || b[4] == 4) && (b[1] == 5 || b[1] == 4) && (b[2] == 5 || b[2] == 4) && (b[3] == 5 || b[3] == 4))
		)
	{
		flag1 = 1;
	}
	/*算有多少个M*/
	for (i = 0; i < 5; i++)
	{
		if (d[i] == 0)
			count++;
	}
	//如果有对子直接不是顺子
	for (i = 0; i < 5; i++)
	{
		if (d[i] == d[i + 1]&&d[i]!=0)
			flag2 = 0;
	}
	if (flag2 == 0)
		;
	else
	{
		for (i = 0, j = 0; i < 5; i++)
		{
			if (d[i] == 14 || d[i] <= 5)
				j++;
		}
		if (d[0] - d[4 - count] <= 4)//顺子
			flag2 = 1;

		else if (j == 5)
		{
			flag2 = 1;
		}
		else
		{
			flag2 = 0;
		}



	}
	if (flag1 == 1 && flag2 == 1)
	{
		printf("Straight Flush");
	}
	else if (flag1 == 1 && flag2 != 1)
	{
		printf("Flush");
	}
	else if (flag1 != 1 && flag2 == 1)
	{
		printf("Straight");
	}
	else
	{
		printf("GG");
	}
	//printf("%d  %d \n", flag1, flag2);
	return 0;
}

然后估计又是没啥人用c…结果。。。在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35619728/article/details/89016137