Week2 实验C 打牌 排序

  • 题意:

S(南)、W(西)、N(北)、E(东)四位玩家顺时针就座打牌,按照给定发牌规则发牌后,每人13张牌,按照给定的排序规则,输出每人的牌的顺序。 

发牌规则:输入发牌员,发牌员从自己的顺时针下一位开始按顺时针依次发牌。  

排序规则: 花色:C(梅花)<D(方片)<S(黑桃)<H(红桃)数值:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A 先按花色排,花色相同按数值排。

  • 做法:

map结构mp1将数值符号映射到数字2-14,map结构mp2将花色符号映射到1-4,map结构mp3将'S'、'W'、'N'、'E'映射到1-4,map结构mp4将1-4映射到"South player:"、"West player:"、"North player:"、"East player:"。结构体card记录符号a和数值b,重写比较方法,第一关键字a(符号)按mp2映射值升序、第二关键字b(数值)按mp1映射值升序。vector<vector<card> >保存四位玩家的牌。

读入发牌员,按mp3映射到发牌员对应的数字,顺时针找到下一位玩家(若是4,返回1,否则,加1)。循环52次,每次读入两个字符,构造card,加入vector[当前玩家编号],顺时针找到下一个玩家。循环结束后,使用sort函数对四位玩家的牌排序。

代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
//数字 
map<char,int>mp1;
//花色 
map<char,int>mp2;
1-4 S W N E
map<char,int>mp3;
map<int,string>mp4;
struct card{
	char a;
	char b;
	bool operator<(const card&p)const{
		if(a!=p.a) return mp2[a]<mp2[p.a];
		if(b!=p.b) return mp1[b]<mp1[p.b];
	}
};
vector<vector<card> > v(5);
int main()
{
	mp1['2']=2;mp1['3']=3;mp1['4']=4;mp1['5']=5;mp1['6']=6;mp1['7']=7;mp1['8']=8;
	mp1['9']=9;mp1['T']=10;mp1['J']=11;mp1['Q']=12;mp1['K']=13;mp1['A']=14;
	
	mp2['C']=1;mp2['D']=2;mp2['S']=3;mp2['H']=4;
	
	mp3['S']=1;mp3['W']=2;mp3['N']=3;mp3['E']=4;
	
	mp4[1]="South player:";mp4[2]="West player:";mp4[3]="North player:";mp4[4]="East player:";
	
	char start;
	cin>>start;
	int current;
	card c;
	char a,b;
	while(start!='#')
	{
		current=mp3[start];
		if(current==4) current=1;
			else current++;
		for(int i=0;i<52;i++)
		{
			cin>>a>>b;
			c.a=a;
			c.b=b;
			v[current].push_back(c);
			if(current==4) current=1;
			else current++;
		}
		for(int i=1;i<5;i++)	sort(v[i].begin(),v[i].end());
		for(int i=1;i<5;i++)
		{
		cout<<mp4[i]<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
		for(int j=0;j<13;j++) 	cout<<"|"<<v[i][j].b<<" "<<v[i][j].b;
		cout<<"|"<<endl;
		for(int j=0;j<13;j++) 	cout<<"| "<<v[i][j].a<<" ";
		cout<<"|"<<endl;
		for(int j=0;j<13;j++) 	cout<<"|"<<v[i][j].b<<" "<<v[i][j].b;
		cout<<"|"<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
		}
		cout<<endl;
		for(int i=1;i<5;i++)
		{
			v[i].clear();
		} 
		cin>>start;
	}
	
	
	return 0; 
}

注意:

1.输出格式

2.每一次发牌排序完成后对vector清空

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值