扎金花
来源:互联网 发布:雷科防务怎么样 知乎 编辑:程序博客网 时间: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
- 扎金花
- 扎金花
- javase扎金花程序
- 扎金花概率详解
- 搜狐 扎金花
- JAVA学习--扎金花
- 扎金花扑克牌逻辑判定
- 搜狐笔试题:扎金花
- 简易扎金花java程序
- 牛客网---2016---搜狐扎金花
- 扎金花赌博小程序JAVA源码
- 写一个《扎金花》程序自己玩。
- 扎金花,单人,局域网均可 Delphi7
- “扎金花FANS”进行了改进
- 每人都有两大炸弹的扎金花2012
- 扎金花大小比较算法(Java版)
- 搜狐2016笔试1 扎金花
- 扎金花 游戏开发细节与部分代码
- 使用BCP命令管理不同域名间AX数据库拷贝后用户管理
- MobaXterm 全能型开源远程终端
- android学习难点解决之(一)百度地图的定位---getLastKnownLocation为空和MapActivity
- 文章标题
- uboot初学
- 扎金花
- vivado----simulation上
- leetcode Count Numbers with Unique Digits
- 泛型 <T> 继承
- Ubuntu 16.04 Sublime Text3安装/激活/解决中文输入/常用插件
- JAVA学习随笔(2)--Integer类
- 【LeetCode】347. Top K Frequent Elements
- PAT
- Java EE之Servlet技术