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

📄 servermanage.cpp

📁 这是用Windows编写的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						if(GameEnd.iTurePoint[i]<0)
							GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]);
						if (GameEnd.iTurePoint[i]>=100)
						{
								GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*49L/50L;
						}
					}
					
				}
			
				//写入数据库				
				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(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
			{
				//设置分数


					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
			{
				//计算金币类和比赛类的实得分
				if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME)
				{
					CutEnd.iTurePoint[0]*=iBasePoint;
					CutEnd.iTurePoint[1]*=iBasePoint;
					CutEnd.iTurePoint[2]*=iBasePoint;
					CutEnd.iTurePoint[3]*=iBasePoint;
					for (BYTE i=0;i<m_bMaxPeople;i++)
					{
						if(CutEnd.iTurePoint[i]>0)
							CutEnd.iTurePoint[i]=__min(m_dwMaxPoint,CutEnd.iTurePoint[i]);
						if(CutEnd.iTurePoint[i]<0)
							CutEnd.iTurePoint[i]=__max(-m_dwMaxPoint,CutEnd.iTurePoint[i]);
						if (CutEnd.iTurePoint[i]>=100)
						{
								CutEnd.iTurePoint[i]=CutEnd.iTurePoint[i]*49L/50L;
						}
					}
				}
				
				for (int i=0;i<4;i++)
					ChangeUserPoint(m_pUserInfo[i],CutEnd.iTurePoint[i],CutEnd.iTurePoint[i]>0,CutEnd.iTurePoint[i]<0,CutEnd.iTurePoint[i]==0,(bDeskStation==i && CutEnd.iTurePoint[i]<0));

				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);
			}

			bCloseFlag=GFF_FORCE_FINISH;

			ReSetGameState(bCloseFlag);
			__super::GameFinish(bDeskStation,bCloseFlag);
			return true;
		}
	}

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

	return true;
}

 

//用户离开游戏桌
BYTE CServerGameDesk::UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo)
{
	if ((m_pUserInfo[bDeskStation]!=NULL)&&(m_bGameStation==GS_WAIT_ARGEE)&&(bDeskStation==0))
	{
		//更改数据
		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;
		}
	}
	else if(m_bGameStation==GS_WAIT_SETGAME && (m_pUserInfo[bDeskStation]!=NULL) && m_iBeenPlayCount>0)
	{
		GameFinish(0,GF_SALE);
	}
	return __super::UserLeftDesk(bDeskStation,pUserInfo);
}

//游戏数据包处理函数
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_OUT_CARD:		//用户出牌
		{
			if(bWatchUser)
				return false;
			if(m_bGameStation==GS_WAIT_NEXT || m_bGameStation==GS_WAIT_ARGEE || m_bGameStation==GS_WAIT_SETGAME)
				return true;
			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)==1);
		}
	//case ASS_HAVE_THING:	//有事请求离开
	//	{
	//		if(bWatchUser)
	//			return false;
	//		HaveThingStruct * pThing=(HaveThingStruct *)pData;
	//		return (UserHaveThing(bDeskStation,pThing->szMessage)==1);
	//	}
	//case ASS_LEFT_RESULT: //同意用户离开
	//	{
	//		if(bWatchUser)
	//			return false;
	//		LeaveResultStruct * pLeave=(LeaveResultStruct *)pData;
	//		return (ArgeeUserLeft(bDeskStation,pLeave->bArgeeLeave)==1);
	//	}
	//case ASS_STOP_THING:
	//	{
	//		if(bWatchUser)
	//			return false;
	//		SendGameData((bDeskStation+2)%4,MDM_GM_GAME_NOTIFY,ASS_STOP_THING,0);
	//		return true;
	//	}
	//case ASS_AGREE_STOP:
	//	{
	//		if(bWatchUser)
	//			return false;
	//		StopResultStruct * pStop=(StopResultStruct *)pData;
	//		if(pStop->bArgee==1)
	//		{
	//			//同意
	//			StopResultStruct stop;
	//			stop.bArgee=true;
	//			SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0);

	//			MessageStruct Mess;
	//			memset(&Mess,0,sizeof(Mess));
	//			strcpy(Mess.Message,"敌家经过商量,提前结束了本局!");
	//			SendGameData((bDeskStation+1)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
	//			SendGameData((bDeskStation+3)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);

	//			memset(&Mess,0,sizeof(Mess));
	//			strcpy(Mess.Message,"拣分的双方经过商量,提前结束了本局!");
	//			SendWatchData(m_bMaxPeople,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
	//			//结束游戏
	//			if (m_bGameStation==GS_PLAY_GAME) 
	//				GameFinish(0,GF_NORMAL);
	//		}
	//		else
	//		{
	//			StopResultStruct stop;
	//			stop.bArgee=false;
	//			SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0);
	//		}
	//		return true;
	//	}

	case ASS_PASS://不出
		{
			if (bWatchUser) return false;
			if(m_bGameStation==GS_WAIT_NEXT || m_bGameStation==GS_WAIT_ARGEE || m_bGameStation==GS_WAIT_SETGAME)
				return true;
			
			
			NewPlayTurn(bDeskStation);
			if (!IsNewTurn)
			{
				for (int i=0;i<m_bMaxPeople;i++) 
					SendGameData(i,MDM_GM_GAME_NOTIFY,ASS_PASS,m_iOutCardPeople);
				SendWatchData(m_bMaxPeople,MDM_GM_GAME_NOTIFY,ASS_PASS,m_iOutCardPeople);
			}

			return true;
		}

		
	}
	return __super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
}

