大一C语言总结贴(持更) Part 11 同花顺

【问题描述】

编程分析一手5张牌的牌型,输出最好的牌型。每张牌有四种花色(方块Diamonds、梅花Clubs、红桃Hearts、黑桃Spades)和等级(2、3、4、5、6、7、8、9、10、J、Q、K、A),这里A看做最小等级。牌型从大到小有:

◦同花顺 Straight Flush(同花色且等级顺序相连)

◦四张 Four of A Kind(4张牌等级相同)

◦葫芦 Full House(3张牌等级相同,另2张牌也等级相同)

◦同花 Flush(5张牌花色相同)

◦顺子 Straight(5张牌等级顺序相连)

◦三张 Three of A Kind(3张牌等级相同)

◦两对 Two Pairs(存在两个对子)

◦对子 Pair(2张牌等级相同)

◦其他 Other

输入时,花色用首字母表示,等级用数字或字母表示(10用T表示)。

若输入非法牌或重复牌则丢弃。若输入为0则结束程序。


【输入形式】

输入为若干行,每行包括5张牌,每张牌表示为花色+等级的形式,例如:红桃4表示为“H4”,两张牌之间用一个空格隔开,第5张牌之后没有空格

最后一行输入为:0,表示输入结束。
【输出形式】

输出为若干行,每一行输出表示对于一手5张牌(对应输入中的每一行)的分析结果。如果5张牌中包括非法牌(不在52张之中)或含有重复牌,则输出“Invalid”,否则,根据题目中描述的牌型,输出匹配的等级最大的牌型名称。
【样例输入】

DA C5 S3 H2 D4

H6 D8 DK SA AT

0


【样例输出】

Straight

Invalid

【样例说明】

第一行输入可以组成“方块A 红桃2 黑桃3 方块4 梅花5”的顺子,故第一行输出为“Straight”

第二行输入包含“AT”不属于题目中描述的52张牌,故输出“Invalid”

注:对于同花顺和顺子,本题中假设A为最小等级,故组成顺子时,“A1234”“9TJQK”可以组成顺子,而“TJQKA”不可以组成顺子。

特别提醒!!!本题中每行末尾的换行是“\r\n”因此如果输入按字符读取,请注意行末的“\r\n”对应两个字符!

代码

#include <stdio.h>
#include<stdlib.h>
void bubblesort(int comp[5]);
int main()
{
	int i, j, k, r, s; /*辅助变量*/ 
	int choosecolor, choosenum, sum_i = 0, judge, select = 0; 
	/*分别定义颜色及点数分类类别 choosecolor,choosenum;
	总行数sum_i;判断输入是否合法的 judge,select */ 
	char color[666][5], num[666][5];
	for (i = 0; ; i++) 
	{
		for (j = 0; j <= 4; j++)
		{
			if (j == 0) 
			{
				scanf("%c", &color[i][0]);
				if (color[i][0] == '0')  
					break;                /*先读入第一个color,若为0直接结束*/
				else 
					scanf("%c ", &num[i][j]);          /*读入第一个数字*/
			}
			else if (j != 4) 
				scanf("%c%c ", &color[i][j], &num[i][j]);
			    else 
				scanf("%c%c\r\n", &color[i][j], &num[i][j]);
			
			
				if (num[i][j] == 'A') num[i][j] = 49;	
				if (num[i][j] == 'T') num[i][j] = 58;  
				if (num[i][j] == 'J') num[i][j] = 59;
				if (num[i][j] == 'Q') num[i][j] = 60;
				if (num[i][j] == 'K') num[i][j] = 61;/*为了后续顺子排序方便,因为2至9对应ASCII码
				为50至57,将A,T,J,Q,K分别进行转化为49,58,59,60,61*/
				if ( (num[i][j] < 49 || num[i][j] > 61) )
					select = 1; /*去掉A至K以外的非法牌*/ 
					
					 
		} 
		if (color[i][0] == '0') break;    /*读到0直接结束*/
	}
	sum_i = i - 1;
	
    for (k = 0; k <= sum_i; k++)  
	{
	  	choosecolor = 0;
	  	choosenum = 0; 
	  	judge = 0;
	    for (r = 0; r <= 4; r++)
		{	
		    if ( (color[k][r] != 67) && (color[k][r] != 68) 
				&& (color[k][r] != 72) && (color[k][r] != 83) ) 
			{ 
				judge = 1; 
			} 
		    for (s = r + 1; s <= 4; s++)  
			    if ( (color[k][s] == color[k][r]) && (num[k][s] == num[k][r]) ) 
			    { 
					judge =1;
				} 
		if (judge == 1)
		
			break;
			
		}

		void bubblesort(int comp[5]);  /*引用函数*/  
		int a[5] = {color[k][0], color[k][1], color[k][2], color[k][3], color[k][4]};
		int b[5] = {num[k][0], num[k][1], num[k][2], num[k][3], num[k][4]};
        bubblesort(a);
        bubblesort(b);
			
		if (a[0] == a[4])
		choosecolor = 1; /*同花(因为按顺序排好,首尾相等即可)*/
		
			
		if (b[0] == b[1] - 1 && b[1] == b[2] - 1 
			&& b[2] == b[3] - 1 && b[3] == b[4] - 1)
			choosenum = 1; 
			                    /*顺子*/
		else if ((b[0] == b[3]) || (b[1] == b[4]))
			choosenum = 2;    
			               /*四张 (因为按顺序排好,首尾相等即可)*/
		else if ( ( (b[0] == b[2]) && (b[3] == b[4]) ) 
			    || ( (b[2] == b[4]) && (b[0] == b[1]) ) )
			choosenum = 3;                      
							 /*葫芦*/
		else if ( (b[0] == b[2]) || (b[1] == b[3]) || (b[2] == b[4]) )
			choosenum = 4;                   	
								 /*三张*/
		else if ( (b[0] == b[1] && b[2] == b[3]) 
				|| (b[0] == b[1] && b[3] == b[4]) 
			    || (b[1] == b[2] && b[3] == b[4]) ) 
		  	choosenum = 5;
		  						/*两对*/	
		else if ((b[0] == b[1]) || (b[1] == b[2]) 
				|| (b[2] == b[3]) || (b[3] == b[4]))
			    choosenum = 6;
			    				/*对子*/
		
			
		{
			if (judge == 1 || (select == 1) )
				printf("Invalid\n");
			else if (choosecolor == 1 && choosenum == 1) 
				printf("Straight Flush\n");
			else if (choosenum == 2) 
				printf("Four of A Kind\n");
			else if (choosenum == 3) 
				printf("Full House\n");
			else if (choosecolor == 1) 
				printf("Flush\n");
			else if (choosenum == 1) 
				printf("Straight\n");
			else if (choosenum == 4) 
				printf("Three of A Kind\n");
			else if (choosenum == 5) 
				printf("Two Pairs\n");
			else if (choosenum == 6) 
				printf("Pair\n");
			else printf("Other\n");
		}
	} 								/*输出*/
	system("pause");
    return 0;
}

void bubblesort(int comp[5])  /* 设计一个将数字顺序排列的函数*/ 
{
	int i, j, temp=0;
	for (i = 0; i < 5; i++)
	{
		for (j = i + 1; j < 5; j++)
		{
			if(comp[i] > comp[j])
			{
				temp = comp[i]; 
				comp[i] = comp[j];
				comp[j] = temp;  /*冒泡法获得升序排列的值*/ 
			}
		}
	}
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值