ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

程序设计思维与实践 Week2 实验C 瑞神打牌

2020-03-05 20:44:34  阅读:257  来源: 互联网

标签:输出 ch 瑞神 else num && 打牌 Week2 发牌


题意

瑞神HRZ因为疫情在家闲得无聊,同时他又非常厉害,所有的课对他来说都是水一水就能拿A+,所以他无聊,找来了另外三个人:咕咕东,腾神以及zjm来打牌(天下苦瑞神久矣)。
显然,牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
现在你作为上帝,你要从小到大排序每个人手中的牌,并按照给定格式输出。(具体格式见输出描述和样例输出)。

Input

输入包含多组数据
每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。

Output

输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

Example

Input
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3

Output
在这里插入图片描述

思想

首先,定义一个结构体描述扑克牌,记录扑克牌的花色和数字,并撰写函数cmp,先比较花色再比较数字,值得注意的是当花色相同时,数字之间的比较需要分多种情况讨论。
再者,四人玩牌,每人手中有十三张牌,所以申请一个4行13列的二维数组,由于输出的顺序为South player、West player、North player、East player,所以在输入时,按此顺序将牌数依次按列存放。因为我们是从庄家的顺时针下一位开始发牌,将N-E-S-W作为一个循环圈,存放的行序为S-W-N-E,所以庄家序数为E-S-W-N,用num记录此序数0-1-2-3用以取模输入。输入完成后,对每一行,利用函数cmp排序。
最后,输出格式尤其注意!!

总结

这道题刚开始思路并不明显,只想到要从结构体和比较函数入手,但没有对于庄家下一位顺时针发牌的循环圈处理思路,在搜索学习后得到方法:存放的行序为S-W-N-E,所以庄家序数为E-S-W-N,用num记录此序数0-1-2-3用以输入。部分代码如下:

if(ch=='N') num=3;
  else if(ch=='E') num=0;
  else if(ch=='S') num=1;
  else if(ch=='W') num=2;
  for(int i=0;i<13;i++)
  {
   for(int j=0;j<4;j++)
    cin>>card[(j+num)%4][i].m>>card[(j+num)%4][i].n;
  }

代码

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct node
{
	char m,n;
}card[4][13];
bool cmp(node a,node b)
{
	if(a.m==b.m)
	{
		if(a.n>='2'&&a.n<='9'&&b.n>='2'&&b.n<='9')
			return a.n>b.n;
		else if(a.n=='T'&&b.n>='2'&&b.n<='9')
			return true;
		else if(a.n=='J'&&((b.n>='2'&&b.n<='9')||b.n=='T'))
			return true;
		else if(a.n=='Q'&&((b.n>='2'&&b.n<='9')||b.n=='T'||b.n=='J'))
			return true;
		else if(a.n=='K'&&((b.n>='2'&&b.n<='9')||b.n=='T'||b.n=='J'||b.n=='Q'))
			return true;
		else if(a.n=='A') return true;
		return false;
	}
	if(a.m=='H') return true;
	else if(a.m=='S')
	{
		if((b.m=='C')||(b.m=='D'))return true;
		return false;
	}
	else if(a.m=='D')
	{
		if(b.m=='C') return true;
		return false;
	}
	else return false;
}
int main()
{
	char ch;
	int num=0;
	while (	cin>>ch,ch!='#')
	{ 
		if(ch=='N') num=3;
		else if(ch=='E') num=0;
		else if(ch=='S') num=1;
		else if(ch=='W') num=2;
		for(int i=0;i<13;i++)
		{
			for(int j=0;j<4;j++)
				cin>>card[(j+num)%4][i].m>>card[(j+num)%4][i].n;
		}
		for(int i=0;i<4;i++)
		{
			sort(card[i],card[i]+13,cmp); //排序 
		}
		for(int i=0;i<4;i++)
		{
			if(i==0)cout<<"South player:"<<endl;
			if(i==1)cout<<"West player:"<<endl;
			if(i==2)cout<<"North player:"<<endl;
			if(i==3)cout<<"East player:"<<endl;
			cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
			for(int k=12;k>=0;k--)
			{
				cout<<"|"<<card[i][k].n<<" "<<card[i][k].n;
			}
			cout<<"|"<<endl;
			for(int k=12;k>=0;k--)
			{
				cout<<"| "<<card[i][k].m<<" ";
			}
			cout<<"|"<<endl;
			for(int k=12;k>=0;k--)
			{
				cout<<"|"<<card[i][k].n<<" "<<card[i][k].n;
			}
			cout<<"|"<<endl;
			cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
			if(i==3) cout<<endl;
		}
	}
	return 0; 
}

标签:输出,ch,瑞神,else,num,&&,打牌,Week2,发牌
来源: https://blog.csdn.net/qq_45337415/article/details/104660174

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有