判定一副牌是否是顺子

 转载一个不用排序就判定出顺子的算法:https://blog.csdn.net/qq_43968080/article/details/85346468

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define MAX_COUNT  20
#define	MASK_COLOR					0xF0								//花色掩码
#define	MASK_VALUE					0x0F								//数值掩码
#define	INVALIDBYTE					0xFF								//数值掩码
typedef unsigned char       BYTE;
//分析结构
struct tagAnalyseResult
{
	BYTE 							cbBlockCount[4];					//扑克数目
	BYTE							cbMagicCount;						//财神数量
	BYTE							cbCardData[4][MAX_COUNT];					//扑克数据
	BYTE							cbMagicCardData[MAX_COUNT];			//财神牌数据
};

int main(){


	system("pause");
	return 0;
}

//获取花色
BYTE  getColorValue(BYTE cbCardData){
	return  cbCardData&MASK_COLOR;

}
//获取牌值
BYTE  getCardVaule(BYTE cbCardData){
	return  cbCardData&MASK_VALUE;
}
bool  IsValidCardData(BYTE cbCardData)
{
	//获取属性
	BYTE cbCardColor=getColorValue(cbCardData);
	BYTE cbCardValue=getCardVaule(cbCardData);

	//有效判断
	if ((cbCardData==0x4E)||(cbCardData==0x4F)) return true;
	if ((cbCardColor<=0x30)&&(cbCardValue>=0x01)&&(cbCardValue<=0x0D)) return true;

	return false;
}
bool IsMagicCard(BYTE cbCardData){
	//财神判定逻辑
	return false;
}
//获取逻辑牌值
BYTE  getLogicCardValue(BYTE cbCardData){

	//扑克属性
	BYTE cbCardColor=getColorValue(cbCardData);
	BYTE cbCardValue=getCardVaule(cbCardData);

	//转换数值
	if (cbCardColor==0x40) return cbCardValue+2;
	return (cbCardValue<=2)?(cbCardValue+13):cbCardValue;
}
//对手牌进行排序
void SortCardList(BYTE  cbCardData[],BYTE  cbCardCount){
	//数量校验
	if (cbCardCount <= 0 || cbCardCount > MAX_COUNT)
	{
		return ;
	}
	//获取逻辑牌值
	BYTE		cbLogicCardValue[MAX_COUNT];
	memset(cbLogicCardValue,0,sizeof(BYTE)*MAX_COUNT);
	for (int i = 0; i < cbCardCount; i++)
	{
		if (IsValidCardData(cbCardData[i]))
		{
			cbLogicCardValue[i] = getLogicCardValue(cbCardData[i]);
		}
	}
	//按照逻辑牌值和实际牌值大到小排序手牌
	BYTE tmpCardData;
	for (int i = 0; i < cbCardCount-1; i++)
	{
		for (int j = i+1; j < cbCardCount-1;j++)
		{
			if ( (cbLogicCardValue[i] > cbLogicCardValue[j])  
				|| ((cbLogicCardValue[i] == cbLogicCardValue[j])  && (cbCardData[i] < cbCardData[j])))
			{
				tmpCardData = cbLogicCardValue[i];
				cbLogicCardValue[i] = cbLogicCardValue[j];
				cbLogicCardValue[j] = tmpCardData;
				tmpCardData = cbCardData[i];
				cbCardData[i] = cbCardData[j];
				cbCardData[j] = tmpCardData;
			}
		}
	}
	return;

}
//对手牌进行分析
void AnalyseCardData(BYTE  cbCardData[],BYTE  cbCardCount,tagAnalyseResult & analyserRes){
	if (cbCardCount <= 0 || cbCardCount > MAX_COUNT)
	{
		return ;
	}
	memset(&analyserRes,0,sizeof(analyserRes));
	for (int i =0;i < cbCardCount; i++)
	{
		BYTE cbSameCount = 1,cbLogicValue = getLogicCardValue(cbCardData[i]);
		//查找到财神牌
		if (IsMagicCard(cbCardData[i]))
		{
			analyserRes.cbMagicCardData[analyserRes.cbMagicCount++] = cbCardData[i];
			continue;
		}
		//查找单张 一对 三张  四张的数据
		for (int j = i+1; j < cbCardCount; j++)
		{
			if (cbLogicValue != getLogicCardValue(cbCardData[j])) break;
			 cbSameCount++;
		}
		//存储对应单张 一对 三张  四张的数据
		BYTE cbIndex = analyserRes.cbBlockCount[cbSameCount-1]++;
		for (int j = 0; j < cbSameCount; j++)
		{
			analyserRes.cbCardData[cbSameCount-1][cbIndex*cbSameCount+j] = cbCardData[i+j];
		}
		//跳过存储过的数据
		i+= cbSameCount-1;
	}

	return;
}
/************************************************************************/
/*	
  分析顺子,返回顺子的长度
*/
/************************************************************************/
BYTE AnalyseLineCardData(const BYTE  cbCardData[],BYTE  cbCardCount,const tagAnalyseResult & analyserRes){
	BYTE cbLindCount = 1;

	if (cbCardCount > MAX_COUNT || cbCardCount <= 0)
	{
		return ;
	}

	//判定是否是顺子逻辑
	if (cbCardCount > 5)
	{
		BYTE tmpMagicCount = 0;

		for (int i =0; i < cbCardCount; i++)
		{
			BYTE cbTmpValue = getLogicCardValue(analyserRes.cbCardData[0][i]);
			if (cbTmpValue != (getLogicCardValue(analyserRes.cbCardData[0][i+1]) + 1) && (cbTmpValue > getLogicCardValue(analyserRes.cbCardData[0][i+1])))
			{
				tmpMagicCount += cbTmpValue - getLogicCardValue(analyserRes.cbCardData[0][i+1])-1;
				if (tmpMagicCount > analyserRes.cbMagicCount)
				{
					return INVALIDBYTE;
				}
				cbLindCount++;
			}
		}

	}

	return cbLindCount;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值