- 题意:
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清空