//计算得分
int	CServerGameDesk::GetUpGrade(int iGamePoint, int iPlayCardCount)
{
		
	m_iTurePoint[m_iWinStation] = 12;
	m_iTurePoint[(m_iWinStation+1)%4] = -4;
	m_iTurePoint[(m_iWinStation+2)%4] = -4;
	m_iTurePoint[(m_iWinStation+3)%4] = -4;

	return 0;
}

//用户设置游戏
BOOL CServerGameDesk::UserSetGame(UserArgeeGame * pGameSet)
{
	//效验数据
	if (m_bGameStation!=GS_WAIT_SETGAME) return FALSE;

	//效验数据
	if (((pGameSet->iPlayCount<=0)||(pGameSet->iPlayCount>99))) 
		return FALSE;
	if ((m_CardCount & pGameSet->iCardCount)==0) return FALSE;

	//设置数据
	m_iLessCount=pGameSet->iPlayCount;
	m_iPlayCardCount=(pGameSet->iCardCount&1)?2:3;
	//m_iBeginStation=pGameSet->iBeginStation;
	//m_iEndStation=pGameSet->iEndStation;
	m_iBeenPlayCount=0;

	
	m_bGameStation=GS_WAIT_ARGEE;
	//m_Logic.SetNTCardNum(pGameSet->iBeginStation);
	//m_Logic.SetNTHuaKind(UG_ERROR_HUA);
	//m_iPlayNTNum[0]=pGameSet->iBeginStation;
	//m_iPlayNTNum[1]=pGameSet->iBeginStation;

	//发送消息
	UserArgeeGame Agree;
	//Agree.iBeginStation=m_iBeginStation;
	//Agree.iEndStation=m_iEndStation;
	Agree.iPlayCount=m_iLessCount;
	Agree.iCardCount=m_iPlayCardCount;
	for (int i=0;i<4;i++) SendGameData(i,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);
	SendWatchData(m_bMaxPeople,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);

	return TRUE;
}


//用户反牌
//bool CServerGameDesk::UserNtCard(BYTE bDeskStation, int iHuaKind, int iCardCount)
//{
//	
//	return FALSE;
//}
//
////发送底牌
//BOOL CServerGameDesk::SendBackCard()
//{
//	
//	return TRUE;
//}

//用户上交底牌
//bool CServerGameDesk::UserGiveBackCard(BYTE bDeskStation, BYTE iBackCard[], int iCardCount)
//{
//	
//	return TRUE;
//}


