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

161 lines
4.1 KiB
C++

#ifndef GAME_LOGIC_HEAD_FILE
#define GAME_LOGIC_HEAD_FILE
#pragma once
#include "Stdafx.h"
//////////////////////////////////////////////////////////////////////////
//排序类型
#define ST_ORDER 0 //大小排序
#define ST_COUNT 1 //数目排序
//////////////////////////////////////////////////////////////////////////
//数目定义;
#define MAX_COUNT 27 //最大数目;
#define FULL_COUNT 108 //全牌数目;
#define MAX_NO_JOKER_COUNT 26 //最大数目
#define NO_JOKER_COUNT 104 //全牌数目
//逻辑数目;
#define NORMAL_COUNT 27 //常规数目;
//////////////////////////////////////////////////////////////////////////
//数值掩码
#define MASK_COLOR 0xF0 //花色掩码
#define MASK_VALUE 0x0F //数值掩码
//扑克类型
enum CART_TYPE
{
CT_ERROR = 0, //错误类型
CT_SINGLE, //单牌类型
CT_DOUBLE, //对牌类型
CT_THREE_TAKE_TWO, //三条类型
CT_SINGLE_LINE, //单连类型
CT_DOUBLE_LINE, //对连类型
CT_THREE_LINE, //三连类型
CT_BOMB_4, //炸弹类型
CT_BOMB_5, //炸弹类型
CT_BOMB_6, //炸弹类型
CT_BOMB_7, //炸弹类型
CT_BOMB_8, //炸弹类型
CT_BOMB_9, //炸弹类型
CT_BOMB_10, //炸弹类型
CT_COUNT, //牌型数量
};
#define BOMB_TYPE_COUNT 7 //炸弹类型数量
//////////////////////////////////////////////////////////////////////////
#define MAX_BLOCK_COUNT 12 //一手牌最大张数
//分析结构
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 tagAnalyseResult
{
BYTE cbBlockCount[MAX_BLOCK_COUNT]; //扑克数目
BYTE cbCardData[MAX_BLOCK_COUNT][MAX_COUNT]; //扑克数据
bool cbLaiZi;
};
//出牌结果
struct tagOutCardResult
{
BYTE cbCardCount; //扑克数目
BYTE cbResultCard[MAX_COUNT]; //结果扑克
};
//////////////////////////////////////////////////////////////////////////
//游戏逻辑类
class CGameLogic
{
//变量定义
protected:
static const BYTE m_cbCardData[FULL_COUNT]; //扑克数据
static const BYTE m_cbNoJokerCardData[NO_JOKER_COUNT];
//函数定义
public:
//构造函数
CGameLogic();
//析构函数
virtual ~CGameLogic();
//类型函数
public:
//获取类型
int GetCardType(const BYTE cbCardData[], BYTE cbCardCount, bool isLastCard);
//获取数值
BYTE GetCardValue(BYTE cbCardData) { return cbCardData&MASK_VALUE; }
//获取花色
BYTE GetCardColor(BYTE cbCardData) { return cbCardData&MASK_COLOR; }
//控制函数
public:
//混乱扑克
void RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount);
//混乱扑克
void RandNoJokerCardList(BYTE cbCardBuffer[], BYTE cbBufferCount);
//排列扑克
void SortCardList(BYTE cbCardData[], BYTE cbCardCount, BYTE cbSortType);
//删除扑克
bool RemoveCard(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount);
//随机扑克
BYTE GetRandomCard(void) ;
//排列扑克
void SortOutCardList(BYTE cbCardData[], BYTE cbCardCount, int nCardType, bool isLastCard);
//逻辑函数
public:
//有效判断
bool IsValidCard(BYTE cbCardData);
//逻辑数值
BYTE GetCardLogicValue(BYTE cbCardData);
//对比扑克
bool CompareCard(const CMD_C_OutCard* pFirstOutCard, CMD_C_OutCard* pNextOutCard);
//赖子数目
BYTE GetLaiZiCount(const BYTE cbHandCardData[], BYTE cbHandCardCount);
//是否癞子牌
bool IsLaiZiCard(BYTE cbCard);
//内部函数
public:
//分析扑克
void AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult);
//分析比较
bool AnalysebCompare(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbMaxCardData[CT_COUNT], BYTE &cbBlockCount, int dCardType, bool isLastCard);
//牌组转换(将32张牌的使用情况转化为一个32位整型)
int TransListToInt(int iOldType,int iNewType);
//是否包含牌型
bool IsHasCardType(int iCardType, CART_TYPE ct_value);
private:
//获取类型结果
int GetType(tagAnalyseResult& AnalyseResult, const BYTE cbCardData[], BYTE cbCardCount, BYTE& cbMaxCardData, BYTE &cbBlockCount, bool isLastCard);
};
#endif