本文主要是介绍实验week2 C-瑞神打牌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述:
瑞神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的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
解题思路:
创建牌的结构体pai,成员有花色hs,牌号hao,重载小于运算符,实现hs升序,hao升序。花色和号的所有实例分别存储在hss和haoo数组中,函数funhs和funhao实现花色和牌号查找,辅助实现花色比较和牌号比较。再有一个player数组存储四个玩家S,W,N,E,分别对应数字0,1,2,3;创建pai结构体二维数组,当读入的字符不为’#'时,第一个被发牌的人为该字符(发牌员)对应的数字的后面一位(循环后移,即0->1,1->2,2->3,3->0),此后循环将数据存入二维数组中。
二维数组元素全部赋值完成后,用sort函数分别对四个一维数组排序,按照格式输出即可。
实验代码:
#include<iostream>
#include<sstream>
#include <algorithm>using namespace std; char hss[4]={'C','D','S','H'}; //花色
char haoo[13]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; //牌号 int funhs(char c)
{for(int i=0;i<4;i++)if(hss[i]==c)return i;return -1;
}
int funhao(char c)
{for(int i=0;i<13;i++)if(haoo[i]==c)return i;return -1;
}
struct pai
{char hs; //花色 char hao; //号码 bool operator<(const pai& a) const{if(hs!=a.hs)return funhs(hs)<funhs(a.hs); //比较花色大小 else return funhao(hao)<funhao(a.hao); //比较号码大小 }
};
char player[4]={'S','W','N','E'};
int fun(char c)
{for(int i=0;i<4;i++)if(c==player[i])return i;return -1;
}int main(void)
{pai a[4][13]; //每个人可以收到13张牌 char c;pai p;while(cin>>c){if(c=='#')return 0;int per=(fun(c)+1)%4; //被发牌的人int index[4]={0}; //每次都初始化为0,表示第i个人手中有多少张牌 for(int i=0;i<52;i++){cin>>p.hs>>p.hao; //输入数据 a[per][index[per]].hs=p.hs; //花色 a[per][index[per]].hao=p.hao; //号码index[per]++;per=(per+1)%4;}//排序 for(int i=0;i<4;i++)sort(a[i],a[i]+13); //排序每个人for(int i=0;i<4;i++){// cout<<player[i]<<endl;if(i==0)cout<<"South player:"<<endl;else if(i==1)cout<<"West player:"<<endl;else if(i==2)cout<<"North player:"<<endl;else if(i==3)cout<<"East player:"<<endl;cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;for(int j=0;j<13;j++)cout<<"|"<<a[i][j].hao<<" "<<a[i][j].hao;cout<<"|"<<endl;for(int j=0;j<13;j++)cout<<"|"<<" "<<a[i][j].hs<<" ";cout<<"|"<<endl;for(int j=0;j<13;j++)cout<<"|"<<a[i][j].hao<<" "<<a[i][j].hao;cout<<"|"<<endl;cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;} cout<<endl;}return 0;
}
这篇关于实验week2 C-瑞神打牌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!