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

📄 servermanage1.cpp

📁 原子,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			//LeaveResultStruct * pLeave=(LeaveResultStruct *)pNetHead;
			//return ArgeeUserLeft(bDeskStation,pLeave->bArgeeLeave);
		}
	}
	return __super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
}

//计算得分
int	CServerGameDesk::GetUpGrade(int iGamePoint, int iPlayCardCount)
{
	if (iPlayCardCount==2)
	{
		if (iGamePoint==0) return 3;
		else if (iGamePoint<40) return 2;
		else if (iGamePoint<80) return 1;
		else return -(iGamePoint-40)/40;
	}
	if (iPlayCardCount==3)
	{
		if (iGamePoint==0) return 3;
		else if (iGamePoint<60) return 2;
		else if (iGamePoint<120) return 1;
		else return -(iGamePoint-60)/60;
	}
	return 0;
}

//用户坐到游戏桌
//BYTE CServerGameDesk::UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo)
//{
//	if ((m_pUserInfo[bDeskStation]!=NULL)&&(m_bGameStation==GS_WAIT_ARGEE)&&(bDeskStation==0))
//	{
//		//更改数据
//		m_iDeskFlags=0;
//		m_bGameStation=GS_WAIT_SETGAME;
//
//		//发送大厅取消同意消息
//		RoomArgeeStruct RoomArgee;
//		RoomArgee.bDeskNO=m_iDeskIndex;
//		RoomArgee.bDeskStation=255;
//		m_pDataManage->m_SocketManage.BatchSendData(&RoomArgee,sizeof(RoomArgee),TRUE,MDM_ROOM_INFO,ASS_UNARGEE_INFO,0);
//	}
//	return CBase_GameDesk::UserSitDesk(bDeskStation,pUserInfo,bAdd);
//}

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

	//效验数据
	if (((pGameSet->iPlayCount<=0)||(pGameSet->iPlayCount>99))||
		(pGameSet->iBeginStation<2)||(pGameSet->iEndStation>14)||
		(pGameSet->iBeginStation>pGameSet->iEndStation)) 
		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_iBeenPlayGame=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::SendCard()
{
	if (m_iSendCardPos==((m_iPlayCardCount==2)?100:156)) //发牌完成
	{
		KillTimer(TIME_SEND_CARD);

		if (m_iNtPeople==-1)	//等待反牌
		{
			SetTimer(TIME_WAIT_NT,16000);
			NetMessageHead SendFinish;			
			for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,15);
			SendWatchData(m_bMaxPeople,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,0);
		}
		else 
		{
			SetTimer(TIME_WAIT_NT,6000);
			NetMessageHead SendFinish;
			for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,5);
			SendWatchData(m_bMaxPeople,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,0);			
		}

		return FALSE;
	}

	//继续发送扑克
	SendCardStruct SendCard;
	SendCard.iCard=m_iUserCard[m_iSendCardPos%4][m_iSendCardPos/m_bMaxPeople];
	SendGameData(m_iSendCardPos%4,&SendCard,sizeof(SendCard),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0);
	SendWatchData(m_iSendCardPos%4,&SendCard,sizeof(SendCard),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0);
	m_iUserCardCount[m_iSendCardPos%4]++;
	m_iSendCardPos++;

	return TRUE;
}

//用户反牌
BOOL CServerGameDesk::UserNtCard(BYTE bDeskStation, int iHuaKind, int iCardCount)
{
	if ((iHuaKind==UG_HEI_TAO)||(iHuaKind==UG_HONG_TAO)||(iHuaKind==UG_MEI_HUA)||(iHuaKind==UG_FANG_KUAI))
	{
		//效验数据
		if ((iCardCount<1)||(iCardCount>3)) return FALSE;

		//调整数据
		if (iCardCount<m_iNtCardCount) return TRUE;
		if (bDeskStation==m_iNtPeople)
		{
			if ((iHuaKind!=m_Logic.GetNTHuaKind())&&(iCardCount<=m_iNtCardCount)) return TRUE;
		}
		else
		{
			if (m_iNtCardCount==0)
			{
				iCardCount=1;
			}
			else if ((iCardCount>m_iNtCardCount)||(iHuaKind>m_Logic.GetNTHuaKind()))
			{
				iCardCount=m_iNtCardCount+(iHuaKind>m_Logic.GetNTHuaKind())?0:1;
				iCardCount=__min(iCardCount,3);
			}
			else return TRUE;
		}

		//设置数据
		m_iNtPeople=bDeskStation;
		m_iNtCardCount=iCardCount;
		m_Logic.SetNTHuaKind(iHuaKind);

		//发送消息
		ServerNtStruct ServerNt;
		ServerNt.bDeskStation=bDeskStation;
		ServerNt.iHuaKind=iHuaKind;
		for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&ServerNt,sizeof(ServerNt),MDM_GM_GAME_NOTIFY,ASS_NT_CARD,0);
		SendWatchData(m_bMaxPeople,&ServerNt,sizeof(ServerNt),MDM_GM_GAME_NOTIFY,ASS_NT_CARD,0);

		return TRUE;
	}
	return FALSE;
}

//发送底牌
BOOL CServerGameDesk::SendBackCard()
{
	BOOL bExtBack=FALSE;
	if (m_iUpGradePeople==-1)	//抢庄状态
	{
		m_iUpGradePeople=(m_iNtPeople==-1)?0:m_iNtPeople;
	}
	
	if (m_iNtPeople==-1)	//没有人反牌,分析主牌
	{
		bExtBack=TRUE;
		m_iNtPeople=m_iUpGradePeople;
		m_Logic.SetNTHuaKind(UG_HEI_TAO);
	}

	//保存数据
	m_bGameStation=GS_WAIT_BACK;
	::CopyMemory(&m_iUserCard[m_iUpGradePeople][m_iUserCardCount[m_iUpGradePeople]],
				 m_iBackCard,sizeof(BYTE)*((m_iPlayCardCount==2)?8:6));
	m_iUserCardCount[m_iUpGradePeople]+=((m_iPlayCardCount==2)?8:6);

	if (bExtBack==FALSE)
	{
		//发送状态信息
		BackStationStruct UserGiveBack;
		UserGiveBack.iNtPeople=m_iNtPeople;
		UserGiveBack.iGiveBackStation=m_iUpGradePeople;
		for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserGiveBack,sizeof(UserGiveBack),MDM_GM_GAME_NOTIFY,ASS_WAIT_BACK,0);
		SendWatchData(m_bMaxPeople,&UserGiveBack,sizeof(UserGiveBack),MDM_GM_GAME_NOTIFY,ASS_WAIT_BACK,0);

		//发送底牌信息
		BackCardStruct BackCard;
		BackCard.iBackCardCount=(m_iPlayCardCount==2)?8:6;
		::CopyMemory(BackCard.iBackCard,m_iBackCard,sizeof(BYTE)*BackCard.iBackCardCount);
		SendGameData(m_iUpGradePeople,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD,0);
		SendWatchData(m_iUpGradePeople,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD,0);
	}
	else	//发送底牌信息
	{
		BackCardExStruct BackCard;
		BackCard.iNtHua=m_Logic.GetNTHuaKind();
		BackCard.iGiveBackPeople=m_iUpGradePeople;
		BackCard.iBackCardCount=(m_iPlayCardCount==2)?8:6;
		::CopyMemory(BackCard.iBackCard,m_iBackCard,sizeof(BYTE)*BackCard.iBackCardCount);
		for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_EX,0);
		SendWatchData(m_bMaxPeople,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_EX,0);
	}

	return TRUE;
}

