Week2 实验C - 瑞神打牌

题目描述

瑞神HRZ因为疫情在家闲得无聊,同时他又非常厉害,所有的课对他来说都是水一水就能拿A+,所以他无聊,找来了另外三个人:咕咕东,腾神以及zjm来打牌(天下苦瑞神久矣)。
显然,牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
现在你作为上帝,你要从小到大排序每个人手中的牌,并按照给定格式输出。(具体格式见输出描述和样例输出)。

Input

输入包含多组数据
每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。

Output

输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

Sample Input

N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#

Sample Output

South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+

解题思路

本题的难点为如何处理牌、花色相对大小及发牌顺序。
用结构体储存当前牌的花色、大小 。
通过枚举来比较大小,但输入、输出时要相对应转换。
通过取余4判断当前位置的牌是谁的。
用4个数组分别储存每个人的牌。

完整代码

//用结构体储存当前牌的花色、大小 
//知道每次具体输入的数目,即52个,所以用结构体数组,52个单元
//for循环,通过取余4判断当前位置的牌是谁的
//用4个数组分别储存每个人的牌 

#include<iostream>
using namespace std;

enum amount{C,D,S,H,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,T,J,Q,K,A};
struct Card
{
	amount color;
	amount number;

};

void clarify(Card a[],Card b[],Card c[],Card d[],Card card[])
{
		int a0=0;
		int b0=0;
		int c0=0;
		int d0=0;
	
		for(int i=0;i<52;i++)
	
		{		if(i%4==0)
					{a[a0].color=card[i].color;
					a[a0].number=card[i].number;
					a0++;}
				
				if(i%4==1)
					{b[b0].color=card[i].color;
					b[b0].number=card[i].number;
					b0++;}
				
				if(i%4==2)
					{c[c0].color=card[i].color;
					c[c0].number=card[i].number;
					c0++;}
					
				if(i%4==3)
					{d[d0].color=card[i].color;
					d[d0].number=card[i].number;
					d0++;}	
					
					
					}		
		



}

