Files
wnmj/Classes/Games/DaZha/DZ_GameLogic.h

204 lines
6.3 KiB
C
Raw Normal View History

2026-02-13 14:34:15 +08:00
#ifndef DZ_GAME_LOGIC_HEAD_FILE
#define DZ_GAME_LOGIC_HEAD_FILE
#pragma once
#include "Types.h"
#include "Macro.h"
#include "CardDefine.h"
#include "DZ_CMD.h"
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define DZ_ST_ORDER 0 //<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
#define DZ_ST_COUNT 1 //<2F><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>;
#define DZ_MAX_COUNT 27 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ;
#define DZ_FULL_COUNT 108 //ȫ<><C8AB><EFBFBD><EFBFBD>Ŀ;
#define DZ_MAX_NO_JOKER_COUNT 26 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
#define NO_JOKER_COUNT 104 //ȫ<><C8AB><EFBFBD><EFBFBD>Ŀ
//<2F>߼<EFBFBD><DFBC><EFBFBD>Ŀ;
#define DZ_NORMAL_COUNT 27 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ;
//////////////////////////////////////////////////////////////////////////
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
#define DZ_MASK_COLOR 0xF0 //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
#define DZ_MASK_VALUE 0x0F //<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
enum CART_TYPE
{
DZ_CT_ERROR = 0, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_SINGLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_DOUBLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_THREE_TAKE_TWO, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_SINGLE_LINE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_DOUBLE_LINE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_THREE_LINE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_4, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_5, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_6, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_7, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_8, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_9, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_BOMB_10, //ը<><D5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DZ_CT_COUNT, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
#define DZ_ST_HIDE 100
#define DZ_ST_DEAL_CARD 101
#define DZ_ST_PASS 102
#define DZ_ST_CALL 103
#define DZ_ST_CLICK_CARD 104
#define DZ_ST_OUT_CARD 105
#define DZ_ST_LEFT_ONE_CARD 106
#define DZ_ST_WIN 107
#define DZ_ST_LOSE 108
//////////////////////////////////////////////////////////////////////////
#define DZ_MAX_BLOCK_COUNT 12 //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enum CARD_BLOCK_INDEX
{
BLOCK_ONE = 0,
BLOCK_TWO,
BLOCK_THREE,
BLOCK_FOUR,
BLOCK_FIVE,
BLOCK_SIX,
BLOCK_SEVEN,
BLOCK_EIGHT,
BLOCK_NINE,
BLOCK_TEN,
BLOCK_ELEVEN,
BLOCK_TWELVE
};
struct tagDZAnalyseResult
{
uint8 cbBlockCount[DZ_MAX_BLOCK_COUNT]; //<2F>˿<EFBFBD><CBBF><EFBFBD>Ŀ
uint8 cbCardData[DZ_MAX_BLOCK_COUNT][DZ_MAX_COUNT]; //<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
bool cbLaiZi;
};
//<2F><><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>
struct tagDZOutCardResult
{
uint8 cbCardCount; //<2F>˿<EFBFBD><CBBF><EFBFBD>Ŀ
uint8 cbResultCard[DZ_MAX_COUNT]; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
};
//<2F>ֲ<EFBFBD><D6B2><EFBFBD>Ϣ
struct tagDZDistributing
{
uint8 cbCardCount; //<2F>˿<EFBFBD><CBBF><EFBFBD>Ŀ
uint8 cbDistributing[18][6]; //<2F>ֲ<EFBFBD><D6B2><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>ֵ)
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct tagDZSearchCardResult
{
uint8 cbSearchCount; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
uint8 cbCardCount[DZ_MAX_COUNT]; //<2F>˿<EFBFBD><CBBF><EFBFBD>Ŀ
uint8 cbResultCard[DZ_MAX_COUNT][DZ_MAX_COUNT]; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
};
//////////////////////////////////////////////////////////////////////////
//<2F><>Ϸ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
class DZ_CGameLogic
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
static const uint8 m_cbCardData[DZ_FULL_COUNT]; //<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
static const uint8 m_cbNoJokerCardData[DZ_NO_JOKER_COUNT];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
DZ_CGameLogic();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~DZ_CGameLogic();
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
public:
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
int GetCardType(const uint8 cbCardData[], uint8 cbCardCount, bool isLastCard);
//<2F><>ȡ<EFBFBD><C8A1>ֵ
uint8 GetCardValue(uint8 cbCardData) { return cbCardData&DZ_MASK_VALUE; }
//<2F><>ȡ<EFBFBD><C8A1>ɫ
uint8 GetCardColor(uint8 cbCardData) { return cbCardData&DZ_MASK_COLOR; }
//<2F><><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void RandCardList(uint8 cbCardBuffer[], uint8 cbBufferCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void RandNoJokerCardList(uint8 cbCardBuffer[], uint8 cbBufferCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void SortCardList(uint8 cbCardData[], uint8 cbCardCount, uint8 cbSortType);
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
bool RemoveCard(const uint8 cbRemoveCard[], uint8 cbRemoveCount, uint8 cbCardData[], uint8 cbCardCount);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
uint8 GetRandomCard(void) ;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void SortOutCardList(uint8 cbCardData[], uint8 cbCardCount, int nCardType, bool isLastCard);
//<2F>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><>Ч<EFBFBD>ж<EFBFBD>
bool IsValidCard(uint8 cbCardData);
//<2F>߼<EFBFBD><DFBC><EFBFBD>ֵ
uint8 GetCardLogicValue(uint8 cbCardData);
//<2F>Ա<EFBFBD><D4B1>˿<EFBFBD>(<28>Ƚ<EFBFBD>ǰ<EFBFBD><C7B0>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ͺϷ<CDBA>);
bool CompareCard(const DZ_CMD_C_OutCard* pFirstOutCard, const DZ_CMD_C_OutCard* pNextOutCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
uint8 GetLaiZiCount(const uint8 cbHandCardData[], uint8 cbHandCardCount);
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IsLaiZiCard(uint8 cbCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8 SearchOutCard(const uint8 cbHandCardData[], uint8 cbHandCardCount, const DZ_CMD_C_OutCard* pFirstOutCard, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
uint8 SearchSingle(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
uint8 SearchDouble(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳;
uint8 SearchSingleLine(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, uint8 cbLineCount, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD>˫˳;
uint8 SearchDoubleLine(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, uint8 cbLineCount, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
uint8 SearchThreeTakeTwo(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD>;
uint8 SearchThreeLineTakeTwo(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, uint8 cbBlockCount, tagDZSearchCardResult *pSearchCardResult);
//<2F><><EFBFBD><EFBFBD>ը<EFBFBD><D5A8>;
uint8 SearchBomb(const uint8 cbHandCardData[], uint8 cbHandCardCount, uint8 cbReferCard, uint8 cbReferCount, int iReferCardType, tagDZSearchCardResult *pSearchCardResult, uint8 &cbResultCount);
//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
void AnalysebCardData(const uint8 cbCardData[], uint8 cbCardCount, tagDZAnalyseResult & AnalyseResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>
bool AnalysebCompare(const uint8 cbCardData[], uint8 cbCardCount, uint8 cbMaxCardData[DZ_CT_COUNT], uint8 &cbBlockCount, int dCardType, bool isLastCard);
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>(<28><>32<33><32><EFBFBD>Ƶ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊһ<CEAA><D2BB>32λ<32><CEBB><EFBFBD><EFBFBD>)
int TransListToInt(int iOldType,int iNewType);
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IsHasCardType(int iCardType, CART_TYPE ct_value);
//<2F>Dz<EFBFBD><C7B2><EFBFBD>ը<EFBFBD><D5A8>;
bool IsBombType(int iCardType);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD>
void AnalysebDistributing(const uint8 cbCardData[], uint8 cbCardCount, tagDZDistributing & Distributing);
private:
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
int GetType(tagDZAnalyseResult& AnalyseResult, const uint8 cbCardData[], uint8 cbCardCount, uint8& cbMaxCardData, uint8 &cbBlockCount, bool isLastCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
uint8 MakeCardData(uint8 cbLogicValue, uint8 cbColorIndex);
};
#endif