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

📄 servermanage.cpp

📁 原子,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 3 页
字号:

#include "StdAfx.h"
#include "ServerManage.h"


//构造函数
CServerGameDesk::CServerGameDesk(void):CGameDesk(FULL_BEGIN)
{
	//m_bQueryQuit=false;
m_bQueryQuit=true;//只要结束就退出
	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));

	::memset(m_iCurStation,0,sizeof(m_iCurStation));
	memset(m_iCurScoresArr,0,sizeof(m_iCurScoresArr));
	memset(m_iPlayRemainCardCnt,0,sizeof(m_iPlayRemainCardCnt));
}

//析构函数
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_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;
			GameStation.iVersion=7;
			GameStation.iVersion2=0;

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

			MessageStruct Mess;
			ZeroMemory(Mess.Message,200);
			strcpy(Mess.Message,"欢迎你参加原子游戏,祝你玩得开心,你的快乐就是我们的快乐!");
			SendGameData(bDeskStation,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);

			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:		//发牌状态
			{
			GameStation_3 GameStation;
			::memset(&GameStation,0,sizeof(GameStation));
			GameStation.iPlayCount=m_iLessCount;
			GameStation.iCardCount=m_iPlayCardCount;
			
			GameStation.iUpGradePeople=m_iUpGradePeople;		
			GameStation.iBeenPlayGame=m_iBeenPlayGame;		
			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.iUpGradePeople=m_iUpGradePeople;		
		
			GameStation.iBeenPlayGame=m_iBeenPlayGame;		
		
			GameStation.iOutCardPeople=m_iOutCardPeople;	
			GameStation.iFirstOutPeople=m_iFirstOutPeople;	
			GameStation.iBaseOutCount=m_iBaseOutCount;	
			GameStation.iDaoCard = m_iDaoCard;
			GameStation.bNextHalf = bFlagNextHalf;
			GameStation.iUserCardCount=m_iUserCardCount[bDeskStation];
			
			::CopyMemory(GameStation.iCurStation,m_iCurStation,sizeof(m_iCurStation));
			::CopyMemory(GameStation.iUserCardList,m_iUserCard[bDeskStation],sizeof(BYTE)*m_iUserCardCount[bDeskStation]);
			::CopyMemory(GameStation.iRemainCard,m_iPlayRemainCardCnt,sizeof(m_iPlayRemainCardCnt));
			::CopyMemory(GameStation.iUserPoint,m_iCurScoresArr,sizeof(m_iCurScoresArr));
			
			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.iUpGradePeople=m_iUpGradePeople;		
			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;
		
		::memset(m_iPlayNTNum,0,sizeof(m_iPlayNTNum));
		::memset(m_PunishPoint,0,sizeof(m_PunishPoint));
	}
	
	//m_bQueryQuit=false;
m_bQueryQuit=true;//只要结束就退出
	m_iLeaveArgee=0;
	m_iGamePoint=0;
	m_iBaseOutCount=0;
	m_iFirstOutPeople=-1;
	m_iOutCardPeople=-1;
	m_iNtPeople=-1;
	m_iNtCardCount=0;
	m_iSendCardPos=0;
	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_bQueryQuit=false;
m_bQueryQuit=true;//只要结束就退出
	m_iNtPeople=-1;
	m_iNtCardCount=0;
	m_iSendCardPos=0;

	m_iDoubleWin = -1;
	m_bDoubleClip = false;

	if (!bFlagNextHalf) m_iBeenPlayGame++;
	
	m_bGameStation=GS_SEND_CARD;
	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
	::memset(m_iUserCardCount,0,sizeof(m_iUserCardCount));
	
	m_iCurMiCi = 0;
	m_iCurScores = 0;
	memset(m_iCurScoresArr,0,sizeof(m_iCurScoresArr));
	::CopyMemory(m_iPlayRemainCardCnt,m_iUserCardCount,sizeof(m_iUserCardCount));

	
	//发送开始消息
	BeginUpgradeStruct BeginMessage;
		
	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];
	BYTE iCardArray[162];
	//m_Logic.RandCard(iCardArray,(m_iPlayCardCount==2)?108:162);
	m_Logic.RandCard(iCardArray,162);
	int index = rand() % 162;
	m_iDaoCard = iCardArray[index];////产生刀牌
	int iFirst;
	if (!bFlagNextHalf) iFirst = ((m_iDaoCard&UG_VALUE_MASK) + 1) % 4;	////每局第一个摸牌的人
	else 
	{
		for (int i = 0;i < 4;i++)	////下半局第一个摸牌的人是上半局的“上游”
		{
			if (m_iMiCiArr[i] == 1) iFirst = i;
		}
	}

	m_iFirstTouchCard = iFirst;

	::CopyMemory(m_iUserCard[iFirst],&iCardArray[0],sizeof(BYTE)*41);
	::CopyMemory(m_iUserCard[(iFirst+1)%4],&iCardArray[41],sizeof(BYTE)*41);
	::CopyMemory(m_iUserCard[(iFirst+2)%4],&iCardArray[82],sizeof(BYTE)*40);
	::CopyMemory(m_iUserCard[(iFirst+3)%4],&iCardArray[122],sizeof(BYTE)*40);
	

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

	return TRUE;
}

