Files
wnmj-normal/Classes/Games/WNMJ/WN_GameLogic.h
2026-03-03 13:56:44 +08:00

165 lines
4.2 KiB
C++

#ifndef GAME_LOGIC_HEAD_FILE
#define GAME_LOGIC_HEAD_FILE
#pragma once
#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "Define.h"
#include "WN_CMD_Sparrow.h"
USING_NS_CC;
namespace WNMJ_SPACE{
//逻辑掩码
enum WNMJ_MASK
{
MASK_WN_COLOR = 0xF0, //花色掩码
MASK_WN_VALUE = 0x0F, //数值掩码
};
//////////////////////////////////////////////////////////////////////////
//动作定义
enum WN_WIK_TYPE
{
WIK_WN_NULL = 0x0000, //没有类型
WIK_WN_LEFT = (1 << 0), //左吃类型
WIK_WN_CENTER = (1 << 1), //中吃类型
WIK_WN_RIGHT = (1 << 2), //右吃类型
WIK_WN_PENG = (1 << 3), //碰牌类型
WIK_WN_GANG = (1 << 4), //杠牌类型
WIK_WN_CHI_HU = (1 << 5), //吃胡类型
WIK_WN_DNBL = (1 << 6), //东南北左
WIK_WN_DNBC = (1 << 7), //东南北中
WIK_WN_DNBR = (1 << 8), //东南北右
WIK_WN_DXBL = (1 << 9), //东西北左
WIK_WN_DXBC = (1 << 10), //东西北中
WIK_WN_DXBR = (1 << 11), //东西北右
WIK_WN_CHI = (WIK_WN_RIGHT | WIK_WN_CENTER | WIK_WN_LEFT | WIK_WN_DNBL | WIK_WN_DNBC | WIK_WN_DNBR | WIK_WN_DXBL | WIK_WN_DXBC | WIK_WN_DXBR), //吃牌类型
};
//////////////////////////////////////////////////////////////////////////
//胡牌定义
enum WNMJ_HU_TYPE
{
//非胡类型
CHK_NULL = 0x0000, //非胡类型
//胡牌类型
CHK_JI_HU = 0x0001, //基本胡
CHK_QI_DUI = 0x0002, //七对
CHK_THIRTEEN = 0x0004, //13乱
CHK_SERVEN = 0x0008, //七星
CHK_PENG_PENG = 0x0010, //碰碰胡;
CHK_HUNYISE = 0x0020, //混一色;
CHK_QINYISE = 0x0040, //清一色;
CHK_ZIYISE = 0x0080, //字一色;
//胡牌权位
CHR_ZI_MO = 0x0001, //自摸权位
CHR_QIANG_GANG = 0x0002, //抢杠权位
CHR_GANG_FLOWER = 0x0004, //杠上开花
CHR_HAS_KING = 0x0008, //有宝权位
CHR_GERMAN = 0x0010, //德国权位
CHR_TIAN = 0x0020, //天胡权位
CHR_DI = 0x0040, //地胡权位
CHR_LIAN_GANG_FLOWER = 0x0080, //连杠胡权位;
CHR_QIANG_LIAN_GANG = 0x0100, //抢连杠胡权位;
};
//////////////////////////////////////////////////////////////////////////
//类型子项
struct tagKindItem
{
uint8 cbWeaveKingReplace; //王牌替换
WORD wWeaveKind; //组合类型
uint8 cbCenterCard; //中心扑克
uint8 cbCardIndex[3]; //扑克索引
};
//胡牌结果
struct tagChiHuResult
{
WORD wChiHuKind; //吃胡类型
WORD wChiHuRight; //胡牌权位
};
//分析子项
struct tagAnalyseItem
{
uint8 cbEyeKingReplace; //精牌替换
uint8 cbWeaveKingReplace; //精牌替换
uint8 cbCardEye; //牌眼扑克
WORD wWeaveKind[MAX_WEAVE]; //组合类型
uint8 cbCenterCard[MAX_WEAVE]; //中心扑克
};
enum EN_KING_TYPE
{
KT_MAIN = 0, // 正
KT_VICE, // 副
KT_KING, // 精
KT_NULL, // 普通牌
};
//////////////////////////////////////////////////////////////////////////
//数组说明
typedef CArrayTemplate<tagAnalyseItem, tagAnalyseItem &> CAnalyseItemArray;
//游戏逻辑类
class WN_CGameLogic
{
CREATE_SINGLETON_MUTEX_CLEAR(WN_CGameLogic, s_configInstance, nullptr);
private:
static WN_CGameLogic *s_configInstance;
private:
void init();
void clear();
//变量定义
protected:
static const uint8 m_cbCardDataArray[MAX_REPERTORY]; //扑克数据
uint8 m_cbKingCardIndex[2]; //王牌
//辅助函数
public:
//有效判断
static bool IsValidCard(uint8 cbCardData);
//扑克数目
uint8 GetCardCount(uint8 cbCardIndex[MAX_INDEX]);
//组合扑克
uint8 GetWeaveCard(WORD cbWeaveKind, uint8 cbCenterCard, uint8 cbCardBuffer[4]);
//获取数值
static uint8 GetCardValue(uint8 cbCardData) { return (cbCardData&MASK_WN_VALUE); }
//获取花色
static uint8 GetCardColor(uint8 cbCardData) { return ((cbCardData&MASK_WN_COLOR) >> 4); }
//获取胡牌类型
std::string GetHuKind(WORD wChiHuKind);
//获取胡牌维权
std::string GetHuRight(WORD wChiHuRight);
//转换函数
public:
//扑克转换
uint8 SwitchToCardData(uint8 cbCardIndex);
//扑克转换
uint8 SwitchToCardIndex(uint8 cbCardData);
//动作判断
public:
//杠牌分析
WORD AnalyseGangCard(uint8 cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], uint8 cbWeaveCount, tagGangCardResult & GangCardResult);
};
}
//////////////////////////////////////////////////////////////////////////
#endif