要考虑的情况有点多,难度在两方面,一个是牌的大小顺序,这里我选择写一个函数返回牌的大小(注意这里的10很烦人,它占了两个字符,但是只有10是以1打头的,所以可以“以一当十”。另外一个难点是判断牌的类型,由于炸弹的优先级最高,按照双王,炸弹优先的顺序来写逻辑,抛开所有炸弹的情况后,再进行牌的类型判断,主要依据是两个字符串的空格数,空格数相同就是一类牌,相同的空格数才能比较。比较的时候比较第一位即可,
#include<string>
using namespace std;
int getValue(char s){
if(s=='2') return 15;
if(s=='A') return 14;
if(s=='K') return 13;
if(s=='Q') return 12;
if(s=='J') return 11;
if(s=='1') return 10;//只有10开头是1,所以用1代替10;
else
return (s-'3'+3);
}
int main(){
string s;
while(getline(cin,s)){
string str1="";
string str2="";
int k=0;
for(int i=0;i<s.size();i++){
if(s[i]!='-'){
str1+=s[i];
}
else{
k=i+1;
break;
}
}
for(int i=k;i<s.size();i++){
str2+=s[i];
}
int space1=0;//根据空格数量判断牌的类型。
int space2=0;
for(int i=0;i<str1.size();i++){
if(str1[i]==' '){
space1++;
}
}
for(int j=0;j<str2.size();j++){
if(str2[j]==' '){
space2++;
}
}
//出现王的情况单独拎出来。
if(str1=="joker JOKER"||str2=="joker JOKER"){
cout<<"joker JOKER";
}
//单个的:如果出现一方有大小王。
else if(str1=="JOKER"||str2=="JOKER"){
cout<<"JOKER";
}
else if(str1=="joker"||str2=="joker"){
cout<<"joker";
}
//出现三个空格说明有炸弹。如果两个都有炸弹
else if(space1==3&&space2==3){
getValue(str1[0])<getValue(str2[0])?cout<<str2 : cout<<str1;
}
//如果只有一方有炸弹,谁是炸弹输出谁。
else if(space1==3||space2==3){
if(space1==3) cout<<str1;
if(space2==3) cout<<str2;
}
//炸弹的特殊情况判断完了 开始判断类型是否一致。
else if(space1!=space2){
cout<<"ERROR";
}
else{
getValue(str1[0])<getValue(str2[0])?cout<<str2 : cout<<str1;
}
cout<<endl;
}
}