#ifndef GAME_LOGIC_HEAD_FILE #define GAME_LOGIC_HEAD_FILE /*////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ① 大小王可以当任何牌。 ② 有带鬼的任何牌型都算假货和同类型的牌,真牌>带鬼相同点数的牌 ③ 有带鬼的牌敦只能按能搭成的最大牌型算;有带鬼的同花顺比天然的同花顺小,如果都有带鬼再比搭成的同花顺的大小; 例如:(同花)10 , J , Q , K, A > 10 , J , Q , K ,鬼 >7, 8 ,9 ,10 ,J ④有带鬼的炸弹比天然同牌点的炸弹小,如果都有带鬼再比搭成的炸弹的大小; 例如A , A , A,A>A , A , A 鬼> 3 , 3 , 3 , 3 >3, 3, 3 ,鬼>3 , 3 ,鬼, 鬼 ⑤若有 2 个人 相同张牌型,且牌点一样(都带鬼)作打平算。若有 2 个人葫芦牌型,且 3 同张牌点一样(都带鬼),再比对子,若牌点还一样作打平算 ⑥如 5张同的牌型,例如 4,4,4,4, 鬼,按 4 个 4 带一个单张鬼算。此墩赢 10 水> 4 , 4 , 4,鬼, 鬼。 ⑦大小鬼加入后,所凑成的牌型都小于同类同点牌型,即真大于假。 ⑧当鬼加入达到报到牌型,可作为报到。能凑成特殊牌型均可只是比相同真的小。 ///////////////////////////////////////////////////////////////////////////////////////////////*/ #pragma once /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //扑克类型 #define CT_INVALID 0 //错误类型 #define CT_SINGLE 1 //单牌类型 #define CT_ONE_DOUBLE 2 //只有一对 #define CT_FIVE_TWO_DOUBLE 3 //两对牌型 #define CT_THREE 4 //三张牌型 #define CT_FIVE_MIXED_FLUSH_NO_A 5 //没A杂顺 #define CT_FIVE_MIXED_FLUSH_FIRST_A 6 //A在前顺子 #define CT_FIVE_MIXED_FLUSH_BACK_A 7 //A在后顺子 #define CT_FIVE_FLUSH 8 //同花五牌 #define CT_FIVE_THREE_DEOUBLE 9 //三条一对 #define CT_FIVE_FOUR_ONE 10 //四带一张 #define CT_FIVE_STRAIGHT_FLUSH_NO_A 11 //没A同花顺 #define CT_FIVE_STRAIGHT_FLUSH_FIRST_A 12 //A在前同花顺 #define CT_FIVE_STRAIGHT_FLUSH_BACK_A 13 //A在后同花顺 #define CT_FIVE_BOMB 44 //五同类型 #define CT_FIVE_MID_THREE_DEOUBLE 100 //中墩葫芦 //特殊牌型 #define CT_THIRTEEN_FLUSH 26 //同花十三水 #define CT_THIRTEEN 25 //十三水 #define CT_TWELVE_KING 24 //十二皇族 #define CT_THREE_STRAIGHTFLUSH 23 //三同花顺 #define CT_THREE_BOMB 22 //三炸弹 #define CT_ALL_BIG 21 //全大 #define CT_ALL_SMALL 20 //全小 #define CT_SAME_COLOR 19 //凑一色 #define CT_FOUR_THREESAME 18 //四套冲三 #define CT_FIVEPAIR_THREE 17 //五对冲三 #define CT_SIXPAIR 16 //六对半 #define CT_THREE_FLUSH 15 //三同花 #define CT_THREE_STRAIGHT 14 //三顺子 //数值掩码 #define CARD_MASK_COLOR 0xF0 //花色掩码 #define CARD_MASK_VALUE 0x0F //数值掩码 #define CARD_DW 16 #define CARD_XW 15 //扑克数目 #define CARD_COUNT 52 //扑克数目 //分析结构 struct tagAnalyseData { BYTE bOneCount ; //单张数目 BYTE bTwoCount ; //两张数目 BYTE bThreeCount ; //三张数目 BYTE bFourCount ; //四张数目 BYTE bFiveCount ; //五张数目 BYTE bOneFirst[13]; //单牌位置 BYTE bTwoFirst[13]; //对牌位置 BYTE bThreeFirst[13]; //三条位置 BYTE bFourFirst[13]; //四张位置 BYTE bFiveFirst[13]; //五张位置 bool bStraight; //是否顺子 }; //分析结构 struct tagAnalyseResult { BYTE cbFourCount; //四张数目 BYTE cbThreeCount; //三张数目 BYTE cbDoubleCount; //两张数目 BYTE cbSignedCount; //单张数目 BYTE cbFourCardData[13]; //四张扑克 BYTE cbThreeCardData[13]; //三张扑克 BYTE cbDoubleCardData[13]; //两张扑克 BYTE cbSignedCardData[13]; //单张扑克 }; //分析结构 struct tagAnalyseType { bool bOnePare; //有一对 bool bTwoPare; //有两对 bool bThreeSame; //有三条 bool bStraight; //有顺子 bool bFlush; //有同花 bool bGourd; //有葫芦 bool bFourSame; //有铁支 bool bStraightFlush; //有同花顺 bool bFiveSame; //有五相 BYTE cbOnePare[100]; //一对的序号 BYTE cbTwoPare[100]; //两对的序号 BYTE cbThreeSame[100]; //三条的序号 BYTE cbStraight[100]; //顺子的序号 BYTE cbFlush[100]; //同花的序号 BYTE cbGourd[100]; //葫芦的序号 BYTE cbFourSame[100]; //铁支的序号 BYTE cbStraightFlush[100]; //同花顺的序号 BYTE 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]; //所有五相标志弹起 BYTE btOnePare; //一对的数量 单独 BYTE btThreeSame; //三条数量 单独 BYTE btTwoPare; //两对的数量 BYTE btStraight; //顺子的数量 BYTE btFlush; //同花的数量 BYTE btGourd; //葫芦的数量 BYTE btFourSame; //铁支的数量 BYTE btStraightFlush; //同花顺的数量 BYTE btFiveSame; //五相的数量 }; ////////////////////////////////////////////////////////////////////////// //排列类型 enum enSortCardType { enDescend , //降序类型 enAscend , //升序类型 enColor //花色类型 }; //游戏逻辑类 class CGameLogic { //变量定义 protected: static const BYTE m_bCardListData[CARD_COUNT]; //扑克数据 bool m_bClassicRule; //经典规则; //函数定义 public: //构造函数 CGameLogic(); //析构函数 virtual ~CGameLogic(); BYTE btCardSpecialData[13]; //类型函数 public: //获取类型 BYTE GetCardType(BYTE bCardData[], BYTE bCardCount,BYTE btSpecialCard[]); //获取数值 BYTE GetCardValue(BYTE bCardData) { return bCardData&CARD_MASK_VALUE; } //十六进制前面四位表示牌的数值 //获取花色 BYTE GetCardColor(BYTE bCardData) { return (bCardData&CARD_MASK_COLOR)>>4; } //十六进制后面四位表示牌的花色 //设置是否是经典规则; void setClassicRule(bool bFlag) { m_bClassicRule = bFlag; } //控制函数 public: //排列扑克 void SortCardList(BYTE bCardData[], BYTE bCardCount,enSortCardType SortCardType=enDescend); //混乱扑克 void RandCardList(BYTE bCardBuffer[], BYTE bBufferCount); //删除扑克 bool RemoveCard(const BYTE bRemoveCard[], BYTE bRemoveCount, BYTE bCardData[], BYTE bCardCount); //添加扑克 bool AppendCard(const BYTE bAppendCard[],BYTE bAppendCount,BYTE bCardData[],BYTE &bCardCount); //得到牌的数量 BYTE GetCardCount(BYTE bCardData[]); //逻辑函数 public: //逻辑数值 BYTE GetCardLogicValue(BYTE bCardData); //对比扑克 BYTE CompareCard(BYTE bInFirstList[], BYTE bInNextList[], BYTE bFirstCount, BYTE bNextCount , bool bComperWithOther); //获得8种类型 tagAnalyseType GetType(BYTE bCardData[], BYTE bCardCount); //内部函数 public: //分析扑克 void AnalyseCard(const BYTE bCardDataList[] , const BYTE bCardCount , tagAnalyseData& AnalyseData) ; //分析扑克 void AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult) ; //牌数据是否一样 bool IsSameCardData(BYTE btFirstCard[],BYTE btNextCard[],BYTE btFirstCount,BYTE btNextCount); //自动摆牌 void AutoPutCard(BYTE btHandCardData[],BYTE btHandCardCount,BYTE btFrontCard[],BYTE btMidCard[],BYTE btBackCard[]); //抽取大牌 BYTE GetMaxCardData(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbMaxCardData[], BYTE & bMaxCardCount, BYTE bNeedCCount = 5); //是否同花 bool IsFlush(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbMaxCardData[], BYTE & bMaxCardCount, BYTE bNeedCCount = 5); //是否顺子 bool IsStraight(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbMaxCardData[], BYTE & bMaxCardCount, BYTE bNeedCCount = 5); //是否是三同花顺 bool IsThreeFlushStraight(const BYTE cbCardData[], const BYTE cbCardCount); //最好的一敦 void TheBestCard(tagAnalyseType tagCardType, BYTE btHandCardData[], BYTE btHandCardCount, BYTE btFrontCard[], BYTE btMidCard[], BYTE btBackCard[]); //三敦总共的水数 BYTE ThreeDunAllShuiShu(BYTE btFrontCard[], BYTE btMidCard[], BYTE btBackCard[]); //是否比前面的大 bool IsBiggerThanFront(BYTE btFrontFrontCard[], BYTE btFrontMidCard[], BYTE btFrontBackCard[], BYTE btFrontCard[], BYTE btMidCard[], BYTE btBackCard[]); }; ////////////////////////////////////////////////////////////////////////// #endif