//用户出牌
bool CServerGameDesk::UserOutCard(BYTE bDeskStation, BYTE iOutCard[], int iCardCount)
{
	if (bDeskStation!=m_iOutCardPeople) return FALSE;

	BOOL bShowFalse=FALSE;

	//记录数据
	
	//删除扑克
	if (m_Logic.RemoveCard(iOutCard,iCardCount,m_iUserCard[bDeskStation],m_iUserCardCount[bDeskStation])==0)
		return FALSE;
	m_iUserCardCount[bDeskStation]-=iCardCount;//用户手上扑克数目

	//记录出牌信息
	m_iDeskCardCount[bDeskStation]=iCardCount;
	::CopyMemory(m_iDeskCard[bDeskStation],iOutCard,sizeof(BYTE)*iCardCount);

	////记下当前出牌用户
	m_iLastOutPeople = bDeskStation;
	m_iCurScores += m_Logic.FindPoint(iOutCard,iCardCount);

	//计算下一出牌者
	///m_iOutCardPeople=(bDeskStation+1)%3;
	//测试
	//if (m_iOutCardPeople==m_iFirstOutPeople) m_iOutCardPeople=-1;
	///if (bShowFalse==TRUE) return TRUE;

	if (m_iUserCardCount[bDeskStation] == 0)
	{		
		m_iUserCardCount[bDeskStation] = 0;
		m_iCurMiCi++;
		m_iMiCiArr[bDeskStation] = m_iCurMiCi;
		m_iWinStation = bDeskStation;

GameFinish(0,GF_NORMAL);
		return TRUE;


	}


	NewPlayTurn(bDeskStation);

	OutCardMsg UserOut;
	UserOut.bDeskStation=bDeskStation;//当前出牌者
	UserOut.iLessCardCount=m_iUserCardCount[bDeskStation];
	UserOut.iNextDeskStation=m_iOutCardPeople;
	UserOut.iCardCount=iCardCount;
	::CopyMemory(UserOut.iCardList,iOutCard,sizeof(BYTE)*iCardCount);
	int iSendSize=sizeof(UserOut)-sizeof(UserOut.iCardList)+sizeof(BYTE)*iCardCount;
	for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
	SendWatchData(m_bMaxPeople,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);


		

	return TRUE;
}

//新一轮开始
BOOL CServerGameDesk::NewPlayTurn(BYTE bDeskStation)
{
	//AfxMessageBox("新一轮开始"); 
	int iWiner;
	int lastOutPeople = m_iLastOutPeople;
	IsNewTurn = false;
	m_iOutCardPeople = bDeskStation;
	for (int i = 0;i < 3;i++)
	{
		//计算下一出牌者
		m_iOutCardPeople = (m_iOutCardPeople + 1) % 4;
		if (m_iMiCiArr[m_iOutCardPeople] < 0)break;
	}

	if (m_iLastOutPeople ==m_iOutCardPeople)
	{		
		if (lastOutPeople >= 0)
		{
		
			m_iCurScoresArr[lastOutPeople] += m_iCurScores;
			m_iBaseOutCount=0;
			//m_iOutCardPeople=m_iOutCardPeople;
			m_iFirstOutPeople=m_iOutCardPeople;
			iWiner = m_iOutCardPeople;
			::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
			for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,MDM_GM_GAME_NOTIFY,ASS_NEW_TURN,iWiner);
			SendWatchData(m_bMaxPeople,MDM_GM_GAME_NOTIFY,ASS_NEW_TURN,iWiner);
			IsNewTurn = true;

			
			
			if (m_iCurScores != 0)
			{
				m_iGamePoint+=m_iCurScores;
				GamePointStruct GamePoint;
				GamePoint.iPoint=m_iCurScores;
				GamePoint.bAdd=true;
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,iWiner);
				SendWatchData(m_bMaxPeople,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
				
				
			}
				m_iCurScores = 0;
		
			
		}
	}
	
	return TRUE;
}


//void CServerGameDesk::ModifyPlayInfo(BYTE bDeskStation, int iCardCount)
//{
//	if (bDeskStation >= 0) m_iPlayRemainCardCnt[bDeskStation] -= iCardCount;
//
//	tagPlayInfoStruct playInfo;
//	for (int i=0;i<4;i++)

⌨️ 快捷键说明

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