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

📄 servermanage1.cpp

📁 原子,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "StdAfx.h"
#include "ServerManage.h"


//构造函数
CServerGameDesk::CServerGameDesk(void):CGameDesk(FULL_BEGIN)
{
	m_iEnableWatch=0;
	m_iLeaveArgee=0;
	m_iNtCardCount=0;
	m_iLessCount=0;
	m_iPlayCardCount=0;
	m_iBeginStation=0;
	m_iEndStation=0;
	m_iBaseOutCount=0;
	m_iNtPeople=-1;
	m_iFirstOutPeople=-1;
	m_iOutCardPeople=-1;
	m_iUpGradePeople=-1;
	m_iBeenPlayGame=0;
	m_iGamePoint=0;
	m_bGameStation=GS_WAIT_SETGAME;
	m_CardCount=PLAY_TWO_CARD;
	::memset(&m_PunishPoint,0,sizeof(m_PunishPoint));
	::memset(m_iPlayNTNum,0,sizeof(m_iPlayNTNum));
	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
}

//析构函数
CServerGameDesk::~CServerGameDesk(void)
{
}

//定时器消息
bool CServerGameDesk::OnTimer(UINT uTimerID)
{
	if (uTimerID==TIME_SEND_CARD)	//发牌定时器
	{
		if (m_bGameStation==GS_SEND_CARD) SendCard();
		else KillTimer(TIME_SEND_CARD);
		return TRUE;
	}
	if (uTimerID==TIME_WAIT_NT)		//反牌定时器
	{
		if (m_bGameStation==GS_SEND_CARD) SendBackCard();
		KillTimer(TIME_WAIT_NT);
		return TRUE;
	}
	if (uTimerID==TIME_GAME_FINISH)	//结束定时器
	{
		KillTimer(TIME_GAME_FINISH);
		if (m_bGameStation==GS_PLAY_GAME) GameFinish(0,GF_NORMAL);
	}
	return __super::OnTimer(uTimerID);
}

