小米OJ#29 扑克游戏

小米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;
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值