217 lines
10 KiB
C++
217 lines
10 KiB
C++
#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 , A,A>A , A , A 鬼> 3 , 3 , 3 , 3 >3, 3, 3 ,鬼>3 , 3 ,鬼, 鬼
|
||
⑤若有 2 个人 相同张牌型,且牌点一样(都带鬼)作打平算。若有 2 个人葫芦牌型,且 3 同张牌点一样(都带鬼),再比对子,若牌点还一样作打平算
|
||
⑥如 5张同的牌型,例如 4,4,4,4, 鬼,按 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 |