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

📄 servermanage.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 PLAY_TWO_CARD				1				//两副扑克
#define PLAY_THREE_CARD				2				//三副扑克

//游戏结束标志定义
#define GF_NORMAL					10				//游戏正常结束
#define GF_SALE						11				//游戏安全结束

/******************************************************************************************************/

//原子逻辑类 
class CUpGradeGameLogic
{
	//变量定义
private:
	
	int						m_iStation[5];						//相对位置(方块,梅花,红桃,黑桃,主牌)

	//函数定义
public:
	//构造函数
	CUpGradeGameLogic(void);

	//功能函数(公共函数)
public:
	
	//获取扑克数字
	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);
    //获取牌型
	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);


	//服务器专用函数
public:
	
	//混乱扑克
	BYTE RandCard(BYTE iCard[], int iCardCount);
	
	//客户端函数
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);

};
 

//游戏桌类
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[3];						//底牌列表

	//运行信息
	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;							//游戏逻辑
	bool					m_bQueryQuit;						//有玩家请求退出
		
	int						m_iLastOutPeople;
	bool					IsNewTurn;
	bool					IsDoubleKou;//是否双扣

	int						m_iWinStation;//赢家
	int						m_iTurePoint[4];//游戏得分
	
	int						m_iMiCiArr[4];
	int						m_iCurScoresArr[4];
	int						m_iCurScores;
	int						m_iCurMiCi;

	BYTE					m_iPlayRemainCardCnt[4];

	BYTE					m_iCurStation[4];//当前游戏状态(出或过给旁观)

	bool bFlagNextHalf;	////进行下办局标志

	BYTE m_iDaoCard;	///存储刀牌
	int m_iFirstTouchCard;	////存储第一个摸牌的人
	int m_iFirstPerOut;	///每局第一个出牌人
	bool m_bDoubleClip;	///是否双夹
	int m_iDoubleWin;///双夹获胜的赢家


	//函数定义
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 BeginPlayUpGrade();
	//用户出牌
	bool UserOutCard(BYTE bDeskStation, BYTE iOutCard[], int iCardCount);
	//新一轮开始
	BOOL NewPlayTurn(BYTE bDeskStation);
	//用户请求离开
	bool UserHaveThing(BYTE bDeskStation, char * szMessage);
	//同意用户离开
	bool ArgeeUserLeft(BYTE bDeskStation, BOOL bArgee);
	//计算升级
	int	GetUpGrade(int iGamePoint, int iPlayCardCount);
	//更新用户分数牌数信息
	void ModifyPlayInfo(BYTE bDeskStation,int iCardCount);
	////开始下半局
	void StartNextHalf(void);	
};

/******************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -