mioj德州撲克

小米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…結果。。。在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章