Files
wnmj/Classes/Games/13S/13S_GameLogic.h
2026-02-13 14:34:15 +08:00

206 lines
9.3 KiB
C++

#ifndef _13S_GAME_LOGIC_HEAD_FILE_
#define _13S_GAME_LOGIC_HEAD_FILE_
#pragma once
#include "13S_CMD.h"
//////////////////////////////////////////////////////////////////////////
//扑克类型;
#define SSS_CT_INVALID 0 //错误类型;
#define SSS_CT_SINGLE 1 //单牌类型;
#define SSS_CT_ONE_DOUBLE 2 //只有一对;
#define SSS_CT_FIVE_TWO_DOUBLE 3 //两对牌型;
#define SSS_CT_THREE 4 //三张牌型;
#define SSS_CT_FIVE_MIXED_FLUSH_NO_A 5 //没A杂顺;
#define SSS_CT_FIVE_MIXED_FLUSH_FIRST_A 6 //A在前顺子;
#define SSS_CT_FIVE_MIXED_FLUSH_BACK_A 7 //A在后顺子;
#define SSS_CT_FIVE_FLUSH 8 //同花五牌;
#define SSS_CT_FIVE_THREE_DEOUBLE 9 //葫芦(三条一对);
#define SSS_CT_FIVE_FOUR_ONE 10 //铁支(四带一张);
#define SSS_CT_FIVE_STRAIGHT_FLUSH_NO_A 11 //没A同花顺;
#define SSS_CT_FIVE_STRAIGHT_FLUSH_FIRST_A 12 //A在前同花顺;
#define SSS_CT_FIVE_STRAIGHT_FLUSH_BACK_A 13 //A在后同花顺;
#define SSS_CT_FIVE_BOMB 44 //五同类型;
//特殊牌型;
#define SSS_CT_THREE_STRAIGHT 14 //三顺子(三墩都是单顺);
#define SSS_CT_THREE_FLUSH 15 //三同花(三墩都是同花);
#define SSS_CT_SIXPAIR 16 //六对半(六个对子余一张);
#define SSS_CT_FIVEPAIR_THREE 17 //五对冲三(五个对子,其余三张相同);
#define SSS_CT_FOUR_THREESAME 18 //四套冲三(四个三张相同余一张);
#define SSS_CT_SAME_COLOR 19 //凑一色(都是方块红心或黑桃梅花);
#define SSS_CT_ALL_SMALL 20 //全小(2-8);
#define SSS_CT_ALL_BIG 21 //全大(8-A);
#define SSS_CT_THREE_BOMB 22 //三分天下(三套炸弹);
#define SSS_CT_THREE_STRAIGHTFLUSH 23 //三同花顺;
#define SSS_CT_TWELVE_KING 24 //十二皇族(全是J、Q、K、A);
#define SSS_CT_THIRTEEN 25 //十三水,一条龙( A至K齐全);
#define SSS_CT_THIRTEEN_FLUSH 26 //同花十三水,至尊青龙(同花且A至K齐全的牌);
//数值掩码;
#define SSS_CARD_MASK_COLOR 0xF0 //花色掩码;
#define SSS_CARD_MASK_VALUE 0x0F //数值掩码;
#define SSS_CARD_DW 16
#define SSS_CARD_XW 15
//扑克数目
#define SSS_CARD_COUNT 54 //扑克数目
//分析结构
struct tag13SAnalyseData
{
uint8 bOneCount; //单张数目
uint8 bTwoCount; //两张数目
uint8 bThreeCount; //三张数目
uint8 bFourCount; //四张数目
uint8 bFiveCount; //五张数目
uint8 bOneFirst[13]; //单牌位置
uint8 bTwoFirst[13]; //对牌位置
uint8 bThreeFirst[13]; //三条位置
uint8 bFourFirst[13]; //四张位置
uint8 bFiveFirst[13]; //五张位置
bool bStraight; //是否顺子
};
//分析结构
struct tag13SAnalyseResult
{
uint8 cbFourCount; //四张数目
uint8 cbThreeCount; //三张数目
uint8 cbDoubleCount; //两张数目
uint8 cbSignedCount; //单张数目
uint8 cbFourCardData[13]; //四张扑克
uint8 cbThreeCardData[13]; //三张扑克
uint8 cbDoubleCardData[13]; //两张扑克
uint8 cbSignedCardData[13]; //单张扑克
};
//分析结构
struct tag13SAnalyseType
{
bool bOnePare; //有一对
bool bTwoPare; //有两对
bool bThreeSame; //有三条
bool bStraight; //有顺子
bool bFlush; //有同花
bool bGourd; //有葫芦
bool bFourSame; //有铁支
bool bStraightFlush; //有同花顺
bool bFiveSame; //有五相
uint8 cbOnePare[100]; //一对的序号
uint8 cbTwoPare[100]; //两对的序号
uint8 cbThreeSame[100]; //三条的序号
uint8 cbStraight[100]; //顺子的序号
uint8 cbFlush[100]; //同花的序号
uint8 cbGourd[100]; //葫芦的序号
uint8 cbFourSame[100]; //铁支的序号
uint8 cbStraightFlush[100]; //同花顺的序号
uint8 cbFiveSame[100]; //五相的序号
bool bbOnePare[20]; //所有一对标志弹起
bool bbTwoPare[20]; //所有二对标志弹起
bool bbThreeSame[20]; //所有三条标志弹起
bool bbStraight[20]; //所有顺子标志弹起
bool bbFlush[20]; //所有同花标志弹起
bool bbGourd[20]; //所有葫芦标志弹起
bool bbFourSame[20]; //所有铁支标志弹起
bool bbStraightFlush[20]; //所有同花顺标志弹起
bool bbFiveSame[20]; //所有五相标志弹起
uint8 btOnePare; //一对的数量 单独
uint8 btThreeSame; //三条数量 单独
uint8 btTwoPare; //两对的数量
uint8 btStraight; //顺子的数量
uint8 btFlush; //同花的数量
uint8 btGourd; //葫芦的数量
uint8 btFourSame; //铁支的数量
uint8 btStraightFlush; //同花顺的数量
uint8 btFiveSame; //五相的数量
};
//////////////////////////////////////////////////////////////////////////
//排列类型
enum en13SSortCardType
{
enDescend, //降序类型
enAscend, //升序类型
enColor //花色类型
};
//游戏逻辑类
class C13SGameLogic
{
//变量定义
protected:
static const uint8 m_bCardListData[SSS_CARD_COUNT]; //扑克数据;
bool m_bClassicRule; //经典规则;
//函数定义
public:
//构造函数
C13SGameLogic();
//析构函数
virtual ~C13SGameLogic();
uint8 btCardSpecialData[13];
//类型函数
public:
//获取类型
uint8 GetCardType(uint8 bCardData[], uint8 bCardCount, uint8 btSpecialCard[]);
//获取数值
uint8 GetCardValue(uint8 bCardData) { return bCardData&SSS_CARD_MASK_VALUE; } //十六进制前面四位表示牌的数值
//获取花色
uint8 GetCardColor(uint8 bCardData) { return (bCardData&SSS_CARD_MASK_COLOR) >> 4; } //十六进制后面四位表示牌的花色
//设置是否是经典规则;
void setClassicRule(bool bFlag) { m_bClassicRule=bFlag; }
//控制函数
public:
//排列扑克
void SortCardList(uint8 bCardData[], uint8 bCardCount, en13SSortCardType SortCardType = enDescend);
//混乱扑克
void RandCardList(uint8 bCardBuffer[], uint8 bBufferCount);
//删除扑克
bool RemoveCard(const uint8 bRemoveCard[], uint8 bRemoveCount, uint8 bCardData[], uint8 bCardCount);
//添加扑克
bool AppendCard(const uint8 bAppendCard[], uint8 bAppendCount, uint8 bCardData[], uint8 &bCardCount);
//得到牌的数量
uint8 GetCardCount(uint8 bCardData[]);
//逻辑函数
public:
//逻辑数值
uint8 GetCardLogicValue(uint8 bCardData);
//对比扑克
uint8 CompareCard(uint8 bInFirstList[], uint8 bInNextList[], uint8 bFirstCount, uint8 bNextCount, bool bComperWithOther);
//获得8种类型
tag13SAnalyseType GetType(uint8 bCardData[], uint8 bCardCount);
//内部函数
public:
//分析扑克
void AnalyseCard(const uint8 bCardDataList[], const uint8 bCardCount, tag13SAnalyseData& AnalyseData);
//分析扑克
void AnalysebCardData(const uint8 cbCardData[], uint8 cbCardCount, tag13SAnalyseResult & AnalyseResult);
//最好的一敦
void TheBestCard(tag13SAnalyseType tagCardType, uint8 btHandCardData[], uint8 btHandCardCount, uint8 btFrontCard[], uint8 btMidCard[], uint8 btBackCard[]);
//三敦总共的水数
uint8 ThreeDunAllShuiShu(uint8 btFrontCard[],uint8 btMidCard[],uint8 btBackCard[]);
//是否比前面的大
bool IsBiggerThanFront(uint8 btFrontFrontCard[],uint8 btFrontMidCard[],uint8 btFrontBackCard[],uint8 btFrontCard[],uint8 btMidCard[],uint8 btBackCard[]);
//牌数据是否一样
bool IsSameCardData(uint8 btFirstCard[], uint8 btNextCard[], uint8 btFirstCount, uint8 btNextCount);
//是否同花
bool IsFlush(const uint8 cbCardData[], const uint8 cbCardCount, uint8 cbMaxCardData[], uint8 & bMaxCardCount, uint8 bNeedCCount = 5);
// 获取牌型图片路径;
static std::string getCardTypeImagePath(uint8 cbCardType);
// 获取牌型声音路径;
static std::string getCardTypeSoundPath(uint8 cbGender, uint8 cbCardType);
};
//////////////////////////////////////////////////////////////////////////
#endif