#ifndef GAME_DATA_HEAD_FILE #define GAME_DATA_HEAD_FILE ////////////////////////////////////////////////////////////////////////// #pragma once #include "Stdafx.h" ///////////////////////////////////////////////////////////////////////// //#define FengDingTaiNum 5 //#define MaxTaiNum 7 ////////////////////////////////////////////////////////////////////////// //麻将类型 #define HongZhong 0x14 //红中晃晃 #define FaCai 0x15 //发财晃晃 #define DuoLaiHongZhong 0x16 //红中晃晃多癞子 #define DuoLaiFaCai 0x17 //发财晃晃多癞子 ////////////////////////////////////////////////////////////////////////// //逻辑掩码 #define MASK_COLOR 0xF0 //花色掩码 #define MASK_VALUE 0x0F //数值掩码 ////////////////////////////////////////////////////////////////////////// //动作定义 //动作标志 #define WIK_NULL 0x00000000 //没有类型 #define WIK_SHUANG_CAICHI 0x00000001 //双财吃 #define WIK_SHUANG_PENG 0x00000002 //双财碰 #define WIK_DAN_CHI 0x00000004 //单财吃 #define WIK_DAN_PENG 0x00000008 //单财碰 #define WIK_LEFT 0x00000010 //左吃类型 #define WIK_CENTER 0x00000020 //中吃类型 #define WIK_RIGHT 0x00000040 //右吃类型 #define WIK_PENG 0x00000080 //碰牌类型 #define WIK_DAN_BU_GANG 0x00000100 //补杠,财神补杠 #define WIK_BU_GANG 0x00000200 //补杠,正补 #define WIK_SAN_MING_GANG 0x00000400 //明杠,全财神明杠 #define WIK_SHUANG_MING_GANG 0x00000800 //明杠,双财神明杠 #define WIK_DAN_MING_GANG 0x00001000 //明杠,单财神明杠 #define WIK_MING_GANG 0x00002000 //明杠 #define WIK_QUANG_AN_GANG 0x00004000 //暗杠,全财神暗杠 #define WIK_SAN_AN_GANG 0x00008000 //暗杠,三财神暗杠 #define WIK_SHUANG_AN_GANG 0x00010000 //暗杠,双财神暗杠 #define WIK_DAN_AN_GANG 0x00020000 //暗杠,单财神暗杠 #define WIK_AN_GANG 0x00040000 //暗杠 #define WIK_CHI_HU 0x00080000 //吃胡类型 #define WIK_ZI_MO 0x00100000 //自摸 #define WIK_TIAN_ZI_MO 0x00200000 //天胡 #define WIK_DI_CHIHU 0x00400000 //地胡 #define WIK_ZAHU 0x00800000 //咋胡 #define WIK_CAIDIAO 0x01000000 //财吊 #define WIK_SI_CAIHU 0x02000000 //四财胡 #define WIK_GANG_SHANG_KAI 0x04000000 //杠上开花 #define WIK_Qiang_GANG 0x08000000 //抢杠 #define WIK_CanDingMagic 0x10000000 //定财神 专用,是否可以定财神 #define WIK_GANG_GANG 0x0007C000 //表示暗杠的所有掩码之和 #define WIK_PENG_PENG 0x0000008A //表示碰的所有掩码之和 ////////////////////////////////////////////////////////////////////////// //胡牌定义 //台数-胡法 #define ZJ_TAI_ZFB 0x0001 //中发白 #define ZJ_TAI_HunYiSe 0x0002 //混一色 #define ZJ_TAI_PengPeng 0x0004 //碰碰胡 #define ZJ_TAI_QuanShun 0x0008 //全顺 #define ZJ_TAI_GangKai 0x0010 //杠上开花 #define ZJ_TAI_QiangGang 0x0020 //抢杠胡 #define ZJ_TAI_Gang 0x0040 //这个是干什么的,占时作为中发白刻 //定财神 此值 当作单财胡 #define ZJ_TAI_WuMagic 0x0080 //无财神牌 #define ZJ_TAI_DongFeng 0x0100 //东风刻字 #define ZJ_TAI_QingYiSe 0x0200 //清一色 #define ZJ_TAI_TianHu 0x0400 //天胡 #define ZJ_TAI_DiHu 0x0800 //地胡 #define ZJ_TAI_QuanZi 0x1000 //全字 辣子胡 #define ZJ_TAI_WuMagicFengJiangHunYise 0x2000 //无财神 东 中发白 做将 的混一色 #define ZJ_TAI_ZHAHU 0x4000 //炸胡 包三家 包家有胡不胡。 ///---------------tdh怎加 #define ZJ_TAI_CaiDiao 0x04000 //财吊 #define ZJ_TAI_SiCaiHu 0x08000 //四财胡 推倒胡 // #define ZJ_TAI_KEGANG 0x10000 //刻杠 这2 越界了 胡法之用了16个位 // #define ZJ_TAI_danMagic 0x20000 //单财胡 ////////////////////////////////////////////////////////////////////////// #define ZI_PAI_COUNT 7 #pragma pack(1) //类型子项 struct tagKindItem { INT cbWeaveKind; //组合类型 BYTE cbCenterCard; //中心扑克 BYTE cbCardIndex[3]; //扑克索引 BYTE cbValidIndex[3]; //实际扑克索引 }; //组合子项 struct tagWeaveItem { INT cbWeaveKind; //组合类型 BYTE cbCenterCard; //中心扑克 BYTE cbPublicCard; //公开标志 WORD wProvideUser; //供应用户 BYTE cbMargicOffset[4]; //如果有财神参与组合,财神的位置 1-4 ,该位置存储实际是那张财神的index //BYTE ShenYuCard[3]; //组合的剩余牌值 }; //杠牌结果 struct tagGangCardResult { BYTE cbCardCount; //扑克数目 WORD cbCardData[6]; //扑克数据 }; //分析子项 struct tagAnalyseItem { BYTE cbCardEye; //牌眼扑克 bool bMagicEye; //牌眼是否是王霸 INT cbWeaveKind[4]; //组合类型 BYTE cbCenterCard[4]; //中心扑克 BYTE cbCardData[4][4]; //实际扑克 }; #pragma pack() ////////////////////////////////////////////////////////////////////////// #define MASK_CHI_HU_RIGHT 0x0fffffff /* // 权位类。 // 注意,在操作仅位时最好只操作单个权位.例如 // CChiHuRight chr; // chr |= (chr_zi_mo|chr_peng_peng),这样结果是无定义的。 // 只能单个操作: // chr |= chr_zi_mo; // chr |= chr_peng_peng; */ class CChiHuRight { //静态变量 private: static bool m_bInit; static DWORD m_dwRightMask[MAX_RIGHT_COUNT]; //权位变量 private: DWORD m_dwRight[MAX_RIGHT_COUNT]; public: //构造函数 CChiHuRight(); //运算符重载 public: //赋值符 CChiHuRight & operator = (DWORD dwRight); //与等于 CChiHuRight & operator &= (DWORD dwRight); //或等于 CChiHuRight & operator |= (DWORD dwRight); //与 CChiHuRight operator & (DWORD dwRight); CChiHuRight operator & (DWORD dwRight) const; //或 CChiHuRight operator | (DWORD dwRight); CChiHuRight operator | (DWORD dwRight) const; //异或 //异或等于 CChiHuRight & operator -= (DWORD dwRight); //功能函数 public: //是否权位为空 bool IsEmpty(); //设置权位为空 void SetEmpty(); //获取权位数值 BYTE GetRightData(DWORD dwRight[], BYTE cbMaxCount); //设置权位数值 bool SetRightData(const DWORD dwRight[], BYTE cbRightCount); private: //检查权位是否正确 bool IsValidRight(DWORD dwRight); }; //效验类型 enum enEstimatKind { EstimatKind_OutCard, //出牌效验 EstimatKind_GangCard, //杠牌效验 }; //杠牌得分 struct tagGangScore { BYTE cbGangCount; //杠个数 LONGLONG lScore[MAX_WEAVE][GAME_PLAYER]; //每个杠得分 }; struct tagChihu { BYTE action; //点炮,吃胡,自摸,被自摸 BYTE chr; //胡的牌型,清一色,碰碰胡 BYTE Fanshu; //翻数 BYTE cbChihuCard; //胡的牌值 BYTE wProvideUser; //关系 int Score; //胡牌分数 }; struct tagChiCard { BYTE action; //吃胡,自摸,一炮多向 BYTE wProvideUser; //关系 BYTE cbChihuCard; //胡的牌值 }; struct tagActionLast //当前时,最后一个动作吃胡,自摸,记录最后动作的人,code,card { BYTE action; //吃胡,自摸,一炮多向 BYTE wProvideUser; //关系 BYTE cbChihuCard; //胡的牌值 }; ////////////////////////////////////////////////////////////////////////// //数组说明 typedef CWHArray CAnalyseItemArray; #endif