//获取游戏状态信息
bool CServerGameDesk::OnGetGameStation(BYTE bDeskStation, UINT uSocketID, bool bWatchUser)
{
	switch (m_bGameStation)
	{
	case GS_WAIT_SETGAME:		//游戏没有开始状态
		{
			GameStation_1 GameStation;
			::memset(&GameStation,0,sizeof(GameStation));
			GameStation.iCardCount=m_CardCount;

			//发送数据
			SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,sizeof(GameStation));

			return TRUE;
		}
	case GS_WAIT_ARGEE:			//等待玩家开始状态
		{
			GameStation_2 GameStation;
			::memset(&GameStation,0,sizeof(GameStation));
			GameStation.iPlayCount=m_iLessCount;
			GameStation.iCardCount=m_iPlayCardCount;
			GameStation.iBeginStation=m_iBeginStation;
			GameStation.iEndStation=m_iEndStation;

			//发送数据
			SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,sizeof(GameStation));
			return TRUE;
		}
	case GS_SEND_CARD:		//发牌状态
	case GS_WAIT_BACK:		//等待埋底牌状态
		{
			GameStation_3 GameStation;
			::memset(&GameStation,0,sizeof(GameStation));
			GameStation.iPlayCount=m_iLessCount;
			GameStation.iCardCount=m_iPlayCardCount;
			GameStation.iBeginStation=m_iBeginStation;
			GameStation.iEndStation=m_iEndStation;
			GameStation.iWinPoint=m_iPlayNTNum[bDeskStation%2]-m_iBeginStation;			
			GameStation.iPunishPoint=m_PunishPoint[bDeskStation];			
			GameStation.iUpGradePeople=m_iUpGradePeople;		
			GameStation.iPlayNTNum[0]=m_iPlayNTNum[0];		
			GameStation.iPlayNTNum[1]=m_iPlayNTNum[1];		
			GameStation.iBeenPlayGame=m_iBeenPlayGame;		
			GameStation.iNtPeople=m_iNtPeople;			
			GameStation.iNtCardCount=m_iNtCardCount;			
			GameStation.iNtHua=m_Logic.GetNTHuaKind();
			GameStation.iUserCardCount=m_iUserCardCount[bDeskStation];		
			::CopyMemory(GameStation.iUserCard,m_iUserCard[bDeskStation],sizeof(BYTE)*m_iUserCardCount[bDeskStation]);

			//发送数据
			int iSendSize=sizeof(GameStation)-sizeof(GameStation.iUserCard)+sizeof(BYTE)*m_iUserCardCount[bDeskStation];
			SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,iSendSize);
			return TRUE;
		}
	case GS_PLAY_GAME:	//游戏中状态
		{
			GameStation_4 GameStation;
			::memset(&GameStation,0,sizeof(GameStation));
			GameStation.iPlayCount=m_iLessCount;
			GameStation.iCardCount=m_iPlayCardCount;
			GameStation.iBeginStation=m_iBeginStation;
			GameStation.iEndStation=m_iEndStation;
			GameStation.iWinPoint=m_iPlayNTNum[bDeskStation%2]-m_iBeginStation;			
			GameStation.iPunishPoint=m_PunishPoint[bDeskStation];			
			GameStation.iUpGradePeople=m_iUpGradePeople;		
			GameStation.iPlayNTNum[0]=m_iPlayNTNum[0];		
			GameStation.iPlayNTNum[1]=m_iPlayNTNum[1];		
			GameStation.iBeenPlayGame=m_iBeenPlayGame;		
			GameStation.iNtPeople=m_iNtPeople;			
			GameStation.iNtCardCount=m_iNtCardCount;			
			GameStation.iNtHua=m_Logic.GetNTHuaKind();
			GameStation.iGamePoint=m_iGamePoint;
			GameStation.iOutCardPeople=m_iOutCardPeople;	
			GameStation.iFirstOutPeople=m_iFirstOutPeople;	
			GameStation.iBaseOutCount=m_iBaseOutCount;	
			GameStation.iUserCardCount=m_iUserCardCount[bDeskStation];
			::CopyMemory(GameStation.iUserCardList,m_iUserCard[bDeskStation],sizeof(BYTE)*m_iUserCardCount[bDeskStation]);
			int iPos=GameStation.iUserCardCount;
			for (int i=0;i<4;i++)
			{
				GameStation.iDeskCardCount[i]=m_iDeskCardCount[i];
				::CopyMemory(&GameStation.iUserCardList[iPos],m_iDeskCard[i],sizeof(BYTE)*m_iDeskCardCount[i]);
				iPos+=m_iDeskCardCount[i];
			}

			//发送数据
			int iSendSize=sizeof(GameStation)-sizeof(GameStation.iUserCardList)+sizeof(BYTE)+iPos;
			SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,iSendSize);
			return TRUE;
		}
	case GS_WAIT_NEXT:		//等待下一盘游戏开始
		{
			GameStation_5 GameStation;
			::memset(&GameStation,0,sizeof(GameStation));
			GameStation.iPlayCount=m_iLessCount;
			GameStation.iCardCount=m_iPlayCardCount;
			GameStation.iBeginStation=m_iBeginStation;
			GameStation.iEndStation=m_iEndStation;
			GameStation.iWinPoint=m_iPlayNTNum[bDeskStation%2]-m_iBeginStation;			
			GameStation.iPunishPoint=m_PunishPoint[bDeskStation];			
			GameStation.iUpGradePeople=m_iUpGradePeople;		
			GameStation.iPlayNTNum[0]=m_iPlayNTNum[0];		
			GameStation.iPlayNTNum[1]=m_iPlayNTNum[1];		
			GameStation.iBeenPlayGame=m_iBeenPlayGame;		

			//发送数据
			SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,sizeof(GameStation));
			return TRUE;
		}
	}
	return false;
}

//重置游戏状态
bool CServerGameDesk::ReSetGameState(BYTE bLastStation)
{
	KillTimer(TIME_SEND_CARD);
	KillTimer(TIME_WAIT_NT);
	KillTimer(TIME_GAME_FINISH);

	if ((bLastStation==GFF_FORCE_FINISH)||(bLastStation==GF_SALE))
	{
		m_iLessCount=0;
		m_iPlayCardCount=0;
		m_iBeginStation=0;
		m_iEndStation=0;
		m_iBeenPlayGame=0;
		m_iUpGradePeople=-1;
		m_Logic.SetNTCardNum(0);
		::memset(m_iPlayNTNum,0,sizeof(m_iPlayNTNum));
		::memset(m_PunishPoint,0,sizeof(m_PunishPoint));
	}

	m_iLeaveArgee=0;
	m_iGamePoint=0;
	m_iBaseOutCount=0;
	m_iFirstOutPeople=-1;
	m_iOutCardPeople=-1;
	m_iNtPeople=-1;
	m_iNtCardCount=0;
	m_iSendCardPos=0;
	m_Logic.SetNTHuaKind(UG_ERROR_HUA);
	memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
	memset(m_iUserCardCount,0,sizeof(m_iUserCardCount));

	return TRUE;
}

