【C-四人打牌】排序问题

题意:

四人打牌,围成一圈,顺时针为北 东 南 西。游戏一共由一副扑克(52张)构成。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。 开始指定一位发牌员(用英文首字母标识)顺时针发牌,第一张牌发给发牌员顺时针的下一个人,以‘#’则表示输入结束。

用C,D,S,H分别表示梅花,方片,黑桃,红桃。对于花色,规定C<D<S<H。对于牌面的值,规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。 从小到大排序每个人手中的牌,始终先输出South Player的结果,按照给定格式输出。

样例输入:
NCTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3#
样例输出:
在这里插入图片描述

思路:

在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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值