void Output(Card a[])
{
	for(int i=0;i<12;i++)//排序
		for(int l=0;l<12;l++)
		{	if(a[l].color>a[l+1].color)
				{
				amount co=a[l].color;
				amount nu=a[l].number;
				a[l].color=a[l+1].color;
				a[l+1].color=co;
				a[l].number=a[l+1].number;
				a[l+1].number=nu;
				} 
			else if(a[l].color==a[l+1].color)
				if(a[l].number>a[l+1].number) 
					{amount co=a[l].color;
					amount nu=a[l].number;
					a[l].color=a[l+1].color;
					a[l+1].color=co;
					a[l].number=a[l+1].number;
					a[l+1].number=nu;
				} 
				}
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;  
	cout<<"|";		
			for(int i=0;i<13;i++)
	{	
		switch (a[i].number){
			case T:
				cout<<"T";
				break;
			
			case J:
				cout<<"J";
				break;
			
			case Q:
				cout<<"Q";
				break;
			
			case K:
				cout<<"K";
				break;
				
			case A:
				cout<<"A";
				break;
				
			case TWO:
				cout<<"2";
				break;
				
			case THREE:
				cout<<"3";
				break;
				
			case FOUR:
				cout<<"4";
				break;
				
			case FIVE:
				cout<<"5";
				break;
				
			case SIX:
				cout<<"6";
				break;
				
			case SEVEN:
				cout<<"7";
				break;
				
			case EIGHT:
				cout<<"8";
				break;
				
			case NINE:
				cout<<"9";
				break;
			}
				
			cout<<" ";
		
		switch (a[i].number){
			case T:
				cout<<"T";
				break;
			
			case J:
				cout<<"J";
				break;
			
			case Q:
				cout<<"Q";
				break;
			
			case K:
				cout<<"K";
				break;
				
			case A:
				cout<<"A";
				break;
				
			case TWO:
				cout<<"2";
				break;
				
			case THREE:
				cout<<"3";
				break;
				
			case FOUR:
				cout<<"4";
				break;
				
			case FIVE:
				cout<<"5";
				break;
				
			case SIX:
				cout<<"6";
				break;
				
			case SEVEN:
				cout<<"7";
				break;
				
			case EIGHT:
				cout<<"8";
				break;
				
			case NINE:
				cout<<"9";
				break;
			
		}cout<<"|";} 
		cout<<endl;
	cout<<"| ";	
	for(int i=0;i<13;i++)
		{
		
		switch (a[i].color){
			case 0:
				cout<<"C";
				break;
			
			case 1:
				cout<<"D";
				break;
			
			case 2:
				cout<<"S";
				break;
			
			case 3:
				cout<<"H";
				break;
		}
		cout<<" | ";}
		cout<<endl;
		cout<<"|";
		for(int i=0;i<13;i++)
	{	
		switch (a[i].number){
			case T:
				cout<<"T";
				break;
			
			case J:
				cout<<"J";
				break;
			
			case Q:
				cout<<"Q";
				break;
			
			case K:
				cout<<"K";
				break;
				
			case A:
				cout<<"A";
				break;
				
			case TWO:
				cout<<"2";
				break;
				
			case THREE:
				cout<<"3";
				break;
				
			case FOUR:
				cout<<"4";
				break;
				
			case FIVE:
				cout<<"5";
				break;
				
			case SIX:
				cout<<"6";
				break;
				
			case SEVEN:
				cout<<"7";
				break;
				
			case EIGHT:
				cout<<"8";
				break;
				
			case NINE:
				cout<<"9";
				break;
			}
			cout<<" ";
		
		switch (a[i].number){
			case T:
				cout<<"T";
				break;
			
			case J:
				cout<<"J";
				break;
			
			case Q:
				cout<<"Q";
				break;
			
			case K:
				cout<<"K";
				break;
				
			case A:
				cout<<"A";
				break;
				
			case TWO:
				cout<<"2";
				break;
				
			case THREE:
				cout<<"3";
				break;
				
			case FOUR:
				cout<<"4";
				break;
				
			case FIVE:
				cout<<"5";
				break;
				
			case SIX:
				cout<<"6";
				break;
				
			case SEVEN:
				cout<<"7";
				break;
				
			case EIGHT:
				cout<<"8";
				break;
				
			case NINE:
				cout<<"9";
				break;
			
		}cout<<"|";} 
		cout<<endl;
	cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
	


}
int main(){
	char dealer;//发牌员 
	Card c[52];
	Card n[13];
	Card e[13];
	Card s[13];
	Card w[13];
	
	while(1)
	{	cin>>dealer;
		if(dealer=='#')
			break;
	for(int i=0;i<52;i++)
		{char col;
		char num;
		cin>>col>>num;
		switch (col){
			case 'C':
				c[i].color=C;
				break;
			
			case 'D':
				c[i].color=D;
				break;
			
			case 'S':
				c[i].color=S;
				break;
			
			case 'H':
				c[i].color=H;
				break;
		}
		
		switch (num){
			case 'T':
				c[i].number=T;
				break;
			
			case 'J':
				c[i].number=J;
				break;
			
			case 'Q':
				c[i].number=Q;
				break;
			
			case 'K':
				c[i].number=K;
				break;
				
			case 'A':
				c[i].number=A;
				break;
			
			case '2':
				c[i].number=TWO;
				break;
			
			case '3':
				c[i].number=THREE;
				break;
			
			case '4':
				c[i].number=FOUR;
				break;
			
			case '5':
				c[i].number=FIVE;
				break;
			
			case '6':
				c[i].number=SIX;
				break;
			
			case '7':
				c[i].number=SEVEN;
				break;
			
			case '8':
				c[i].number=EIGHT;
				break;
			
			case '9':
				c[i].number=NINE;
				break;
		}}
		if(dealer=='N')
			clarify(e,s,w,n,c);
		
		else if(dealer=='E')
			clarify(s,w,n,e,c);
		
		else if(dealer=='S')
			clarify(w,n,e,s,c);
		
		else if(dealer=='W')
			clarify(n,e,s,w,c);

		
		cout<<"South player:"<<endl;Output(s);
		cout<<"West player:"<<endl;Output(w);
		cout<<"North player:"<<endl;Output(n);
		cout<<"East player:"<<endl;Output(e);
		cout<<endl;
		}
		
		
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值