250 lines
8.9 KiB
C++
250 lines
8.9 KiB
C++
#ifndef GAME_LOGIC_HEAD_FILE
|
|
#define GAME_LOGIC_HEAD_FILE
|
|
|
|
#pragma once
|
|
|
|
#include "Stdafx.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//常量定义
|
|
|
|
#define MAX_WEAVE 4 //最大组合
|
|
#define MAX_INDEX 34 //最大索引
|
|
#define MAX_REPERTORY 136 //最大库存
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//逻辑掩码
|
|
|
|
#define MASK_COLOR 0xF0 //花色掩码
|
|
#define MASK_VALUE 0x0F //数值掩码
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//动作定义
|
|
|
|
////动作标志
|
|
//#define WIK_NULL 0x0000 //没有类型
|
|
//#define WIK_LEFT 0x0001 //左吃类型
|
|
//#define WIK_CENTER 0x0002 //中吃类型
|
|
//#define WIK_RIGHT 0x0004 //右吃类型
|
|
//#define WIK_PENG 0x0008 //碰牌类型
|
|
//#define WIK_GANG 0x0010 //杠牌类型
|
|
//#define WIK_CHI_HU 0x0020 //吃胡类型
|
|
//#define WIK_DNBL 0x0040 //东南北左
|
|
//#define WIK_DNBC 0x0080 //东南北中
|
|
//#define WIK_DNBR 0x0100 //东南北右
|
|
//#define WIK_DXBL 0x0200 //东西北左
|
|
//#define WIK_DXBC 0x0400 //东西北中
|
|
//#define WIK_DXBR 0x0800 //东西北右
|
|
|
|
//动作标志
|
|
#define WIK_NULL 0x0000 //没有类型
|
|
#define WIK_LEFT (1<<0) //左吃类型
|
|
#define WIK_CENTER (1<<1) //中吃类型
|
|
#define WIK_RIGHT (1<<2) //右吃类型
|
|
|
|
#define WIK_PENG (1<<3) //碰牌类型
|
|
#define WIK_GANG (1<<4) //杠牌类型
|
|
#define WIK_CHI_HU (1<<5) //吃胡类型
|
|
|
|
#define WIK_DNBL (1<<6) //东南北左
|
|
#define WIK_DNBC (1<<7) //东南北中
|
|
#define WIK_DNBR (1<<8) //东南北右
|
|
#define WIK_DXBL (1<<9) //东西北左
|
|
#define WIK_DXBC (1<<10) //东西北中
|
|
#define WIK_DXBR (1<<11) //东西北右
|
|
|
|
#define WIK_CHI (WIK_LEFT|WIK_CENTER|WIK_RIGHT|WIK_DNBL|WIK_DNBC|WIK_DNBR|WIK_DXBL|WIK_DXBC|WIK_DXBR) //吃牌类型
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//胡牌定义
|
|
|
|
//非胡类型
|
|
#define CHK_NULL 0x0000 //非胡类型
|
|
|
|
//胡牌类型
|
|
#define CHK_JI_HU 0x0001 //基本胡
|
|
#define CHK_QI_DUI 0x0002 //七对
|
|
#define CHK_THIRTEEN 0x0004 //13乱
|
|
#define CHK_SERVEN 0x0008 //七星
|
|
#define CHK_PENG_PENG 0x0010 //碰碰胡;
|
|
#define CHK_HUNYISE 0x0020 //混一色;
|
|
#define CHK_QINYISE 0x0040 //清一色;
|
|
#define CHK_ZIYISE 0x0080 //字一色;
|
|
|
|
//胡牌权位
|
|
#define CHR_ZI_MO 0x0001 //自摸权位
|
|
#define CHR_QIANG_GANG 0x0002 //抢杠权位
|
|
#define CHR_GANG_FLOWER 0x0004 //杠上开花
|
|
#define CHR_HAS_KING 0x0008 //有宝权位
|
|
#define CHR_GANG_ZHONGSE 0x0010 //杠中色权位;
|
|
#define CHR_TIAN 0x0020 //天胡权位
|
|
#define CHR_DI 0x0040 //地胡权位
|
|
#define CHR_LIAN_GANG_FLOWER 0x0080 //连杠胡权位;
|
|
#define CHR_QIANG_LIAN_GANG 0x0100 //抢连杠胡权位;
|
|
#define CHR_INVALIDHU_ZIYISE 0x0200 //没有组成胡牌的字一色胡权位;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//类型子项
|
|
struct tagKindItem
|
|
{
|
|
WORD wWeaveKind; //组合类型
|
|
BYTE cbCenterCard; //中心扑克
|
|
BYTE cbCardIndex[3]; //扑克索引
|
|
};
|
|
|
|
////组合子项
|
|
//struct tagWeaveItem
|
|
//{
|
|
// WORD wWeaveKind; //组合类型
|
|
// BYTE cbCenterCard; //中心扑克
|
|
// BYTE cbPublicCard; //公开标志
|
|
// WORD wProvideUser; //供应用户
|
|
//};
|
|
|
|
//胡牌结果
|
|
struct tagChiHuResult
|
|
{
|
|
WORD wChiHuKind; //吃胡类型
|
|
WORD wChiHuRight; //胡牌权位
|
|
};
|
|
|
|
|
|
|
|
//分析子项
|
|
struct tagAnalyseItem
|
|
{
|
|
BYTE cbEyeKingReplace; //精牌替换
|
|
BYTE cbWeaveKingReplace; //精牌替换
|
|
BYTE cbCardEye; //牌眼扑克
|
|
WORD wWeaveKind[MAX_WEAVE]; //组合类型
|
|
BYTE cbCenterCard[MAX_WEAVE]; //中心扑克
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//数组说明
|
|
typedef CWHArray<tagAnalyseItem, tagAnalyseItem &> CAnalyseItemArray;
|
|
|
|
|
|
//游戏逻辑类
|
|
class CGameLogic
|
|
{
|
|
//变量定义
|
|
protected:
|
|
static const BYTE m_cbCardDataArray[MAX_REPERTORY]; //扑克数据
|
|
|
|
//函数定义
|
|
public:
|
|
//构造函数
|
|
CGameLogic();
|
|
//析构函数
|
|
virtual ~CGameLogic();
|
|
|
|
//控制函数
|
|
public:
|
|
//混乱扑克
|
|
void RandCardData(BYTE cbCardData[], BYTE cbMaxCount);
|
|
//删除扑克
|
|
bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
|
|
//删除扑克
|
|
bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard[], BYTE cbRemoveCount);
|
|
//删除扑克
|
|
bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, BYTE cbRemoveCard[], BYTE cbRemoveCount);
|
|
|
|
//获得去除重复扑克;
|
|
void GetCardRemoveRepeat(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT], BYTE &nCount);
|
|
|
|
//辅助函数
|
|
public:
|
|
//有效判断
|
|
bool IsValidCard(BYTE cbCardData);
|
|
//扑克数目
|
|
BYTE GetCardCount(BYTE cbCardIndex[MAX_INDEX]);
|
|
//组合扑克
|
|
BYTE GetWeaveCard(WORD wWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4]);
|
|
|
|
//等级函数
|
|
public:
|
|
//动作等级
|
|
BYTE GetUserActionRank(WORD wUserAction);
|
|
//胡牌等级
|
|
BYTE GetChiHuActionRank(tagChiHuResult & ChiHuResult);
|
|
|
|
//动作判断
|
|
public:
|
|
//吃牌判断
|
|
WORD EstimateEatCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
|
|
//碰牌判断
|
|
WORD EstimatePengCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
|
|
//杠牌判断
|
|
WORD EstimateGangCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
|
|
|
|
//动作判断
|
|
public:
|
|
//杠牌分析
|
|
WORD AnalyseGangCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult);
|
|
//吃胡分析
|
|
WORD AnalyseChiHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, BYTE cbHuRule, bool bZimo = false, bool bRealHu = true);
|
|
|
|
//听牌分析
|
|
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);
|
|
|
|
//是否听牌
|
|
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:
|
|
//吃胡分析(硬胡);
|
|
WORD AnalyseYingHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo = false, bool bRealHu = true);
|
|
//吃胡分析(一边倒胡);
|
|
WORD AnalyseYiBianDaoHuCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, WORD wChiHuRight, tagChiHuResult & ChiHuResult, bool bZimo = false, bool bRealHu = true);
|
|
|
|
|
|
//转换函数
|
|
public:
|
|
//扑克转换
|
|
BYTE SwitchToCardData(BYTE cbCardIndex);
|
|
//扑克转换
|
|
BYTE SwitchToCardIndex(BYTE cbCardData);
|
|
//扑克转换
|
|
BYTE SwitchToCardData(BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT],BYTE bMaxCount);
|
|
//扑克转换
|
|
BYTE SwitchToCardIndex(BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]);
|
|
//计算积分
|
|
LONG CalScore(tagChiHuResult & ChihuResult, LONG &lScore, LONG &lTimes, LONG &lExtScore, BYTE cbFan, bool bZhiAnGangFanbei = false);
|
|
//计算副精
|
|
BYTE GetKingFromBrother(BYTE cbBrotherData);
|
|
|
|
//内部函数
|
|
private:
|
|
//分析扑克
|
|
bool AnalyseCard(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE cbItemCount, CAnalyseItemArray & AnalyseItemArray,BYTE cbCurrentCard,bool bZimo);
|
|
//7星
|
|
bool ServenStar(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo, bool bChongfeng=false);
|
|
//七小对牌
|
|
bool IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard,BYTE &cbGerman,bool bZimo);
|
|
//3顺 3刻
|
|
bool IsNeat3(const BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman);
|
|
// 对子 豪华对子
|
|
bool IsNeat2(BYTE cbCardIndex[MAX_INDEX],tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
|
|
//全分离
|
|
bool IsNeatAlone(BYTE cbCardIndex[MAX_INDEX],BYTE &cbGerman,BYTE cbCurrentCard,bool bZimo);
|
|
|
|
public:
|
|
//判断是否是字牌;
|
|
bool IsZiPai(BYTE cbCardData);
|
|
//清一色牌(万,条,筒中的一门牌);
|
|
bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
|
|
//混一色牌(万,条,筒中的一门牌加上字牌);
|
|
bool IsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
|
|
//字一色牌(全是字牌);
|
|
bool IsZiYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard);
|
|
//没中色纠正权位;
|
|
bool IsCheckZhongSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard, tagChiHuResult & ChiHuResult, BYTE cbRule, bool bTing = false);
|
|
|
|
//比较胡牌结果,获得最大的那个;
|
|
void CompareChiHuResult(tagChiHuResult& destChiHuResult, tagChiHuResult& tempChiHuResult);
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif |