#ifndef GAME_LOGIC_HEAD_FILE #define GAME_LOGIC_HEAD_FILE #pragma once #include "Stdafx.h" ////////////////////////////////////////////////////////////////////////// //排序类型 #define ST_ORDER 0 //大小排序 #define ST_COUNT 1 //数目排序 ////////////////////////////////////////////////////////////////////////// //数目定义; #define MAX_COUNT 27 //最大数目; #define FULL_COUNT 108 //全牌数目; #define MAX_NO_JOKER_COUNT 26 //最大数目 #define NO_JOKER_COUNT 104 //全牌数目 //逻辑数目; #define NORMAL_COUNT 27 //常规数目; ////////////////////////////////////////////////////////////////////////// //数值掩码 #define MASK_COLOR 0xF0 //花色掩码 #define MASK_VALUE 0x0F //数值掩码 //扑克类型 enum CART_TYPE { CT_ERROR = 0, //错误类型 CT_SINGLE, //单牌类型 CT_DOUBLE, //对牌类型 CT_THREE_TAKE_TWO, //三条类型 CT_SINGLE_LINE, //单连类型 CT_DOUBLE_LINE, //对连类型 CT_THREE_LINE, //三连类型 CT_BOMB_4, //炸弹类型 CT_BOMB_5, //炸弹类型 CT_BOMB_6, //炸弹类型 CT_BOMB_7, //炸弹类型 CT_BOMB_8, //炸弹类型 CT_BOMB_9, //炸弹类型 CT_BOMB_10, //炸弹类型 CT_COUNT, //牌型数量 }; #define BOMB_TYPE_COUNT 7 //炸弹类型数量 ////////////////////////////////////////////////////////////////////////// #define MAX_BLOCK_COUNT 12 //一手牌最大张数 //分析结构 enum CARD_BLOCK_INDEX { BLOCK_ONE = 0, BLOCK_TWO, BLOCK_THREE, BLOCK_FOUR, BLOCK_FIVE, BLOCK_SIX, BLOCK_SEVEN, BLOCK_EIGHT, BLOCK_NINE, BLOCK_TEN, BLOCK_ELEVEN, BLOCK_TWELVE }; struct tagAnalyseResult { BYTE cbBlockCount[MAX_BLOCK_COUNT]; //扑克数目 BYTE cbCardData[MAX_BLOCK_COUNT][MAX_COUNT]; //扑克数据 bool cbLaiZi; }; //出牌结果 struct tagOutCardResult { BYTE cbCardCount; //扑克数目 BYTE cbResultCard[MAX_COUNT]; //结果扑克 }; ////////////////////////////////////////////////////////////////////////// //游戏逻辑类 class CGameLogic { //变量定义 protected: static const BYTE m_cbCardData[FULL_COUNT]; //扑克数据 static const BYTE m_cbNoJokerCardData[NO_JOKER_COUNT]; //函数定义 public: //构造函数 CGameLogic(); //析构函数 virtual ~CGameLogic(); //类型函数 public: //获取类型 int GetCardType(const BYTE cbCardData[], BYTE cbCardCount, bool isLastCard); //获取数值 BYTE GetCardValue(BYTE cbCardData) { return cbCardData&MASK_VALUE; } //获取花色 BYTE GetCardColor(BYTE cbCardData) { return cbCardData&MASK_COLOR; } //控制函数 public: //混乱扑克 void RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount); //混乱扑克 void RandNoJokerCardList(BYTE cbCardBuffer[], BYTE cbBufferCount); //排列扑克 void SortCardList(BYTE cbCardData[], BYTE cbCardCount, BYTE cbSortType); //删除扑克 bool RemoveCard(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount); //随机扑克 BYTE GetRandomCard(void) ; //排列扑克 void SortOutCardList(BYTE cbCardData[], BYTE cbCardCount, int nCardType, bool isLastCard); //逻辑函数 public: //有效判断 bool IsValidCard(BYTE cbCardData); //逻辑数值 BYTE GetCardLogicValue(BYTE cbCardData); //对比扑克 bool CompareCard(const CMD_C_OutCard* pFirstOutCard, CMD_C_OutCard* pNextOutCard); //赖子数目 BYTE GetLaiZiCount(const BYTE cbHandCardData[], BYTE cbHandCardCount); //是否癞子牌 bool IsLaiZiCard(BYTE cbCard); //内部函数 public: //分析扑克 void AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult); //分析比较 bool AnalysebCompare(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbMaxCardData[CT_COUNT], BYTE &cbBlockCount, int dCardType, bool isLastCard); //牌组转换(将32张牌的使用情况转化为一个32位整型) int TransListToInt(int iOldType,int iNewType); //是否包含牌型 bool IsHasCardType(int iCardType, CART_TYPE ct_value); private: //获取类型结果 int GetType(tagAnalyseResult& AnalyseResult, const BYTE cbCardData[], BYTE cbCardCount, BYTE& cbMaxCardData, BYTE &cbBlockCount, bool isLastCard); }; #endif