Files
2026-03-03 13:56:44 +08:00

250 lines
8.9 KiB
C++

#ifndef GAME_LOGIC_HEAD_FILE
#define GAME_LOGIC_HEAD_FILE
#pragma once
#include "Stdafx.h"
//////////////////////////////////////////////////////////////////////////
//常量定义
#define MAX_WEAVE 4 //最大组合
#define MAX_INDEX 34 //最大索引
#define MAX_REPERTORY 136 //最大库存
//////////////////////////////////////////////////////////////////////////
//逻辑掩码
#define MASK_COLOR 0xF0 //花色掩码
#define MASK_VALUE 0x0F //数值掩码
//////////////////////////////////////////////////////////////////////////
//动作定义
////动作标志
//#define WIK_NULL 0x0000 //没有类型
//#define WIK_LEFT 0x0001 //左吃类型
//#define WIK_CENTER 0x0002 //中吃类型
//#define WIK_RIGHT 0x0004 //右吃类型
//#define WIK_PENG 0x0008 //碰牌类型
//#define WIK_GANG 0x0010 //杠牌类型
//#define WIK_CHI_HU 0x0020 //吃胡类型
//#define WIK_DNBL 0x0040 //东南北左
//#define WIK_DNBC 0x0080 //东南北中
//#define WIK_DNBR 0x0100 //东南北右
//#define WIK_DXBL 0x0200 //东西北左
//#define WIK_DXBC 0x0400 //东西北中
//#define WIK_DXBR 0x0800 //东西北右
//动作标志
#define WIK_NULL 0x0000 //没有类型
#define WIK_LEFT (1<<0) //左吃类型
#define WIK_CENTER (1<<1) //中吃类型
#define WIK_RIGHT (1<<2) //右吃类型
#define WIK_PENG (1<<3) //碰牌类型
#define WIK_GANG (1<<4) //杠牌类型
#define WIK_CHI_HU (1<<5) //吃胡类型
#define WIK_DNBL (1<<6) //东南北左
#define WIK_DNBC (1<<7) //东南北中
#define WIK_DNBR (1<<8) //东南北右
#define WIK_DXBL (1<<9) //东西北左
#define WIK_DXBC (1<<10) //东西北中
#define WIK_DXBR (1<<11) //东西北右
#define WIK_CHI (WIK_LEFT|WIK_CENTER|WIK_RIGHT|WIK_DNBL|WIK_DNBC|WIK_DNBR|WIK_DXBL|WIK_DXBC|WIK_DXBR) //吃牌类型
//////////////////////////////////////////////////////////////////////////
//胡牌定义
//非胡类型
#define CHK_NULL 0x0000 //非胡类型
//胡牌类型
#define CHK_JI_HU 0x0001 //基本胡
#define CHK_QI_DUI 0x0002 //七对
#define CHK_THIRTEEN 0x0004 //13乱
#define CHK_SERVEN 0x0008 //七星
#define CHK_PENG_PENG 0x0010 //碰碰胡;
#define CHK_HUNYISE 0x0020 //混一色;
#define CHK_QINYISE 0x0040 //清一色;
#define CHK_ZIYISE 0x0080 //字一色;
//胡牌权位
#define CHR_ZI_MO 0x0001 //自摸权位
#define CHR_QIANG_GANG 0x0002 //抢杠权位
#define CHR_GANG_FLOWER 0x0004 //杠上开花
#define CHR_HAS_KING 0x0008 //有宝权位
#define CHR_GANG_ZHONGSE 0x0010 //杠中色权位;
#define CHR_TIAN 0x0020 //天胡权位
#define CHR_DI 0x0040 //地胡权位
#define CHR_LIAN_GANG_FLOWER 0x0080 //连杠胡权位;
#define CHR_QIANG_LIAN_GANG 0x0100 //抢连杠胡权位;
#define CHR_INVALIDHU_ZIYISE 0x0200 //没有组成胡牌的字一色胡权位;
//////////////////////////////////////////////////////////////////////////
//类型子项
struct tagKindItem
{
WORD wWeaveKind; //组合类型
BYTE cbCenterCard; //中心扑克
BYTE cbCardIndex[3]; //扑克索引
};
////组合子项
//struct tagWeaveItem
//{
// WORD wWeaveKind; //组合类型
// BYTE cbCenterCard; //中心扑克
// BYTE cbPublicCard; //公开标志
// WORD wProvideUser; //供应用户
//};
//胡牌结果
struct tagChiHuResult
{
WORD wChiHuKind; //吃胡类型
WORD wChiHuRight; //胡牌权位
};
//分析子项
struct tagAnalyseItem
{
BYTE cbEyeKingReplace; //精牌替换
BYTE cbWeaveKingReplace; //精牌替换
BYTE cbCardEye; //牌眼扑克
WORD wWeaveKind[MAX_WEAVE]; //组合类型
BYTE cbCenterCard[MAX_WEAVE]; //中心扑克
};
//////////////////////////////////////////////////////////////////////////
//数组说明
typedef CWHArray<tagAnalyseItem, tagAnalyseItem &> CAnalyseItemArray;
//游戏逻辑类
class CGameLogic
{
//变量定义
protected:
static const BYTE m_cbCardDataArray[MAX_REPERTORY]; //扑克数据
//函数定义
public:
//构造函数
CGameLogic();
//析构函数
virtual ~CGameLogic();
//控制函数
public:
//混乱扑克
void RandCardData(BYTE cbCardData[], BYTE cbMaxCount);
//删除扑克
bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
//删除扑克
bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard[], BYTE cbRemoveCount);
//删除扑克
bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, BYTE cbRemoveCard[], BYTE cbRemoveCount);
//获得去除重复扑克;
void GetCardRemoveRepeat(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT], BYTE &nCount);
//辅助函数
public:
//有效判断
bool IsValidCard(BYTE cbCardData);
//扑克数目
BYTE GetCardCount(BYTE cbCardIndex[MAX_INDEX]);
//组合扑克
BYTE GetWeaveCard(WORD wWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4]);
//等级函数
public:
//动作等级
BYTE GetUserActionRank(WORD wUserAction);
//胡牌等级
BYTE GetChiHuActionRank(tagChiHuResult & ChiHuResult);
//动作判断
public:
//吃牌判断
WORD EstimateEatCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
//碰牌判断
WORD EstimatePengCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
//杠牌判断
WORD EstimateGangCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
//动作判断
public:
//杠牌分析
WORD AnalyseGangCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult);
//吃胡分析
WORD AnalyseChiHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo = false, bool bRealHu = true);
//听牌分析
BYTE AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo = false, bool bTurnAll=false, bool bRealTing=false);
//是否听牌
bool IsTingCard(const BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo = true, bool bTurnAll = false);
private:
//吃胡分析(硬胡);
WORD AnalyseYingHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo = false, bool bRealHu = true);
//吃胡分析(一边倒胡);
WORD AnalyseYiBianDaoHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo = false, bool bRealHu = true);
//转换函数
public:
//扑克转换
BYTE SwitchToCardData(BYTE cbCardIndex);
//扑克转换
BYTE SwitchToCardIndex(BYTE cbCardData);
//扑克转换
BYTE SwitchToCardData(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT],BYTE bMaxCount);
//扑克转换
BYTE SwitchToCardIndex(BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]);
//计算积分
LONG CalScore(tagChiHuResult & ChihuResult, LONG &lScore, LONG &lTimes, LONG &lExtScore, BYTE cbFan, bool bZhiAnGangFanbei = false);
//计算副精
BYTE GetKingFromBrother(BYTE cbBrotherData);
//内部函数
private:
//分析扑克
bool AnalyseCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbItemCount, CAnalyseItemArray & AnalyseItemArray,BYTE cbCurrentCard,bool bZimo);
//7星
bool ServenStar(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo, bool bChongfeng=false);
//七小对牌
bool IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard,BYTE &cbGerman,bool bZimo);
//3顺 3刻
bool IsNeat3(const BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman);
// 对子 豪华对子
bool IsNeat2(BYTE cbCardIndex[MAX_INDEX],tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
//全分离
bool IsNeatAlone(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo);
public:
//判断是否是字牌;
bool IsZiPai(BYTE cbCardData);
//清一色牌(万,条,筒中的一门牌);
bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
//混一色牌(万,条,筒中的一门牌加上字牌);
bool IsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
//字一色牌(全是字牌);
bool IsZiYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
//没中色纠正权位;
bool IsCheckZhongSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard, tagChiHuResult & ChiHuResult, BYTE cbRule, bool bTing = false);
//比较胡牌结果,获得最大的那个;
void CompareChiHuResult(tagChiHuResult& destChiHuResult, tagChiHuResult& tempChiHuResult);
};
//////////////////////////////////////////////////////////////////////////
#endif