⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servermanage1.h

📁 添七,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 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 + -