//游戏开始
bool CServerGameDesk::GameBegin(BYTE bBeginFlag)
{
	if (__super::GameBegin(bBeginFlag)==false) return false;

	//设置状态
	m_iNtPeople=-1;
	m_iNtCardCount=0;
	m_iSendCardPos=0;
	m_iBeenPlayGame++;
	m_Logic.SetNTHuaKind(UG_ERROR_HUA);
	m_bGameStation=GS_SEND_CARD;
	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
	::memset(m_iUserCardCount,0,sizeof(m_iUserCardCount));

	//发送开始消息
	BeginUpgradeStruct BeginMessage;
	BeginMessage.iNtStation=m_Logic.GetNTCardNum();
	BeginMessage.iStation[0]=m_iPlayNTNum[0];
	BeginMessage.iStation[1]=m_iPlayNTNum[1];
	BeginMessage.iPlayCount=m_iBeenPlayGame;
	BeginMessage.iUpgradeStation=m_iUpGradePeople;
	for (int i=0;i<4;i++) SendGameData(i,&BeginMessage,sizeof(BeginMessage),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);
	SendWatchData(m_bMaxPeople,&BeginMessage,sizeof(BeginMessage),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);

	//分发扑克
	BYTE iCardArray[162];
	m_Logic.RandCard(iCardArray,(m_iPlayCardCount==2)?108:162);
	for (int i=0;i<4;i++)
		::CopyMemory(m_iUserCard[i],&iCardArray[((m_iPlayCardCount==2)?25:39)*i],sizeof(BYTE)*((m_iPlayCardCount==2)?25:39));
	::CopyMemory(m_iBackCard,&iCardArray[(m_iPlayCardCount==2)?100:156],sizeof(BYTE)*((m_iPlayCardCount==2)?8:6));

	//发牌消息
	SetTimer(TIME_SEND_CARD,200);

	return TRUE;
}

//游戏结束
bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag)
{
	//编写代码
	switch (bCloseFlag)
	{
	case GF_NORMAL:		//游戏正常结束
		{
			//计算得分
			int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);

			//计算胜利
			if (iTurePoint>0) m_iPlayNTNum[m_iUpGradePeople%2]+=iTurePoint;
			else if (iTurePoint<=-1) m_iPlayNTNum[(m_iUpGradePeople+1)%2]+=(-iTurePoint-1);

			//游戏结束
			GameEndStruct GameEnd;
			::memset(&GameEnd,0,sizeof(GameEnd));
			GameEnd.iUpGradeStation=m_iUpGradePeople;
			GameEnd.iGamePoint=m_iGamePoint;
			::CopyMemory(GameEnd.iBackList,m_iBackCard,sizeof(m_iBackCard));

			if ((m_iBeenPlayGame>=m_iLessCount)||(m_iPlayNTNum[0]>m_iEndStation)||(m_iPlayNTNum[1]>m_iEndStation))
			{
				//设置数据
				bCloseFlag=GFF_FORCE_FINISH;
				m_bGameStation=GS_WAIT_SETGAME;

				//计算总得分
				int iWinPoint[2];
				iWinPoint[0]=(m_iPlayNTNum[0]-m_iBeginStation)+(m_iPlayNTNum[0]-m_iPlayNTNum[1])*2;
				iWinPoint[1]=(m_iPlayNTNum[1]-m_iBeginStation)+(m_iPlayNTNum[1]-m_iPlayNTNum[0])*2;

				//写入数据库				
				for (int i=0;i<4;i++)
					ChangeUserPoint(m_pUserInfo[i],iWinPoint[i%2],iWinPoint[i%2]>0,iWinPoint[i%2]<0,iWinPoint[i%2]==0,false);

				//发送消息
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_NO_CONTINUE_END,0);
				SendWatchData(m_bMaxPeople,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_NO_CONTINUE_END,0);
			}
			else	//继续下一盘
			{
				//设置数据 
				m_bGameStation=GS_WAIT_NEXT;
				if (iTurePoint>0) m_iUpGradePeople=(m_iUpGradePeople+2)%4;
				else m_iUpGradePeople=(m_iUpGradePeople+1)%4;
				m_Logic.SetNTCardNum(m_iPlayNTNum[m_iUpGradePeople%2]);

				//设置分数
				GameEnd.iTurePoint[0]=GameEnd.iTurePoint[2]=(m_iPlayNTNum[m_iUpGradePeople%2]-m_iBeginStation)+(m_iPlayNTNum[m_iUpGradePeople%2]-m_iPlayNTNum[(m_iUpGradePeople+1)%2])*2;
				GameEnd.iTurePoint[1]=GameEnd.iTurePoint[3]=(m_iPlayNTNum[(m_iUpGradePeople+1)%2]-m_iBeginStation)+(m_iPlayNTNum[(m_iUpGradePeople+1)%2]-m_iPlayNTNum[m_iUpGradePeople%2])*2;
			
				//发送数据
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
				SendWatchData(m_bMaxPeople,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
			}

			break;
		}
	case GF_SALE:			//游戏安全结束
	case GFF_FORCE_FINISH:		//用户断线离开
		{
			//设置数据
			m_bGameStation=GS_WAIT_SETGAME;

			//计算总得分
			int iWinPoint[2];
			iWinPoint[0]=m_iPlayNTNum[0]*3-m_iBeginStation-m_iPlayNTNum[1]*2;
			iWinPoint[1]=m_iPlayNTNum[1]*3-m_iBeginStation-m_iPlayNTNum[0]*2;

			GameCutStruct CutEnd;
			CutEnd.bDeskStation=bDeskStation;

			//写入数据库				
			for (int i=0;i<4;i++)
				ChangeUserPoint(m_pUserInfo[i],iWinPoint[i%2],iWinPoint[i%2]>0,iWinPoint[i%2]<0,iWinPoint[i%2]==0,true);

			//发送信息
			if (bCloseFlag==GF_SALE)
			{
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
				SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
			}
			else
			{
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0);
				SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0);
			}
			break;
		}
	}

	//重置数据
	ReSetGameState(bCloseFlag);
	__super::GameFinish(bDeskStation,bCloseFlag);
	return true;
}

//判断是否正在游戏
bool CServerGameDesk::IsPlayGame(BYTE bDeskStation)
{
	return __super::IsPlayGame(bDeskStation);
}

//游戏数据包处理函数
bool CServerGameDesk::HandleNotifyMessage(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
	switch (pNetHead->bAssistantID)
	{
	case ASS_GM_AGREE_GAME:		//用户同意游戏
		{
			if (bWatchUser) return FALSE;
			if ((bDeskStation==0)&&(m_bGameStation==GS_WAIT_SETGAME))	//东家设置
			{
				if (uSize!=sizeof(UserArgeeGame)) return FALSE;
				UserArgeeGame * pGameSet=(UserArgeeGame *)pData;
				if (!UserSetGame(pGameSet)) return FALSE;
				__super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
				return TRUE;
			}
			//其他玩家
			if ((m_bGameStation!=GS_WAIT_ARGEE)&&(m_bGameStation!=GS_WAIT_NEXT)) return TRUE;
			return __super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
		}
	case ASS_NT_CARD:			//用户反牌消息
		{
			if ((bWatchUser)||(uSize!=sizeof(ClientNtStruct))) return FALSE;
			if (m_bGameStation!=GS_SEND_CARD) return TRUE;
			ClientNtStruct * pNt=(ClientNtStruct *)pData;
			return UserNtCard(bDeskStation,pNt->iHuaKind,pNt->iCardCount);
		}
	case ASS_BACK_CARD:			//用户上交底牌
		{
			if (uSize!=sizeof(BackCardStruct)) return FALSE;
			if (m_bGameStation!=GS_WAIT_BACK) return FALSE;
			BackCardStruct * pBackCard=(BackCardStruct *)pData;
			return UserGiveBackCard(bDeskStation,pBackCard->iBackCard,pBackCard->iBackCardCount);
		}
	case ASS_OUT_CARD:		//用户出牌
		{
			OutCardStruct * pOutCard=(OutCardStruct *)pData;
			if ((uSize<=(sizeof(OutCardStruct)-sizeof(pOutCard->iCardList)))
				||(uSize>sizeof(OutCardStruct))||bWatchUser) return FALSE;
			if (uSize!=(sizeof(OutCardStruct)-sizeof(pOutCard->iCardList)+sizeof(BYTE)*pOutCard->iCardCount)) return FALSE;
			return UserOutCard(bDeskStation,pOutCard->iCardList,pOutCard->iCardCount);
		}
	case ASS_HAVE_THING:	//有事请求离开
		{
			return true;
			//HaveThingStruct * pThing=(HaveThingStruct *)pNetHead;
			//if ((uSize<=(sizeof(HaveThingStruct)-sizeof(pThing->szMessage)))
			//	||(uSize>sizeof(HaveThingStruct))||bWatchUser) return FALSE;
			//if (uSize!=(sizeof(HaveThingStruct)-sizeof(pThing->szMessage)+sizeof(BYTE)*pThing->iMsgLength)) return FALSE;
			//pThing->szMessage[pThing->iMsgLength-1]=0;
			//return UserHaveThing(bDeskStation,pThing->szMessage,pThing->iMsgLength);
		}
	case ASS_LEFT_RESULT: //同意用户离开
		{
			return true;
			//if ((uSize!=sizeof(LeaveResultStruct))||bWatchUser) return FALSE;

⌨️ 快捷键说明

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