📄 servermanage1.h
字号:
#pragma once
#include "StdAfx.h"
//定时器 ID
#define TIME_SEND_CARD 30 //发牌定时器
#define TIME_WAIT_NT 31 //等待反牌
#define TIME_GAME_FINISH 32 //游戏结束定时器
//操作掩码
#define UG_HUA_MASK 0xF0 //1111 0000
#define UG_VALUE_MASK 0x0F //0000 1111
//扑克花色
#define UG_FANG_KUAI 0x00 //方块 0000 0000
#define UG_MEI_HUA 0x10 //梅花 0001 0000
#define UG_HONG_TAO 0x20 //红桃 0010 0000
#define UG_HEI_TAO 0x30 //黑桃 0011 0000
#define UG_NT_CARD 0x40 //主牌 0100 0000
#define UG_ERROR_HUA 0xF0 //错误 1111 0000
//扑克出牌类型
#define UG_ERROR_KIND 0 //错误
#define UG_ONLY_ONE 1 //单牌
#define UG_DOUBLE 2 //对牌
#define UG_THREE 3 //三条
#define UG_DOUBLE_TRACKOR 4 //两条拖拉机
#define UG_THREE_TARCKOR 5 //三条拖拉机
#define UG_SHOW_CARD 6 //甩牌
//扑克数目定义
#define PLAY_TWO_CARD 1 //两副扑克
#define PLAY_THREE_CARD 2 //三副扑克
//游戏结束标志定义
#define GF_NORMAL 10 //游戏正常结束
#define GF_SALE 11 //游戏安全结束
/******************************************************************************************************/
//扑克分析结构 (只用于服务器对比扑克)
struct CardAnalyseStruct
{
int iSignedCount; //单牌数目
int iDoubleCount; //对牌数目
int iThreeCount; //三条数目
int iDoubleTractorCount; //两对拖拉机数目
int iThreeTractorCount; //三条拖拉机数目
BYTE iCardHuaKind; //扑克花色
BYTE iBigSignedCard; //最大单牌
BYTE iLessSignedCard; //最小单牌
BYTE iDoubleArray[19]; //对牌数组
BYTE iThreeArray[13]; //三条数组
BYTE iDoubleTractorArray[54]; //两对拖拉机数组 (0 分割,长度,拖拉机数据)
BYTE iThreeTractorArray[48]; //三对拖拉机数组 (0 分割,长度,拖拉机数据)
};
//升级逻辑类 (支持 2 副和 3 副扑克)
class CUpGradeGameLogic
{
//变量定义
private:
BYTE m_iNTNum; //主牌数字
BYTE m_iNTHuaKind; //主牌花色
int m_iStation[5]; //相对位置(方块,梅花,红桃,黑桃,主牌)
//函数定义
public:
//构造函数
CUpGradeGameLogic(void);
//功能函数(公共函数)
public:
//设置主牌花色
void SetNTHuaKind(BYTE iNTHuaKind);
//获取主牌花色
inline BYTE GetNTHuaKind() { return m_iNTHuaKind; }
//设置主牌数字
inline void SetNTCardNum(BYTE iNTNum) { m_iNTNum=iNTNum; }
//获取主牌数字
inline BYTE GetNTCardNum() { return m_iNTNum; }
//获取扑克数字
inline int GetCardNum(BYTE iCard) { return (iCard&UG_VALUE_MASK)+1; }
//获取扑克花色
BYTE GetCardHuaKind(BYTE iCard, BOOL bTrueHua);
//排列扑克
BOOL SortCard(BYTE iCardList[], BOOL bUp[], int iCardCount);
//删除扑克
int RemoveCard(BYTE iRemoveCard[], int iRemoveCount, BYTE iCardList[], int iCardCount);
//辅助函数
public:
//是否单牌
inline BOOL IsOnlyOne(BYTE iCardList[], int iCardCount) { return iCardCount==1; };
//是否对牌
BOOL IsDouble(BYTE iCardList[], int iCardCount);
//是否三条
BOOL IsThree(BYTE iCardList[], int iCardCount);
//是否拖拉机逻辑
BOOL IsTrackorRule(BYTE iFirstCard, BYTE iNextCard);
//是否拖拉机(两条)
BOOL IsDoubleTrackor(BYTE iCardList[], int iCardCount);
//是否拖拉机(三条)
BOOL IsThreeTrackor(BYTE iCardList[], int iCardCount);
//是否甩牌
BOOL IsShowCard(BYTE iCardList[], int iCardCount);
//得到牌列花色
BYTE GetCardListHua(BYTE iCardList[], int iCardCount);
//获取牌型
BYTE GetCardShape(BYTE iCardList[], int iCardCount);
//获取扑克相对大小
int GetCardBulk(BYTE iCard, BOOL bExtVol);
//对比单牌
BOOL CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard);
//其他函数
public:
//获取扑克
BYTE GetCardFromHua(int iHuaKind, int iNum);
//查找分数
int FindPoint(BYTE iCardList[], int iCardCount);
//分析函数
BOOL AnalyseCard(BYTE iCardList[], int iCardCount, CardAnalyseStruct & Analyse);
//服务器专用函数
public:
//对比函数
int CompareCard(BYTE * iCardListArray[], int iCardCount);
//对比甩牌
int CompareShowCard(BYTE * iCardListArray[], int iCardCount);
//是否可以甩牌
BOOL CanShowCard(BYTE iOutCard[], int iOutCardCount, int iOutStation, BYTE * iCardArray[], int iCardArrayCount, BYTE iResultCard[], int & iResultCardCount);
//混乱扑克
BYTE RandCard(BYTE iCard[], int iCardCount);
//变化扑克格式
BOOL FixCardType(BYTE iCardList[], int iCardCount, CardAnalyseStruct & BaseAnalyse, CardAnalyseStruct & OutAnalyse);
//客户端函数
public:
//自动出牌函数
BOOL AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[], int iBaseCardCount, BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut);
//是否可以出牌
BOOL CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[], int iBaseCount, BYTE iHandCard[], int iHandCount);
//内部函数
private:
//清除 0 位扑克
int RemoveNummCard(BYTE iCardList[], int iCardCount);
//提取对牌函数
int TackOutDouble(BYTE iCardList[], int iCardCount, BYTE iDoubleBuffer[], BOOL bRemoveCard);
//提取两条拖拉机函数
int TackOutDoubleTrackor(BYTE iCardList[], int iCardCount, BYTE iDoubleBuffer[], BOOL bRemoveCard);
//提取三条函数
int TackOutThree(BYTE iCardList[], int iCardCount, BYTE iThreeBuffer[], BOOL bRemoveCard);
//提取三条拖拉机函数
int TackOutThreeTrackor(BYTE iCardList[], int iCardCount, BYTE iThreeBuffer[], BOOL bRemoveCard);
//提取同一花色扑克
int TackOutCardByHua(BYTE iCardList[], int iCardCount, BYTE iHuaKind, BYTE iCardBuffer[], BOOL bRemoveCard);
//查找最长的拖拉机
int MaxThreeTractorLong(BYTE iCardList[], int iCardCount, BYTE iTrackorBuffer[]);
//查找最长的拖拉机
int MaxDoubleTractorLong(BYTE iCardList[], int iCardCount, BYTE iTrackorBuffer[]);
};
//游戏桌类
class CServerGameDesk : public CGameDesk
{
protected:
//游戏基础数据
BYTE m_CardCount; //扑克数目(位变量)
//玩家设置数据
BYTE m_iLessCount; //最少游戏局数
BYTE m_iPlayCardCount; //游戏扑克数目
BYTE m_iBeginStation; //游戏开始位置
BYTE m_iEndStation; //游戏结束位置
BYTE m_iEnableWatch; //是否允许旁观
//运行状态变量
int m_PunishPoint[4]; //用户罚分
int m_iUpGradePeople; //庄家位置
BYTE m_iPlayNTNum[2]; //各玩家的主牌数目
BYTE m_iBeenPlayGame; //已经游戏的局数
BYTE m_iLeaveArgee; //离开同意标志
//反牌信息
int m_iNtPeople; //反牌玩家
BYTE m_iNtCardCount; //反牌牌数
//状态信息
BYTE m_iUserCardCount[4]; //用户手上扑克数目
BYTE m_iUserCard[4][45]; //用户手上的扑克
BYTE m_iBackCard[8]; //底牌列表
//运行信息
int m_iGamePoint; //用户游戏分数
int m_iOutCardPeople; //现在出牌用户
int m_iFirstOutPeople; //先出牌的用户
BYTE m_iBaseOutCount; //出牌的数目
BYTE m_iDeskCardCount[4]; //桌面扑克的数目
BYTE m_iDeskCard[4][39]; //桌面的扑克
//发牌数据
BYTE m_iSendCardPos; //发牌位置
CUpGradeGameLogic m_Logic; //游戏逻辑
//函数定义
public:
//构造函数
CServerGameDesk();
//析构函数
virtual ~CServerGameDesk();
//重载函数
public:
//游戏开始
virtual bool GameBegin(BYTE bBeginFlag);
//游戏结束
virtual bool GameFinish(BYTE bDeskStation, BYTE bCloseFlag);
//判断是否正在游戏
virtual bool IsPlayGame(BYTE bDeskStation);
//游戏数据包处理函数
virtual bool HandleNotifyMessage(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser);
//用户离开
//virtual BYTE UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo);
//重载纯虚函数
public:
//获取游戏状态信息
virtual bool OnGetGameStation(BYTE bDeskStation, UINT uSocketID, bool bWatchUser);
//重置游戏状态
virtual bool ReSetGameState(BYTE bLastStation);
//定时器消息
virtual bool OnTimer(UINT uTimerID);
//处理函数
public:
//用户设置游戏
BOOL UserSetGame(UserArgeeGame * pGameSet);
//发送扑克给用户
BOOL SendCard();
//用户反牌
BOOL UserNtCard(BYTE bDeskStation, int iHuaKind, int iCardCount);
//游戏开始
BOOL BeginPlayUpGrade();
//发送底牌
BOOL SendBackCard();
//用户上交底牌
BOOL UserGiveBackCard(BYTE bDeskStation, BYTE iBackCard[], int iCardCount);
//用户出牌
BOOL UserOutCard(BYTE bDeskStation, BYTE iOutCard[], int iCardCount);
//新一轮开始
BOOL NewPlayTurn(int iWiner);
//用户请求离开
BOOL UserHaveThing(BYTE bDeskStation, TCHAR * szMessage, int iLength);
//同意用户离开
BOOL ArgeeUserLeft(BYTE bDeskStation, BOOL bArgee);
//计算升级
int GetUpGrade(int iGamePoint, int iPlayCardCount);
};
/******************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -