瑞神打牌(题解)

题意:牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。 牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
要求:从小到大排序每个人手中的牌,并按照给定格式输出。
思路:首先,对输入的字符串进行处理,循环发放的情况下,利用对4取模得到下标,获得牌的信息,创建两个结构体,一个表示牌的信息,花色和数值,并按照规定对<进行重载,另一个表示甲乙丙丁的信息,牌数,然后对每个人的牌进行sort排序。
总结:该题就主要考察了sort排序,对字符串信息的获取。
代码

#include<iostream>
#include<algorithm>
using namespace std;
struct pai
{
	char hs;
	char num;
	bool operator<(const pai& a)
	{
		if(hs!=a.hs)
		{
			if(hs=='C')
			return true;
			if(hs=='D')
			{
				if(a.hs=='S'||a.hs=='H') return true; 
				 return false;
			}
			if(hs=='S')
			{
				if(a.hs=='H')  return true;
				return false;
			}
			if(hs=='H')  return false;
		} 
		if(num>='2'&&num<='9') 
		{
			if(a.num>'9')  return true;  
			return num<a.num;
		 } 
		if(num=='T')  
		{
			if(a.num<='9') return false;
			return true;
		}
		if(num=='J')
		{
			if(a.num=='T'||a.num<='9')  return false;
			return true;
		}
		if(num=='Q')
		{
			if(a.num=='K'||a.num=='A')  return true;
			return false;
		}
		if(num=='K')
		{
			if(a.num=='A')  return true;
			return false;
		}
		if(num=='A') return false;	
	}
	
}pa[200];
struct person
{  
	pai p[20];
}per[4];
int main()
{  // freopen("in.txt","r",stdin);
	char n;cin>>n;
	while(n!='#')
	{  
	char str[200];cin>>str>>str+52;
	int x1=0,x2=0,x3=0,x4=0;
		for(int i=0,k=0;i<104;i=i+2,k++)
		{    if(k%4==0)
	     	{
			per[k%4].p[x1].hs=str[i];
			per[k%4].p[x1++].num=str[i+1];
		    }
		     if(k%4==1)
		     	{
			per[k%4].p[x2].hs=str[i];
			per[k%4].p[x2++].num=str[i+1];
		    }
		     if(k%4==2)
		     	{
			per[k%4].p[x3].hs=str[i];
			per[k%4].p[x3++].num=str[i+1];
		    }
		     if(k%4==3)
		     	{
			per[k%4].p[x4].hs=str[i];
			per[k%4].p[x4++].num=str[i+1];
		    }	
		}
	for(int i=0;i<4;i++)  sort(per[0].p,per[0].p+13);
	  int flag;
	     	if(n=='N')  flag=1;
	     	if(n=='E')  flag=0;
	     	if(n=='S')  flag=3;
	     	if(n=='W')  flag=2;
	     	for(int k=0;k<4;k++)
	     	{
	     		if(k==0) cout<<"South player:"<<endl;
	     		if(k==1) cout<<"West player:"<<endl;
				 if(k==2) cout<<"North player:"<<endl;
		       if(k==3) cout<<"East player:"<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
		int t=(k+flag)%4;
		for(int i=0;i<13;i++)	
		{    if(i==12)                                                     
			cout<<"|"<<per[t].p[i].num<<' '<<per[t].p[i].num<<"|"<<endl; 
			else 	cout<<"|"<<per[t].p[i].num<<' '<<per[t].p[i].num;		
		}
		for(int i=0;i<13;i++)
		{if(i==12) cout<<"|"<<' '<<per[t].p[i].hs<<' '<<"|"<<endl;
			else cout<<"|"<<' '<<per[t].p[i].hs<<' ';
		}
		for(int i=0;i<13;i++)	
		{    if(i==12) 
			cout<<"|"<<per[t].p[i].num<<' '<<per[t].p[i].num<<"|"<<endl;
			else 	cout<<"|"<<per[t].p[i].num<<' '<<per[t].p[i].num;		
		}
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
		}	 cout<<endl;
			 cin>>n;
	}  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值