//游戏结束
bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag)
{
	//得到最小数的金币
	long m_dwMaxPoint=0;
	bool bSetMaxMoney=false;
	for (BYTE i=0;i<m_bMaxPeople;i++)
	{
		if (m_pUserInfo[i]!=NULL)
		{
			if (bSetMaxMoney==false)
			{
				bSetMaxMoney=true;
				m_dwMaxPoint=(long int)m_pUserInfo[i]->m_UserData.dwPoint-1;
			}
			else 
				m_dwMaxPoint=__min(m_dwMaxPoint,(long int)m_pUserInfo[i]->m_UserData.dwPoint-1);
		}
	}
	if(m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME && m_dwMaxPoint<0)
	{
		TRACE("出现错误,升级金币或比赛游戏中,玩家的金币数为负数.");
		return false;
	}

	//编写代码
	switch (bCloseFlag)
	{
	case GF_NORMAL:		//游戏正常结束
		{
			int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
			//计算得分
			int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);

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

			for(int i = 0;i < 3;i++) m_iBackCard[i] = 0x4E;
			::CopyMemory(GameEnd.iBackList,m_iBackCard,sizeof(m_iBackCard));

			
			//继续下一盘
			{
				//设置数据 
				m_bGameStation=GS_WAIT_NEXT;
				
				for (int i=0;i<m_bMaxPeople;i++)
				{
					if (m_pUserInfo[i]!=NULL) 
						m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
				}
			
				
				for (int i = 0;i < 4;i++)GameEnd.iTurePoint[i]=m_iTurePoint[i];
				
					
				
				if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME)
				{
					GameEnd.iTurePoint[0]*=iBasePoint;
					GameEnd.iTurePoint[1]*=iBasePoint;
					GameEnd.iTurePoint[2]*=iBasePoint;
					GameEnd.iTurePoint[3]*=iBasePoint;
					for (BYTE i=0;i<m_bMaxPeople;i++)
					{ 
						if(GameEnd.iTurePoint[i]<0)
							GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]);
						if (GameEnd.iTurePoint[i]>0)
						{
							GameEnd.iTurePoint[i]=__min(m_dwMaxPoint,GameEnd.iTurePoint[i]);
							//if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME)
								GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*19L/20L;
						}
					}
					
				}
			
				//写入数据库				
				for (int i=0;i<3;i++)
					ChangeUserPoint(m_pUserInfo[i],GameEnd.iTurePoint[i],GameEnd.iTurePoint[i]>0,GameEnd.iTurePoint[i]<0,GameEnd.iTurePoint[i]==0,false);

				//发送数据
				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);

				if (!bFlagNextHalf)
				{
					__super::GameFinish(bDeskStation,bCloseFlag);
				}
				if(m_bQueryQuit)
				{
					GameFinish(bDeskStation,GF_SALE);
				}
				ReSetGameState(bCloseFlag);
				
			}

			return true;
		}
	case GF_SALE:			//游戏安全结束
	case GFF_FORCE_FINISH:		//用户断线离开
		{
			int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
			//计算得分
			int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);
			//设置数据
			m_bGameStation=GS_WAIT_SETGAME;

			for (int i=0;i<m_bMaxPeople;i++)
			{
				if (m_pUserInfo[i]!=NULL) 
					m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
			}
			GameCutStruct CutEnd;
			CutEnd.bDeskStation=bDeskStation;
			if(bCloseFlag==GF_SALE)
			{
				CutEnd.iTurePoint[bDeskStation]=0;
				CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
				CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
				CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
			}
			else
			{
				//设置分数
				if (iTurePoint>0) m_iUpGradePeople=(m_iUpGradePeople+2)%4;
				else m_iUpGradePeople=(m_iUpGradePeople+1)%4;

				if(iTurePoint>-1)
				{
					CutEnd.iTurePoint[bDeskStation]=-15;
					CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
					CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
					CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
				}
				else
				{
					if(bDeskStation==m_iUpGradePeople || bDeskStation==(m_iUpGradePeople+2)%4)//如果将能升级,逃跑者不得分,他对家得分
					{
						CutEnd.iTurePoint[m_iUpGradePeople%4]=CutEnd.iTurePoint[(m_iUpGradePeople+2)%4]=abs(iTurePoint*3);
						CutEnd.iTurePoint[bDeskStation]=0;
						CutEnd.iTurePoint[(m_iUpGradePeople+1)%4]=CutEnd.iTurePoint[(m_iUpGradePeople+3)%4]=-abs(iTurePoint*3);
					}
					else
					{
						CutEnd.iTurePoint[bDeskStation]=-15;
						CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
						CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
						CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
					}
				}
			}

			//发送信息
			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
			{
				//计算金币类和比赛类的实得分

⌨️ 快捷键说明

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