扎金花

来源:互联网 发布:雷科防务怎么样 知乎 编辑:程序博客网 时间:2024/05/01 00:46
两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。游戏规则:共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 对于牌型的规则如下: 1.三张牌一样即为豹子 2.三张牌相连为顺子(A23不算顺子) 3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。 
解题思路:

首先拿到这两组牌后,将这两组牌进行转换,使每一张牌转化为对应的数值

2-2,3-3,4-4,5-5,6-6,7-7,8-8,9-9,10-10,J-11,Q-12,K-13,A-14

将两组牌转换以后,首先分别对他们排序

1)排序后,判断两组牌的类型。如果两组牌的类型不同,那就好办,只要按  豹子>顺子>对子>普通牌型 判断就可以

2)如果两组牌的类型相同,在进行具体的判断


#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;//将str转化为对应一组的整数,如果str合法,返回true,否则返回falsebool strtoVec(string& str, vector<int> &vec){size_t i = 0;for(int cnt = 0; cnt < 3; cnt++){ switch(str[i]) {case '1':if(str[i+1] != '0'){return false;}vec.push_back(10);i = i + 2;break;case '2':;case '3':;case '4':;case '5':;case '6':;case '7':;case '8':;case '9':vec.push_back(str[i] - '2' + 2);i++;break;case 'J':vec.push_back(11);i++;break;case 'Q':vec.push_back(12);i++;break;case 'K':vec.push_back(13);i++;break;case 'A':vec.push_back(14);i++;break;default:return false;};}if(i != str.size()){return false;}return true;}//判断牌的类型:如果是豹子返回4,顺子返回3,对子返回2,其他返回1int judgeCards(vector<int> &vec){if(vec[2] == vec[1] && vec[1] == vec[0])return 4;if(vec[0] + 1 == vec[1] && vec[1] + 1 == vec[2])return 3;if(vec[0] == vec[1] || vec[1] == vec[2])return 2;return 1;}//comp函数是在两组牌类型相同的情况下判断,两组牌的大小//两组牌相等返回0, vec1大于vec2返回1, vec1小于vec2返回-1int comp(vector<int> &vec1, vector<int> &vec2, int type1){switch(type1){case 4://都为豹子if(vec1[0] == vec2[0]){return 0;}else if(vec1[0] > vec2[0]){return 1;}else {return -1;}break;case 3://都为顺子if(vec1[2] > vec2[2]){return 1;}else if(vec1[2] < vec2[2]){return -1;}else {//vec1[2] == vec2[2],且它们均为顺子return 0;}break;case 2://都为对子//由于我们的数组时经过排序的,所以对子的那个元素一定是中间位置上的那个元素if(vec1[1] == vec2[1])return 0;else if(vec1[1] > vec2[1])return 1;elsereturn -1;break;case 1://都为普通牌for(int i = 2; i >= 0; i--){if(vec1[i] == vec2[i]){continue;}else if(vec1[i] < vec2[i]){return -1;}else {return 1;}}return 0;break;}}int main(void){string str1, str2;vector<int> vec1(3, 0);vector<int> vec2(3, 0);bool b1, b2;while(cin >> str1 >> str2){vec1.clear();vec2.clear();//将两组牌转化为对应的数字b1 = strtoVec(str1, vec1);b2 = strtoVec(str2, vec2);if(b1 && b2){sort(vec1.begin(), vec1.end());sort(vec2.begin(), vec2.end());//判断两组牌的类型,并将他们的类型分别保存在type1/type2中int type1 = judgeCards(vec1);int type2 = judgeCards(vec2);if (type1 > type2)//两组牌属于不同类型{cout << 1 << endl;}else if(type1 < type2)//两组牌属于不同类型{cout << -1 << endl;}else if(type1 == type2)//如果两组牌属于同一类型{int result = comp(vec1, vec2, type1);switch(result) {case 0:cout << 0 << endl;break;case 1:cout << 1 << endl;break;default:cout << -1 << endl;break;}}}else{//输入不合法cout << -2 << endl;}}return 0;}




1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 限行尾号是字母怎么办 手指被刺扎肿了怎么办 手上进了小刺怎么办 招投标标书丢了怎么办 冒险岛2装备红了怎么办 宝宝屁股腌红了怎么办 宝宝肛门红痒怎么办啊 宝宝屁屁溃烂了怎么办 脸过敏起红疙瘩怎么办 一岁宝宝屁股红怎么办 屁眼肉凸出来了怎么办 陶笛声音变闷了怎么办 吃三七粉上火了怎么办 红枣核吞下去了怎么办 话梅核吞下去了怎么办 芒果和海鲜吃了怎么办 小孩咳嗽喉咙有痰怎么办 4岁宝宝喉咙有痰怎么办 20天新生儿有痰怎么办 孩子嗓子老是有痰怎么办 买的哈密瓜不甜怎么办 吉他琴颈变形了怎么办 hcg值长得慢怎么办 蚊子老在耳边叫怎么办 刚买来的鲜海参怎么办 天冷手指关节疼怎么办 未满一年驾龄上高速违章怎么办 榴莲太生剥开了怎么办 榴莲开了没熟怎么办 榴莲打开了没熟怎么办 榴莲开口了没熟怎么办 榴莲没熟打开了怎么办 不熟的榴莲没熟怎么办 打开的榴莲没熟怎么办 开了的榴莲没熟怎么办 榴莲剥出来没熟怎么办 榴莲剥开了没熟怎么办 榴莲买回来没熟怎么办 整个的榴莲熟了怎么办 买的榴莲有点生怎么办 剥开的榴莲肉硬怎么办