转载一个不用排序就判定出顺子的算法: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;
}