题意:
四人打牌,围成一圈,顺时针为北 东 南 西。游戏一共由一副扑克(52张)构成。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。 开始指定一位发牌员(用英文首字母标识)顺时针发牌,第一张牌发给发牌员顺时针的下一个人,以‘#’则表示输入结束。
用C,D,S,H分别表示梅花,方片,黑桃,红桃。对于花色,规定C<D<S<H。对于牌面的值,规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。 从小到大排序每个人手中的牌,始终先输出South Player的结果,按照给定格式输出。
样例输入:
样例输出:
思路:
在main()函数中开一个类型为pair<char,char>大小位52的数组,存放四个人的牌。
为了排序以及输出方便,在读入数组时直接按照出牌顺序存储,即[0,12]是S的牌,[13,25]是W的牌,依次类推。所以在存入数组之前要计算,第一个拿到牌的人在第几个出牌,即从数组的哪个位置开始存放。定义一个map direct,欲存入四组数据,例如{‘W’,2}代表W发牌时,第一个拿到牌的人即N的牌应该从2*13的位置开始存放,其余人的牌通过固定的差值13进行计算位置。
在排序时,重载sort()的比较函数,利用map进行比较花色和数值的转换。
总结:
只开一个数组可以根据位置输出,减少代码量。
按输出顺序存入数组是一个比较好的方法,只需要在读入数据时懂一点脑经,后面会简单很多。
利用map进行一一映射,比起许多的if return循环性能可以提高很多。
代码:
#include<iostream>
#include<map>
#include<algorithm>
#define kang "+---+---+---+---+---+---+---+---+---+---+---+---+---+"
using namespace std;
map<char, int> value;
map<char, int> color;
bool com(pair<char, char>a, pair<char, char>b)
{
int ia = color.find(a.first)->second;
int ib = color.find(b.first)->second;
if (ia != ib)
return ia < ib;
else
{
int ja = value.find(a.second)->second;
int jb = value.find(b.second)->second;
return ja < jb;
}
}
int main()
{
value.insert({ '2',2 });
value.insert({ '3',3 });
value.insert({ '4',4 });
value.insert({ '5',5 });
value.insert({ '6',6 });
value.insert({ '7',7 });
value.insert({ '8',8 });
value.insert({ '9',9 });
value.insert({ 'T',10 });
value.insert({ 'J',11 });
value.insert({ 'Q',12 });
value.insert({ 'K',13 });
value.insert({ 'A',14 });
color.insert({ 'C',1 });
color.insert({ 'D',2 });
color.insert({ 'S',3 });
color.insert({ 'H',4 });
map<char, int> direct;
direct.insert({ 'E',0 });
direct.insert({ 'S',1 });
direct.insert({ 'W',2 });
direct.insert({ 'N',3 });
char licensing;//发牌人
while (cin >> licensing)
{
if (licensing == '#')
return 0;
int id = (direct.find(licensing)->second)*13;
pair<char, char> player[52];
for (int i = 0; i < 13; i++)
{
int num = 4;
int dif = id;
while (num--)
{
char a;
cin >> a;
player[i + id].first = a;
cin >> a;
player[i + id].second = a;
id = (id + 13) % 52;
}
}
for (int i = 0; i < 52; i = i + 13)
sort(player + i, player + 13 + i, com);
string name[4] = { "South player:","West player:","North player:","East player:" };
for (int i = 0; i < 4; i++)
{
cout << name[i] << endl;
cout << kang << endl;
for (int j = 13 * i; j < 13 * i + 13; j++)
{
cout << "|" << player[j].second << " " << player[j].second;
}
cout << "|" << endl;
for (int j = 13 * i; j < 13 * i + 13; j++)
{
cout << "|" << " " << player[j].first << " ";
}
cout << "|" << endl;
for (int j = 13 * i; j < 13 * i + 13; j++)
{
cout << "|" << player[j].second << " " << player[j].second;
}
cout << "|" << endl;
cout << kang << endl;
}
cout << endl;
}
}