• 扑克牌游戏-华为OJ-C++实现


    /*扑克牌游戏大家应该都比較熟悉了。一副牌由54张组成,含3~A、2各4张,小王1张。大王1张。牌面从小到大用例如以下字符和字符串表示(当中。小写joker表示小王,大写JOKER表示大王):
    3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
    输入两手牌。两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER。
    请比較两手牌大小,输出较大的牌,假设不存在比較关系则输出ERROR。


    基本规则:
    (1)输入每手牌可能是个子、对子、顺子(连续5张)、三个、炸弹(四个)和对王中的一种,不存在其它情况,由输入保证两手牌都是合法的。顺子已经从小到大排列;
    (2)除了炸弹和对王能够和全部牌比較之外,其它类型的牌仅仅能跟同样类型的存在比較关系(如,对子跟对子比較,三个跟三个比較),不考虑拆牌情况(如:将对子拆分成个子);
    (3)大小规则跟大家平时了解的常见规则同样,个子、对子、三个比較牌面大小;顺子比較最小牌大小;炸弹大于前面全部的牌。炸弹之间比較牌面大小。对王是最大的牌;
    (4)输入的两手牌不会出现相等的情况。


    答案提示:
    (1)除了炸弹和对王之外,其它必须同类型比較。
    (2)输入已经保证合法性。不用检查输入是否是合法的牌。
    (3)输入的顺子已经经过从小到大排序,因此不用再排序了。



    #include<iostream>
    #include<string>
    using namespace std;

    int main()
    {
         char value[13]={'3','4','5','6','7','8','9','10','J','Q','K','A','2'};    
         string s;
         getline(cin,s);
         int i,j,k,w;
         int type1,type2;// 1 个 2 对 3:三个 4:炸弹 5:顺子 6:个王 7:对王
         for(i=0;i<s.size();i++) //计算输入的 两副牌的类型
         {
              if(s[i]=='-')
              {
                   if(i==1)
                        type1=1;
                   else if(s[1]!=' ')  //s[1]不等于空格就是王
                   {
                        if(i==11)
                             type1=7;   //这样的情况样例:joker JOKER-1 2 3 4 5
                        else
                             type1=6;
                   }
                   else if(i==3)
                        type1=2;
                   else if(i==5)
                        type1=3;
                   else if(i==7)
                        type1=4;
                   else
                        type1=5;
                   break;
              }
         }
        
         j=i;
        
         if(s.size()==j+2)
              type2=1;
         else if(s[j+2]!=' ')    //s[1]不等于空格就是王
         {
              if(s.size()-j-1==11)
                   type2=7;       //这样的情况样例:1 2 3 4 5-joker JOKER
              else
                   type2=6;
         }
         else if(s.size()-j-1==3)
              type2=2;
         else if(s.size()-j-1==5)
              type2=3;
         else if(s.size()-j-1==7)
              type2=4;
         else
              type2=5;    
        
         if(type1==type2)   //假设类型同样
         {
              if(type1==6 && type2==6)
                   if(s[0]=='J')
                        for(w=0;w<j;w++)
                             cout<<s[w];
                        else
                             for(w=j+1;w<s.size();w++)
                                  cout<<s[w];    
                             else
                             {
                                  for(i=0;i<13;i++)  //通过索引表 比較两副牌第一张牌的大小
                                       if(s[0]==value[i])
                                            break;

                                       for(k=0;k<13;k++)
                                            if(s[j+1]==value[k])
                                                 break;
                                           
                                            if(i>k)
                                                 for(w=0;w<j;w++)
                                                      cout<<s[w];
                                                 else
                                                      for(w=j+1;w<s.size();w++)
                                                           cout<<s[w];                   
                             }
         }
         else
         {
              if(type1==6)   //单张牌假设是王  单独处理
                   for(w=0;w<j;w++)
                        cout<<s[w];
                   else if(type2==6)
                        for(w=j+1;w<s.size();w++)
                             cout<<s[w];    
                       
                        else if(type1==4)
                        {
                             if(type2==7)
                                  for(w=j+1;w<s.size();w++)
                                       cout<<s[w];    
                                  else
                                       for(w=0;w<j;w++)
                                            cout<<s[w];
                        }
                        else if(type1==7)
                        {
                             for(w=0;w<j;w++)
                                  cout<<s[w];    
                        }

                        else if(type2==4 || type2==7)
                             for(w=j+1;w<s.size();w++)
                                  cout<<s[w];    
                             else
                                  cout<<"ERROR";
         }
         cout<<endl;
         //     cout<<type1<<"     "<<type2<<endl;
         return 0;
    }



    /*///////////////////////////測试用例/////////
    A 2 3 4 5-2 3 4 5 6
    5-8 8
    5 5 5-8 8 8
    4 4 4 4-5 5 5 5
    A A A A-2 2 2 2
    8-2
    8-8 8 8 8
    8 8 8 8-joker JOKER
    9-joker JOKER
    9-joker
    joker-JOKER
    4 4 4 4-joker JOKER
    joker JOKER-A 2 3 4 5
    */
  • 相关阅读:
    PSP第二次总结
    周总结02
    四则运算2
    构建执法阅读笔记01
    周学习进度01
    暑假生活一
    构建之法阅读笔记03
    构建之法阅读笔记02
    个人课程总结
    软工大二下半年第十六周学习进度
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10498217.html
Copyright © 2020-2023  润新知