//用户上交底牌
BOOL CServerGameDesk::UserGiveBackCard(BYTE bDeskStation, BYTE iBackCard[], int iCardCount)
{
	if ((iCardCount!=((m_iPlayCardCount==2)?8:6))||(bDeskStation!=m_iUpGradePeople)) return FALSE;
	
	//记录数据
	::CopyMemory(m_iBackCard,iBackCard,sizeof(BYTE)*iCardCount);
	if (m_Logic.RemoveCard(iBackCard,iCardCount,m_iUserCard[bDeskStation],m_iUserCardCount[bDeskStation])==0) 
		return FALSE;
	m_iUserCardCount[bDeskStation]-=iCardCount;

	//发送结果消息
	BackCardStruct BackCard;
	BackCard.iBackCardCount=(m_iPlayCardCount==2)?8:6;
	::CopyMemory(BackCard.iBackCard,m_iBackCard,sizeof(BYTE)*BackCard.iBackCardCount);
	SendGameData(bDeskStation,&BackCard,sizeof(BackCardStruct),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_RES,0);
	SendWatchData(bDeskStation,&BackCard,sizeof(BackCardStruct),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_RES,0);

	//开始游戏
	BeginPlayUpGrade();

	return TRUE;
}

//游戏开始
BOOL CServerGameDesk::BeginPlayUpGrade()
{
	//设置数据
	m_bGameStation=GS_PLAY_GAME;
	m_iBaseOutCount=0;
	m_iOutCardPeople=m_iUpGradePeople;
	m_iFirstOutPeople=m_iUpGradePeople;
	m_iGamePoint=0;
	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));

	//排列扑克
	for (int i=0;i<4;i++) m_Logic.SortCard(m_iUserCard[i],NULL,m_iUserCardCount[i]);

	//发送游戏开始消息
	BeginPlayStruct Begin;
	Begin.iOutDeskStation=m_iOutCardPeople;
	for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&Begin,sizeof(Begin),MDM_GM_GAME_NOTIFY,ASS_GAME_PLAY,0);
	SendWatchData(m_bMaxPeople,&Begin,sizeof(Begin),MDM_GM_GAME_NOTIFY,ASS_GAME_PLAY,0);

	return TRUE;
}

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

	BOOL bShowFalse=FALSE;

	//记录数据
	if (bDeskStation==m_iFirstOutPeople)	//第一出牌者
	{
		//数据效验
		m_Logic.SortCard(iOutCard,NULL,iCardCount);
		BYTE iOutCardKind=m_Logic.GetCardShape(iOutCard,iCardCount);
		if (iOutCardKind==UG_ERROR_KIND) return FALSE;

		if (iOutCardKind==UG_SHOW_CARD)	 //判断甩牌
		{
			int iResultCount=0;
			BYTE iResultCard[39];
			BYTE * iCardArray[4];
			for (int i=0;i<4;i++) iCardArray[i]=m_iUserCard[i];
			if (m_Logic.CanShowCard(iOutCard,iCardCount,bDeskStation,iCardArray,m_iUserCardCount[0],iResultCard,iResultCount)==FALSE)
			{
				//甩牌不成功
				bShowFalse=TRUE;
				m_PunishPoint[bDeskStation]++;

				//设置数据包
				OutShowCardStruct ShowCardFalse;
				ShowCardFalse.iCardCount=iCardCount;
				ShowCardFalse.iResultCount=iResultCount;
				ShowCardFalse.bDeskStation=bDeskStation;
				::CopyMemory(ShowCardFalse.iCardList,iOutCard,iCardCount);
				::CopyMemory(&ShowCardFalse.iCardList[iCardCount],iResultCard,iResultCount);

				//设置数据
				iCardCount=iResultCount;
				::CopyMemory(iOutCard,iResultCard,sizeof(BYTE)*iResultCount);

				//发送消息
				int iSendSize=sizeof(ShowCardFalse)-sizeof(ShowCardFalse.iCardList)
							  +sizeof(BYTE)*(ShowCardFalse.iResultCount+ShowCardFalse.iCardCount);
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&ShowCardFalse,iSendSize,MDM_GM_GAME_NOTIFY,ASS_SHOW_CARD,0);
				SendWatchData(m_bMaxPeople,&ShowCardFalse,iSendSize,MDM_GM_GAME_NOTIFY,ASS_SHOW_CARD,0);
			}
		}
		m_iBaseOutCount=iCardCount;
	}
	else	//跟随出牌者
	{
		if (iCardCount!=m_iBaseOutCount) return FALSE;
		m_Logic.SortCard(iOutCard,NULL,iCardCount);
	}

	//删除扑克
	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_iOutCardPeople=(bDeskStation+1)%4;
	if (m_iOutCardPeople==m_iFirstOutPeople) m_iOutCardPeople=-1;

	if (bShowFalse==TRUE) return TRUE;

	//判断是否最后出牌
	if (m_iUserCardCount[bDeskStation]==0)
	{
		BatchOutCardMsg UserOut;
		for (int i=0;i<4;i++)
		{
			m_iUserCardCount[i]=0;
			m_iDeskCardCount[i]=iCardCount;
			if (i==bDeskStation)
			{
				::CopyMemory(m_iDeskCard[i],iOutCard,sizeof(BYTE)*iCardCount);
				::CopyMemory(&UserOut.iCardList[i*iCardCount],iOutCard,sizeof(BYTE)*iCardCount);
			}
			else
			{
				::CopyMemory(m_iDeskCard[i],m_iUserCard[i],sizeof(BYTE)*iCardCount);
				::CopyMemory(&UserOut.iCardList[i*iCardCount],m_iUserCard[i],sizeof(BYTE)*iCardCount);
			}
		}

		//设置数据信息
		UserOut.iCardCount=iCardCount;
		m_iOutCardPeople=-1;

		int iSendSize=sizeof(UserOut)-sizeof(UserOut.iCardList)+sizeof(BYTE)*iCardCount*4;
		for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_BATCH_OUT,0);
		SendWatchData(m_bMaxPeople,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_BATCH_OUT,0);
	}
	else
	{
		OutCardMsg UserOut;
		UserOut.bDeskStation=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);
	}

	//判断一轮是否结束
	if (m_iOutCardPeople==-1)
	{
		//计算胜利者
		BYTE * pUserOutCard[4];
		for (int i=0;i<4;i++) pUserOutCard[i]=m_iDeskCard[(m_iFirstOutPeople+4+i)%4];
		int iWiner=(m_Logic.CompareCard(pUserOutCard,m_iBaseOutCount)+m_iFirstOutPeople)%4;
		if ((iWiner!=m_iUpGradePeople)&&(iWiner!=(m_iUpGradePeople+2)%4))
		{
			//发送分数
			int iPoint=0;
			for (int i=0;i<4;i++) iPoint+=m_Logic.FindPoint(m_iDeskCard[i],m_iBaseOutCount);
			if (iPoint!=0)
			{
				m_iGamePoint+=iPoint;
				GamePointStruct GamePoint;
				GamePoint.iPoint=iPoint;
				for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
				SendWatchData(m_bMaxPeople,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
			}
		}

		if (m_iUserCardCount[bDeskStation]==0)	//最后一轮
		{
			if ((iWiner!=m_iUpGradePeople)&&(iWiner!=(m_iUpGradePeople+2)%4))
			{
				//计算底牌分数
				BYTE iCardKind=m_Logic.GetCardShape(m_iDeskCard[bDeskStation],m_iDeskCardCount[bDeskStation]);
				m_iGamePoint+=iCardKind*2*m_Logic.FindPoint(m_iBackCard,(m_iPlayCardCount==2)?8:6);
			}
			SetTimer(TIME_GAME_FINISH,5000);
		}
		else NewPlayTurn(iWiner);	//进行新一轮游戏

⌨️ 快捷键说明

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