Files
wnmj/Servers/游戏组件/万年麻将/游戏服务器/GameLogic.h

250 lines
8.9 KiB
C
Raw Normal View History

2026-02-13 14:34:15 +08:00
#ifndef GAME_LOGIC_HEAD_FILE
#define GAME_LOGIC_HEAD_FILE
#pragma once
#include "Stdafx.h"
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_WEAVE 4 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_INDEX 34 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_REPERTORY 136 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>
#define MASK_COLOR 0xF0 //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
#define MASK_VALUE 0x0F //<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
//#define WIK_NULL 0x0000 //û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_LEFT 0x0001 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_CENTER 0x0002 //<2F>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_RIGHT 0x0004 //<2F>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_PENG 0x0008 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_GANG 0x0010 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_CHI_HU 0x0020 //<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_DNBL 0x0040 //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
//#define WIK_DNBC 0x0080 //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
//#define WIK_DNBR 0x0100 //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
//#define WIK_DXBL 0x0200 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_DXBC 0x0400 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define WIK_DXBR 0x0800 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
#define WIK_NULL 0x0000 //û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_LEFT (1<<0) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_CENTER (1<<1) //<2F>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>
#define WIK_RIGHT (1<<2) //<2F>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD>
#define WIK_PENG (1<<3) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_GANG (1<<4) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_CHI_HU (1<<5) //<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>
#define WIK_DNBL (1<<6) //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
#define WIK_DNBC (1<<7) //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
#define WIK_DNBR (1<<8) //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
#define WIK_DXBL (1<<9) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_DXBC (1<<10) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_DXBR (1<<11) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define WIK_CHI (WIK_LEFT|WIK_CENTER|WIK_RIGHT|WIK_DNBL|WIK_DNBC|WIK_DNBR|WIK_DXBL|WIK_DXBC|WIK_DXBR) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>
//<2F>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD><EFBFBD>
#define CHK_NULL 0x0000 //<2F>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define CHK_JI_HU 0x0001 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define CHK_QI_DUI 0x0002 //<2F>߶<EFBFBD>
#define CHK_THIRTEEN 0x0004 //13<31><33>
#define CHK_SERVEN 0x0008 //<2F><><EFBFBD><EFBFBD>
#define CHK_PENG_PENG 0x0010 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
#define CHK_HUNYISE 0x0020 //<2F><>һɫ;
#define CHK_QINYISE 0x0040 //<2F><>һɫ;
#define CHK_ZIYISE 0x0080 //<2F><>һɫ;
//<2F><><EFBFBD><EFBFBD>Ȩλ
#define CHR_ZI_MO 0x0001 //<2F><><EFBFBD><EFBFBD>Ȩλ
#define CHR_QIANG_GANG 0x0002 //<2F><><EFBFBD><EFBFBD>Ȩλ
#define CHR_GANG_FLOWER 0x0004 //<2F><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD>
#define CHR_HAS_KING 0x0008 //<2F>б<EFBFBD>Ȩλ
#define CHR_GANG_ZHONGSE 0x0010 //<2F><><EFBFBD><EFBFBD>ɫȨλ;
#define CHR_TIAN 0x0020 //<2F><><EFBFBD><EFBFBD>Ȩλ
#define CHR_DI 0x0040 //<2F>غ<EFBFBD>Ȩλ
#define CHR_LIAN_GANG_FLOWER 0x0080 //<2F><><EFBFBD>ܺ<EFBFBD>Ȩλ;
#define CHR_QIANG_LIAN_GANG 0x0100 //<2F><><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD>Ȩλ;
#define CHR_INVALIDHU_ZIYISE 0x0200 //û<><C3BB><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA>Ƶ<EFBFBD><C6B5><EFBFBD>һɫ<D2BB><C9AB>Ȩλ;
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct tagKindItem
{
WORD wWeaveKind; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCenterCard; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE cbCardIndex[3]; //<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
};
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//struct tagWeaveItem
//{
// WORD wWeaveKind; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// BYTE cbCenterCard; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
// BYTE cbPublicCard; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
// WORD wProvideUser; //<2F><>Ӧ<EFBFBD>û<EFBFBD>
//};
//<2F><><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>
struct tagChiHuResult
{
WORD wChiHuKind; //<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>
WORD wChiHuRight; //<2F><><EFBFBD><EFBFBD>Ȩλ
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct tagAnalyseItem
{
BYTE cbEyeKingReplace; //<2F><><EFBFBD><EFBFBD><EFBFBD>
BYTE cbWeaveKingReplace; //<2F><><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardEye; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
WORD wWeaveKind[MAX_WEAVE]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCenterCard[MAX_WEAVE]; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
};
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
typedef CWHArray<tagAnalyseItem, tagAnalyseItem &> CAnalyseItemArray;
//<2F><>Ϸ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
class CGameLogic
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
static const BYTE m_cbCardDataArray[MAX_REPERTORY]; //<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CGameLogic();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CGameLogic();
//<2F><><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void RandCardData(BYTE cbCardData[], BYTE cbMaxCount);
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard[], BYTE cbRemoveCount);
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, BYTE cbRemoveCard[], BYTE cbRemoveCount);
//<2F><><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ظ<EFBFBD><D8B8>˿<EFBFBD>;
void GetCardRemoveRepeat(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT], BYTE &nCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><>Ч<EFBFBD>ж<EFBFBD>
bool IsValidCard(BYTE cbCardData);
//<2F>˿<EFBFBD><CBBF><EFBFBD>Ŀ
BYTE GetCardCount(BYTE cbCardIndex[MAX_INDEX]);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE GetWeaveCard(WORD wWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4]);
//<2F>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
BYTE GetUserActionRank(WORD wUserAction);
//<2F><><EFBFBD>Ƶȼ<C6B5>
BYTE GetChiHuActionRank(tagChiHuResult & ChiHuResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD EstimateEatCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD EstimatePengCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD EstimateGangCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
public:
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
WORD AnalyseGangCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult);
//<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>
WORD AnalyseChiHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo = false, bool bRealHu = true);
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
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);
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
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:
//<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><><D3B2>);
WORD AnalyseYingHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo = false, bool bRealHu = true);
//<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>(һ<>ߵ<EFBFBD><DFB5><EFBFBD>);
WORD AnalyseYiBianDaoHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo = false, bool bRealHu = true);
//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE SwitchToCardData(BYTE cbCardIndex);
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE SwitchToCardIndex(BYTE cbCardData);
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE SwitchToCardData(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT],BYTE bMaxCount);
//<2F>˿<EFBFBD>ת<EFBFBD><D7AA>
BYTE SwitchToCardIndex(BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LONG CalScore(tagChiHuResult & ChihuResult, LONG &lScore, LONG &lTimes, LONG &lExtScore, BYTE cbFan, bool bZhiAnGangFanbei = false);
//<2F><><EFBFBD><EFBFBD><E3B8B1>
BYTE GetKingFromBrother(BYTE cbBrotherData);
//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
private:
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
bool AnalyseCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbItemCount, CAnalyseItemArray & AnalyseItemArray,BYTE cbCurrentCard,bool bZimo);
//7<><37>
bool ServenStar(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo, bool bChongfeng=false);
//<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
bool IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard,BYTE &cbGerman,bool bZimo);
//3˳ 3<><33>
bool IsNeat3(const BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IsNeat2(BYTE cbCardIndex[MAX_INDEX],tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
//ȫ<><C8AB><EFBFBD><EFBFBD>
bool IsNeatAlone(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo);
public:
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
bool IsZiPai(BYTE cbCardData);
//<2F><>һɫ<D2BB><C9AB>(<28><>,<2C><><>е<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>);
bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
//<2F><>һɫ<D2BB><C9AB>(<28><>,<2C><><>е<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
bool IsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
//<2F><>һɫ<D2BB><C9AB><><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
bool IsZiYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
//û<><C3BB>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>Ȩλ;
bool IsCheckZhongSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard, tagChiHuResult & ChiHuResult, BYTE cbRule, bool bTing = false);
//<2F>ȽϺ<C8BD><CFBA>ƽ<EFBFBD><C6BD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>;
void CompareChiHuResult(tagChiHuResult& destChiHuResult, tagChiHuResult& tempChiHuResult);
};
//////////////////////////////////////////////////////////////////////////
#endif