小米OJ,第29题 扑克游戏
描述:
两个人玩扑克比大小的游戏,规则是每个人抽五张手牌,然后按以下牌形比大小,比较规则是 : 顺子 > 4条 > 葫芦 > 3条 > 2对 > 1对 > 单张。 这副牌已经去掉了两张joker,在比较时不考虑花色,最小2,最大A。 请写出一段程序来比较两个人手牌的大小。
说明:不考虑出老千的情况,即两个人的手牌共出现了五张或以上相同的点数。
输入:
使用逗号(,)分隔的两组数据。 每组数据为使用空格分隔的字符,表示两个人的手牌点数。点数可能是数字2 ~ 10,也可能是J Q K A。 点数的分布是无序的。
输出:
一个字符串,表示第一个人的输赢。 第一人赢返回 ‘win’ ,输返回’lose’, 平返回’draw’。
输入样例
10 10 10 10 8,J J J J 9
输出样例
lose
说明:
其实没什么难度,只不过是代码的长度要长一些,首先读入两组数据,然后判断这两组数据分别是属于哪种牌。需要说明的是,定义两个全局变量flag1和flag2,分别属于第一个人手牌模式和第二个人的手牌模式(7-1分别对应为顺子-单条)。如果flag1>flag2或者flag2<flag1,那么就可以简单判断出输赢。如果flag1=flag2,也就是说两人手里的牌模式是一样的,那么这种情况就需要进行特定的判断。
再就是需要说明一下,在葫芦和三条的情况判断输赢,只需要判断排序后手牌的第三张,第三张牌大的一方赢。在针对2对的情况下,先比较第二位,再比较第四位。这样可以减少不必要的比较次数,可以随意找几组数据进行测试。
// xiaomiOJ_29.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<string.h>
#include<algorithm>
void gets_string();
int cardcompare(const int []);
int numcmp(const void* , const void* );
int win_or_lose_shunzi();
int win_or_lose_sitiao();
int win_or_lose_huluandsantiao();
int win_or_lose_liangdui();
int win_or_lose_yidui();
int win_or_lose_danzhang();
char a[50];
int player1[5] = { 0 }, player2[5] = {0};
int main()
{
int flag1 = 0, flag2 = 0,value=0;
gets_string();
qsort(player1, 5, sizeof(int), numcmp);
qsort(player2, 5, sizeof(int), numcmp);
flag1=cardcompare(player1);
flag2=cardcompare(player2);
if (flag1 == flag2) {
switch (flag1)
{
case 7: value = win_or_lose_shunzi(); break;
case 6: value = win_or_lose_sitiao(); break;
case 5: value = win_or_lose_huluandsantiao(); break;
case 4: value = win_or_lose_huluandsantiao(); break;
case 3: value = win_or_lose_liangdui(); break;
case 2: value = win_or_lose_yidui(); break;
case 1: value = win_or_lose_danzhang(); break;
default: break;
}
if (value == 1) printf("win");
else if (value == 0) printf("draw");
else printf("lose");
return 0;
}
else if (flag1 > flag2) printf("win");
else printf("lose");
return 0;
}
int win_or_lose_shunzi() {
//针对顺子情况的判断方式
if (player1[0] > player2[0])
return 1; //1 win
else if (player1[0] == player2[0])
return 0; // draw
else if (player1[0] < player2[0])
return -1; //2win
}
int win_or_lose_sitiao() {
// 针对4条情况
if (player1[1] > player2[1])
return 1; //1 win
else if (player1[1] < player2[1])
return -1; //2 win
else if (player1[1] == player1[1]) {
if (player1[0] > player2[0] || player1[4] > player2[4])
return 1;// 1 win
else if (player1[0] < player2[0] || player1[4] < player2[4])
return -1; //2 win
else if (player1[0] == player2[0] && player1[4] == player2[4])
return 0; //draw
}
}
int win_or_lose_huluandsantiao() {
//针对葫芦和3条的情况
if (player1[2] > player2[2])
return 1; //1 win
else if (player1[2] < player2[2])
return -1; //2 win
// 葫芦和3条的情况下,第三位不可能相同
}
int win_or_lose_liangdui() {
//针对2对的情况,先比较第二位,在比较第4位
if (player1[1] > player2[1])
return 1; //1 win
else if (player1[1] < player2[1])
return -1; // 2win
else if (player1[1] == player2[1])
{
if (player1[3] > player2[3])
return 1; // 1win
else if (player1[3] < player2[3])
return -1; // 2 win
else if (player1[3] == player2[3]) {
if (player1[0] > player2[0] || player1[2] > player2[2] || player1[4] > player2[4])
return 1; // 1 win
else if (player1[0] < player2[0] || player1[2] < player2[2] || player1[4] < player2[4])
return -1; // 2 win
else
return 0;// draw
}
}
}
int win_or_lose_yidui() {
// 针对1对的情况
int f1 = 0, f2 = 0;
for (int i = 1, j = 1; i < 5 || j < 5; i++, j++) {
if (player1[i] == player1[i - 1])
f1 = i;
if (player2[j] == player2[j - 1])
f2 = j;
if (f1 != 0 && f2 != 0) break;
}
if (player1[f1] > player2[f2]) return 1; //1 win
else if (player1[f1] < player2[f2]) return -1;// 2win
else {
for (int i = 0; i < 5; i++) {
if (player1[i] > player2[i])
return 1; // 1 win
else if (player1[i] < player2[i])
return -1; // 2 win
else continue;
}
return 0;// draw
}
}
int win_or_lose_danzhang() {
// 针对单张的情况
for (int i = 0; i < 5; i++) {
if (player1[i] > player2[i])
return 1; // 1 win
else if (player1[i] < player2[i])
return -1;// 2 win
else continue;
}
return 0;// draw
}
int cardcompare(const int A[]) {
int flag1=0;
for (int i = 1; i < 5; i++) {
if (A[i] + 1 == A[i - 1]) { //顺子
flag1++;
continue;
}
}
if (flag1 == 4) {
return flag1 + 3;
}
else flag1 = 0;
{
int b[5] = { 0 }, k = 0;
for (int i = 1; i < 5; i++) {
if (A[i] == A[i - 1])
b[i] = b[i - 1] + 1;
}
qsort(b, 5, sizeof(int), numcmp);
if (b[0] == 3) { flag1 = 6; return flag1;} //4条
if (b[0] == 2 && b[1] == 1 && b[2] == 1) { flag1 = 5; return flag1; }//葫芦
if (b[0] == 2 && b[1] == 1 && b[2] == 0) { flag1 = 4;return flag1; }//3条
if (b[0] == 1 && b[1] == 1 && b[2] == 0) { flag1 = 3; return flag1;}//2对
if (b[0] == 1 && b[1] == 0) { flag1 = 2; return flag1;}//2对
if (b[0] == 0 && b[1] == 0) { flag1 = 1; return flag1;}//单张
}
}
int numcmp(const void* a, const void* b)
{
return *(int*)a < * (int*)b ? 1 : -1;
}
void gets_string() {
int k = 0, m = 0, i = 0;
gets_s(a);
for (; i <=(sizeof(a)-1)/sizeof(char)&&*(a+i)!=','; i++) {
if (*(a + i) == ' ') {
k++; continue;
}
else if(*(a+i)>='0'&&*(a+i)<='9'){
player1[k] = player1[k] * 10 + *(a + i) - '0';
}
else if(*(a+i)=='J'){
player1[k] = *(a + i) - 'J'+11;
}
else if (*(a + i) == 'Q') {
player1[k] = *(a + i) - 'Q' + 12;
}
else if (*(a + i) == 'K') {
player1[k] = *(a + i) - 'K' + 13;
}
else if (*(a + i) == 'A') {
player1[k] = *(a + i) - 'A' + 14;
}
}
for (int k=0; i < strlen(a); i++) {
if (*(a + i) == ' ') {
k++; continue;
}
else if (*(a + i) >= '0' && *(a + i) <= '9') {
player2[k] = player2[k] * 10 + *(a + i) - '0';
}
else if (*(a + i) == 'J') {
player2[k] = *(a + i) - 'J' + 11;
}
else if (*(a + i) == 'Q') {
player2[k] = *(a + i) - 'Q' + 12;
}
else if (*(a + i) == 'K') {
player2[k] = *(a + i) - 'K' + 13;
}
else if (*(a + i) == 'A') {
player2[k] = *(a + i) - 'A' + 14;
}
}
}