#ifndef GAME_LOGIC_HEAD_TDH_FILE #define GAME_LOGIC_HEAD_TDH_FILE #pragma once #include "Stdafx.h" #include "data.h" class CTableFrameSink_tdh; //游戏逻辑类 class CGameLogic_tdh { enum CardColor { Color_Wan = 0, Color_Tiao, Color_Bing, Color_Feng, }; enum MagicType{ MagicType_TwoMagic=0, MagicType_OneMagic, MagicType_NoMagic }; //变量定义 public: BYTE m_cbMagicIndexFirst; // 都叫财神 BYTE m_cbMagicIndexSecond; // 都叫财神 protected: static const BYTE m_cbCardDataArray_ZJ[MAX_REPERTORY_ZJ]; // static const BYTE m_cbCardDataArray_ZJ_Two[MAX_REPERTORY_ZJ_Two]; //BYTE m_cbMagicIndexFirst; // 都叫财神 //BYTE m_cbMagicIndexSecond; // 都叫财神 MagicType m_BaoMj_MagicType;// 0 1 2 无财神 1财神 2财神 CTableFrameSink_tdh* m_pTableFramSink; //函数定义 public: //构造函数 CGameLogic_tdh(CTableFrameSink_tdh* pTableFramSink); //析构函数 virtual ~CGameLogic_tdh(); //控制函数 public: //混乱扑克 BYTE RandCardData(BYTE cbCardData[]); BYTE RandCardData_Two(BYTE cbCardData[]); //删除扑克 bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard); //删除扑克 bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount); //删除扑克 bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount); //设置钻牌 void SetMagicIndex(BYTE CaiFirstIndex, BYTE CaiSecondIndex); //钻牌 bool IsMagicCard( BYTE cbCardData ); //辅助函数 public: //获取麻将花色 BYTE GetCardColor(BYTE cbCardData) { return (cbCardData&MASK_COLOR) >> 4 ;} //有效判断 bool IsValidCard(BYTE cbCardData); //扑克数目 BYTE GetCardCount(const BYTE cbCardIndex[MAX_INDEX]); //组合扑克 BYTE GetWeaveCard(int cbWeaveKind, BYTE cbCenterCard,const BYTE cbMargicOffset[4], BYTE cbCardBuffer[4]); //获取财神牌个数 BYTE GetMaigcCardCount(const BYTE cbCardIndex[MAX_INDEX]); //等级函数 BYTE GetCardValue(BYTE cbCardDat){ ASSERT(IsValidCard(cbCardDat)); return (cbCardDat&MASK_VALUE); } public: //动作等级 BYTE GetUserActionRank(int cbUserAction); //胡牌等级 //WORD GetChiHuActionRank(const CChiHuRight & ChiHuRight); //动作判断 public: //吃牌判断,一脚耐油不需要 int EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard); //碰牌判断 int EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard); //杠牌判断 int EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard); //动作判断 public: //杠牌分析 int AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult); //胡牌分析,bFlag默认false表示正常胡牌,true标示杠上花 int AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight, BYTE& nHuTai, bool bFlag = false,bool bQiangGangFlag=false); // bool AnalyseCardNew(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); // //bool isHaveMaigc(const BYTE cardMagicIndex[4]); // bool HaveMagic(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); // bool IsPengPengHu(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); // bool IsQuanShun(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); // bool IsCardsIsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BOOL HaveFengKe); // bool TestHu(const BYTE cbCardIndex[MAX_INDEX], int nCurrentMagicCount ,const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); // bool GetOneColorCards(const BYTE cbCardIndex[MAX_INDEX], BYTE nColor, BYTE cbCardData[MAX_COUNT], int&CardCount); // bool OneCardsCanHu(const BYTE cbCardData[MAX_COUNT], int nCardCount, int nMagicCount,bool isQuanShun=false); // int PrintCards(const BYTE cbCardData[MAX_COUNT], int nCout); // int DeleteCardDataFromCardDatas(const BYTE vDeletIndex[MAX_COUNT], int DeleteCount, const BYTE cbCardData[MAX_COUNT], BYTE nCount, BYTE cbOutCardDatas[MAX_COUNT]); // // int AnalyseCardTaiNum(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); //听牌分析 bool AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE *m_cbTingPaiData, const BYTE FanHui[MAX_INDEX], BYTE wChairID, BYTE wBaoUserID=0,BYTE BaoTai=0); //是否听牌 //bool IsTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, const BYTE FanHui[MAX_INDEX]); //转换函数 public: //扑克转换 BYTE SwitchToCardData(BYTE cbCardIndex); //扑克转换 BYTE SwitchToCardIndex(BYTE cbCardData); //扑克转换 BYTE SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT]); //扑克转换 BYTE SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]); //获取手牌癞子个数,同时去掉癞子牌 BYTE DeleteMagicCards(BYTE cbCardIndex[MAX_INDEX]); BYTE DeleteMagicCards(BYTE cbCardIndex[MAX_INDEX],int nDeleteCount); //获取条万筒风 BYTE GetOneColorCards(const BYTE cbCardIndex[MAX_INDEX], const BYTE nColor, BYTE cbCardData[MAX_COUNT]); //获取牌值需要财神牌几个 bFlag默认true为扑 int GetOneColorNeedMagicCards(const BYTE cbCardData[MAX_COUNT], int DataCount, int nNeedNum,bool isShun=FALSE); //财神牌可变牌扫描 void IsCanChangCardAndCount(const BYTE cbCardIndex[MAX_INDEX], BYTE Fanhui[MAX_INDEX]); //获取牌个数 WORD GetValue(BYTE uNum, BYTE fanshu, WORD PaiZhi); //解码加密的牌 BYTE DeCodeCard(const WORD cbCardData); //解码翻数 BYTE DeCodeFanshu(const WORD cbCardData); //获取手牌最后牌值 BYTE GetEndCard(BYTE cbCardIndex[MAX_INDEX]); bool PeiPai(BYTE cbCardData[MAX_REPERTORY_ZJ]); //胡法分析 protected: //碰碰胡 bool IsPengPeng(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount); //清一色牌 bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount); //门前清 bool IsMenQianQing(const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount); //计算手牌是否包含东风刻字 bool HaveFengKe(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE &cbItemCount,int nCardIndex); //内部函数 private: //分析扑克 bool AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray); public: //排序,根据牌值排序 bool SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount ); bool test2Combine(const BYTE cbCard1, const BYTE cbCard2); bool test3Combine(const BYTE cbCard1, const BYTE cbCard2, const BYTE cbCard3); bool test3combineToShun(const BYTE cbCard1, const BYTE cbCard2, const BYTE cbCard3); //一局中只有8个财神牌(其中一个无效),将这7个财神牌给玩家手牌去匹配能否成整扑,然后剩下多少,将剩下的数和可用财神数比较 public: int mNeedMinMagicNum; BYTE m_cbHuCard; public: CChiHuRight mChiHuRight; DWORD mTaiRight;//计算台数的权值 int mJiangInColor; int mSunTaiJiangInColor; //接下来尝试修改 在判断胡牌时 记录一下财神变成了什么。 BYTE mMagicData[1024]; BYTE mMagicDataCount; void ShowMagicData(); void ShowMagicReplaceData(); BYTE mMagicReplaceCard[MAX_INDEX]; //删除数组中的牌 void DeleteCards(const BYTE* pSrc, int nCount, const BYTE* pDeleteCards, int nDelCount, BYTE Cards[14]); BYTE mMagicNeedCardArray[4]; bool mIsBaoMjType; //0翻财神 1 包麻将 void SetGameLogicMjType(bool mjType){ mIsBaoMjType = mjType; } BOOL IsCanHuAllCards(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); BOOL IsSiCaiHu(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount); }; ////////////////////////////////////////////////////////////////////////// #endif