Files
wnmj-normal/Servers/游戏组件/十三水/游戏服务器/GameLogic.h
2026-03-03 13:56:44 +08:00

217 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef GAME_LOGIC_HEAD_FILE
#define GAME_LOGIC_HEAD_FILE
/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
① 大小王可以当任何牌。
② 有带鬼的任何牌型都算假货和同类型的牌,真牌>带鬼相同点数的牌
③ 有带鬼的牌敦只能按能搭成的最大牌型算;有带鬼的同花顺比天然的同花顺小,如果都有带鬼再比搭成的同花顺的大小;
例如同花10 J Q K, A 10 J Q K ,鬼 >7 8 9 10 J
④有带鬼的炸弹比天然同牌点的炸弹小,如果都有带鬼再比搭成的炸弹的大小; 例如A A AA>A A A 鬼> 3 3 3 3 3 3 3 3 3 ,鬼, 鬼
⑤若有 2 个人 相同张牌型,且牌点一样(都带鬼)作打平算。若有 2 个人葫芦牌型,且 3 同张牌点一样(都带鬼),再比对子,若牌点还一样作打平算
⑥如 5张同的牌型例如 4444 鬼,按 4 个 4 带一个单张鬼算。此墩赢 10 水> 4 4 4 鬼。
⑦大小鬼加入后,所凑成的牌型都小于同类同点牌型,即真大于假。
⑧当鬼加入达到报到牌型,可作为报到。能凑成特殊牌型均可只是比相同真的小。
///////////////////////////////////////////////////////////////////////////////////////////////*/
#pragma once
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//扑克类型
#define CT_INVALID 0 //错误类型
#define CT_SINGLE 1 //单牌类型
#define CT_ONE_DOUBLE 2 //只有一对
#define CT_FIVE_TWO_DOUBLE 3 //两对牌型
#define CT_THREE 4 //三张牌型
#define CT_FIVE_MIXED_FLUSH_NO_A 5 //没A杂顺
#define CT_FIVE_MIXED_FLUSH_FIRST_A 6 //A在前顺子
#define CT_FIVE_MIXED_FLUSH_BACK_A 7 //A在后顺子
#define CT_FIVE_FLUSH 8 //同花五牌
#define CT_FIVE_THREE_DEOUBLE 9 //三条一对
#define CT_FIVE_FOUR_ONE 10 //四带一张
#define CT_FIVE_STRAIGHT_FLUSH_NO_A 11 //没A同花顺
#define CT_FIVE_STRAIGHT_FLUSH_FIRST_A 12 //A在前同花顺
#define CT_FIVE_STRAIGHT_FLUSH_BACK_A 13 //A在后同花顺
#define CT_FIVE_BOMB 44 //五同类型
#define CT_FIVE_MID_THREE_DEOUBLE 100 //中墩葫芦
//特殊牌型
#define CT_THIRTEEN_FLUSH 26 //同花十三水
#define CT_THIRTEEN 25 //十三水
#define CT_TWELVE_KING 24 //十二皇族
#define CT_THREE_STRAIGHTFLUSH 23 //三同花顺
#define CT_THREE_BOMB 22 //三炸弹
#define CT_ALL_BIG 21 //全大
#define CT_ALL_SMALL 20 //全小
#define CT_SAME_COLOR 19 //凑一色
#define CT_FOUR_THREESAME 18 //四套冲三
#define CT_FIVEPAIR_THREE 17 //五对冲三
#define CT_SIXPAIR 16 //六对半
#define CT_THREE_FLUSH 15 //三同花
#define CT_THREE_STRAIGHT 14 //三顺子
//数值掩码
#define CARD_MASK_COLOR 0xF0 //花色掩码
#define CARD_MASK_VALUE 0x0F //数值掩码
#define CARD_DW 16
#define CARD_XW 15
//扑克数目
#define CARD_COUNT 52 //扑克数目
//分析结构
struct tagAnalyseData
{
BYTE bOneCount ; //单张数目
BYTE bTwoCount ; //两张数目
BYTE bThreeCount ; //三张数目
BYTE bFourCount ; //四张数目
BYTE bFiveCount ; //五张数目
BYTE bOneFirst[13]; //单牌位置
BYTE bTwoFirst[13]; //对牌位置
BYTE bThreeFirst[13]; //三条位置
BYTE bFourFirst[13]; //四张位置
BYTE bFiveFirst[13]; //五张位置
bool bStraight; //是否顺子
};
//分析结构
struct tagAnalyseResult
{
BYTE cbFourCount; //四张数目
BYTE cbThreeCount; //三张数目
BYTE cbDoubleCount; //两张数目
BYTE cbSignedCount; //单张数目
BYTE cbFourCardData[13]; //四张扑克
BYTE cbThreeCardData[13]; //三张扑克
BYTE cbDoubleCardData[13]; //两张扑克
BYTE cbSignedCardData[13]; //单张扑克
};
//分析结构
struct tagAnalyseType
{
bool bOnePare; //有一对
bool bTwoPare; //有两对
bool bThreeSame; //有三条
bool bStraight; //有顺子
bool bFlush; //有同花
bool bGourd; //有葫芦
bool bFourSame; //有铁支
bool bStraightFlush; //有同花顺
bool bFiveSame; //有五相
BYTE cbOnePare[100]; //一对的序号
BYTE cbTwoPare[100]; //两对的序号
BYTE cbThreeSame[100]; //三条的序号
BYTE cbStraight[100]; //顺子的序号
BYTE cbFlush[100]; //同花的序号
BYTE cbGourd[100]; //葫芦的序号
BYTE cbFourSame[100]; //铁支的序号
BYTE cbStraightFlush[100]; //同花顺的序号
BYTE cbFiveSame[100]; //五相的序号
bool bbOnePare[20]; //所有一对标志弹起
bool bbTwoPare[20]; //所有二对标志弹起
bool bbThreeSame[20]; //所有三条标志弹起
bool bbStraight[20]; //所有顺子标志弹起
bool bbFlush[20]; //所有同花标志弹起
bool bbGourd[20]; //所有葫芦标志弹起
bool bbFourSame[20]; //所有铁支标志弹起
bool bbStraightFlush[20]; //所有同花顺标志弹起
bool bbFiveSame[20]; //所有五相标志弹起
BYTE btOnePare; //一对的数量 单独
BYTE btThreeSame; //三条数量 单独
BYTE btTwoPare; //两对的数量
BYTE btStraight; //顺子的数量
BYTE btFlush; //同花的数量
BYTE btGourd; //葫芦的数量
BYTE btFourSame; //铁支的数量
BYTE btStraightFlush; //同花顺的数量
BYTE btFiveSame; //五相的数量
};
//////////////////////////////////////////////////////////////////////////
//排列类型
enum enSortCardType
{
enDescend , //降序类型
enAscend , //升序类型
enColor //花色类型
};
//游戏逻辑类
class CGameLogic
{
//变量定义
protected:
static const BYTE m_bCardListData[CARD_COUNT]; //扑克数据
bool m_bClassicRule; //经典规则;
//函数定义
public:
//构造函数
CGameLogic();
//析构函数
virtual ~CGameLogic();
BYTE btCardSpecialData[13];
//类型函数
public:
//获取类型
BYTE GetCardType(BYTE bCardData[], BYTE bCardCount,BYTE btSpecialCard[]);
//获取数值
BYTE GetCardValue(BYTE bCardData) { return bCardData&CARD_MASK_VALUE; } //十六进制前面四位表示牌的数值
//获取花色
BYTE GetCardColor(BYTE bCardData) { return (bCardData&CARD_MASK_COLOR)>>4; } //十六进制后面四位表示牌的花色
//设置是否是经典规则;
void setClassicRule(bool bFlag) { m_bClassicRule = bFlag; }
//控制函数
public:
//排列扑克
void SortCardList(BYTE bCardData[], BYTE bCardCount,enSortCardType SortCardType=enDescend);
//混乱扑克
void RandCardList(BYTE bCardBuffer[], BYTE bBufferCount);
//删除扑克
bool RemoveCard(const BYTE bRemoveCard[], BYTE bRemoveCount, BYTE bCardData[], BYTE bCardCount);
//添加扑克
bool AppendCard(const BYTE bAppendCard[],BYTE bAppendCount,BYTE bCardData[],BYTE &bCardCount);
//得到牌的数量
BYTE GetCardCount(BYTE bCardData[]);
//逻辑函数
public:
//逻辑数值
BYTE GetCardLogicValue(BYTE bCardData);
//对比扑克
BYTE CompareCard(BYTE bInFirstList[], BYTE bInNextList[], BYTE bFirstCount, BYTE bNextCount , bool bComperWithOther);
//获得8种类型
tagAnalyseType GetType(BYTE bCardData[], BYTE bCardCount);
//内部函数
public:
//分析扑克
void AnalyseCard(const BYTE bCardDataList[] , const BYTE bCardCount , tagAnalyseData& AnalyseData) ;
//分析扑克
void AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult) ;
//牌数据是否一样
bool IsSameCardData(BYTE btFirstCard[],BYTE btNextCard[],BYTE btFirstCount,BYTE btNextCount);
//自动摆牌
void AutoPutCard(BYTE btHandCardData[],BYTE btHandCardCount,BYTE btFrontCard[],BYTE btMidCard[],BYTE btBackCard[]);
//抽取大牌
BYTE GetMaxCardData(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbMaxCardData[], BYTE & bMaxCardCount, BYTE bNeedCCount = 5);
//是否同花
bool IsFlush(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbMaxCardData[], BYTE & bMaxCardCount, BYTE bNeedCCount = 5);
//是否顺子
bool IsStraight(const BYTE cbCardData[], const BYTE cbCardCount, BYTE cbMaxCardData[], BYTE & bMaxCardCount, BYTE bNeedCCount = 5);
//是否是三同花顺
bool IsThreeFlushStraight(const BYTE cbCardData[], const BYTE cbCardCount);
//最好的一敦
void TheBestCard(tagAnalyseType tagCardType, BYTE btHandCardData[], BYTE btHandCardCount, BYTE btFrontCard[], BYTE btMidCard[], BYTE btBackCard[]);
//三敦总共的水数
BYTE ThreeDunAllShuiShu(BYTE btFrontCard[], BYTE btMidCard[], BYTE btBackCard[]);
//是否比前面的大
bool IsBiggerThanFront(BYTE btFrontFrontCard[], BYTE btFrontMidCard[], BYTE btFrontBackCard[], BYTE btFrontCard[], BYTE btMidCard[], BYTE btBackCard[]);
};
//////////////////////////////////////////////////////////////////////////
#endif