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

📄 servermanage.cpp

📁 添七,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	::memset(m_iMiCiArr,0,sizeof(m_iMiCiArr));
	::memset(m_iLastOneCard,0,sizeof(m_iLastOneCard));
	::memset(m_iKouCardCount,0,sizeof(m_iKouCardCount));
	for (int i=0;i<4;i++) m_iOutListCount[i] = 0;
	//::memset(m_iOutListCount,0,sizeof(m_iOutListCount));
	::memset(m_iOutCardList,0,sizeof(m_iOutCardList));
	::memset(m_iKouCard,0,sizeof(m_iKouCard));

	::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
	::memset(m_iTurePoint,0,sizeof(m_iTurePoint));
	m_iWinStation = 0;
	
	m_iCurMiCi = 0;
	m_iCurScores = 0;
	m_iFinishCard = 0;
	memset(m_iCurScoresArr,0,sizeof(m_iCurScoresArr));
	::CopyMemory(m_iPlayRemainCardCnt,m_iUserCardCount,sizeof(m_iUserCardCount));

	for (int i = 0;i < 4;i++) m_iMiCiArr[i] = -1;
	

	//排列扑克
	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);
	
	ModifyPlayInfo(-1,0);
	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;

	
	if (bShowFalse==TRUE) return TRUE;
	
	m_iOutCardPeople = (bDeskStation + 1) % 4;	///计算下一出牌者

	//判断是否最后出牌
	if (m_iUserCardCount[bDeskStation]==0)
	{
		
		m_iUserCardCount[bDeskStation] = 0;
		m_iCurMiCi++;
		m_iMiCiArr[bDeskStation] = m_iCurMiCi;
		m_iFinishCard++;
		m_iLastOneCard[bDeskStation] = iOutCard[0];
		/////是否结束
		if (m_iFinishCard == 4)
		{
						
			SetTimer(TIME_GAME_FINISH,2000);
			return TRUE;
		}

		
	}
		
	////存储出牌信息
	int iCardKind = m_Logic.GetCardHuaKind(iOutCard[0],FALSE);
	if (m_iKouCardFalg != 2)	///非扣牌
	{
		
	
		m_iOutCardList[iCardKind][m_iOutListCount[iCardKind]] = iOutCard[0];
		m_iOutListCount[iCardKind]++;
		
		for (int i = 0;i < 4;i++)
		{	
			if (m_iOutListCount[i] > 0)
			{
				for (int j = 0;j < m_iOutListCount[i] - 1;j++)
				{
					for (int k = j + 1;k < m_iOutListCount[i];k++)
					{	
						int pd1 = m_Logic.GetCardNum(m_iOutCardList[i][j]);
						int pd2 = m_Logic.GetCardNum(m_iOutCardList[i][k]);
						
						if (pd1 == 14) pd1 = 1;
						if (pd2 == 14) pd2 = 1;
						if (pd1 < pd2)
						{
							BYTE temp;
							temp = m_iOutCardList[i][j];
							m_iOutCardList[i][j] = m_iOutCardList[i][k];
							m_iOutCardList[i][k] = temp;
						}
					}
				}
			}
		}

		OutCardMsg UserOut;
		UserOut.bDeskStation=bDeskStation;
		UserOut.iNextDeskStation=m_iOutCardPeople;
		UserOut.iCardCount=iCardCount;
	
		///add
		::CopyMemory(UserOut.iOutListCount,m_iOutListCount,sizeof(UserOut.iOutListCount));
		::CopyMemory(UserOut.iAddOutList,m_iOutCardList[iCardKind],sizeof(BYTE)*m_iOutListCount[iCardKind]);
		
		for (int i = 0;i < 4;i++)
			::CopyMemory(UserOut.iOutCardList[i],m_iOutCardList[i],sizeof(BYTE)*m_iOutListCount[i]);
		///////
	

		::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,(int)m_iOutListCount[iCardKind]);
		SendWatchData(m_bMaxPeople,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,(int)m_iOutListCount[iCardKind]);

		return TRUE;
		
	}
	
	if (m_iKouCardFalg == 2)	///记录扣牌
	{
		m_iKouCard[bDeskStation][m_iKouCardCount[bDeskStation]] = iOutCard[0];
		m_iKouCardCount[bDeskStation]++;
	

		OutCardMsg UserOut;
		UserOut.bDeskStation=bDeskStation;
		UserOut.iNextDeskStation=m_iOutCardPeople;
		UserOut.iCardCount=iCardCount;
	
		
	///	::CopyMemory(UserOut.iOutListCount,m_iKouCardCount,sizeof(UserOut.iOutListCount));
		///::CopyMemory(UserOut.iAddOutList,m_iOutCardList[iCardKind],sizeof(BYTE)*m_iOutListCount[iCardKind]);
		
		//for (int i = 0;i < 4;i++)
		//	::CopyMemory(UserOut.iOutCardList[i],m_iKouCard[i],sizeof(BYTE)*m_iKouCardCount[i]);
		///////
	

		::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)
{

	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_iOutCardPeople == m_iLastOutPeople) m_iLastOutPeople = -1;
		if (m_iMiCiArr[m_iOutCardPeople] < 0)break;
	}
	if (m_iLastOutPeople < 0)
	{
		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);
				
				ModifyPlayInfo(-1,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++)
	{		
		playInfo.iScore[i] =m_iCurScoresArr[i];
		playInfo.iCardCnt[i] =m_iPlayRemainCardCnt[i];
		
	}
	for (int i = 0;i < 4;i++) SendGameData(i,&playInfo,sizeof(playInfo),MDM_GM_GAME_NOTIFY,ASS_MODIFY_PLAYINFO,0);
		
	SendWatchData(m_bMaxPeople,&playInfo,sizeof(playInfo),MDM_GM_GAME_NOTIFY,ASS_MODIFY_PLAYINFO,0);
	return;
}




//用户请求离开
bool CServerGameDesk::UserHaveThing(BYTE bDeskStation, char * szMessage)
{
	if (m_bGameStation<GS_SEND_CARD) return TRUE;

	m_iLeaveArgee|=1<<bDeskStation;
	if (m_iLeaveArgee!=15)
	{
		HaveThingStruct HaveThing;
		HaveThing.pos=bDeskStation;
		::CopyMemory(HaveThing.szMessage,szMessage,60*sizeof(char));
		for (int i=0;i<m_bMaxPeople;i++)
			if (i!=bDeskStation) SendGameData(i,&HaveThing,sizeof(HaveThing),MDM_GM_GAME_NOTIFY,ASS_HAVE_THING,0);
	}
	else GameFinish(bDeskStation,GF_SALE);

	return TRUE;
}

//同意用户离开
bool CServerGameDesk::ArgeeUserLeft(BYTE bDeskStation, BOOL bArgee)
{
	if (bArgee) m_iLeaveArgee|=1<<bDeskStation;
	else m_iLeaveArgee&=~1<<bDeskStation;
	if (m_iLeaveArgee!=15)
	{
		m_bQueryQuit=true;
		LeaveResultStruct Leave;
		Leave.bDeskStation=bDeskStation;
		Leave.bArgeeLeave=bArgee;
		for (int i=0;i<m_bMaxPeople;i++) 
			if (i!=bDeskStation) SendGameData(i,&Leave,sizeof(Leave),MDM_GM_GAME_NOTIFY,ASS_LEFT_RESULT,0);
	}
	else GameFinish(bDeskStation,GF_SALE);

	return TRUE;
}





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

// 升级逻辑类

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

//构造函数
CUpGradeGameLogic::CUpGradeGameLogic(void)
{
	m_iNTNum=0;
	m_iNTHuaKind=UG_ERROR_HUA;
	m_iStation[4]=500;
	for (int i=0;i<4;i++) m_iStation[i]=100*i;
}

//设置主牌花色
void CUpGradeGameLogic::SetNTHuaKind(BYTE iNTHuaKind)
{
	//设置数据
	m_iNTHuaKind=iNTHuaKind & UG_HUA_MASK;
	
	//调整相对位置
	for (int i=0;i<4;i++) m_iStation[i]=100*i;
	if (m_iNTHuaKind!=UG_ERROR_HUA) m_iStation[m_iNTHuaKind>>4]=400;
	if (m_iNTHuaKind==UG_MEI_HUA)
	{
		m_iStation[3]=200;
		m_iStation[2]=300;
	}
	else if (m_iNTHuaKind==UG_HONG_TAO)
	{
		m_iStation[0]=100;
		m_iStation[1]=0;
	}

	return;
}

//获取扑克花色
BYTE CUpGradeGameLogic::GetCardHuaKind(BYTE iCard, BOOL bTrueHua)
{ 
	if ((iCard&UG_HUA_MASK) == UG_FANG_KUAI) return 0;	////方块
	if ((iCard&UG_HUA_MASK) == UG_MEI_HUA) return 1;	///梅花
	if ((iCard&UG_HUA_MASK) == UG_HONG_TAO) return 2;	///红桃
	if ((iCard&UG_HUA_MASK) == UG_HEI_TAO) return 3;	//黑桃
	
	return 4;
}

//获取扑克大小 (2 - 18 , 15 以上是主牌 : 2 - 21 , 15 以上是主)
int CUpGradeGameLogic::GetCardBulk(BYTE iCard, BOOL bExtVol)
{
	if ((iCard==0x4E)||(iCard==0x4F))
	{
		return bExtVol?(iCard-58):(iCard-61);	//大小鬼
	}

	int iCardNum=GetCardNum(iCard);
	if (iCardNum==m_iNTNum)
	{
		int iHuaKind=GetCardHuaKind(iCard,TRUE);
		if (bExtVol)
		{
			if (iHuaKind==m_iNTHuaKind) return 19;
			return (iHuaKind>>4)+15;
		}
		return (iHuaKind==m_iNTHuaKind)?16:15;
	}

	return iCardNum;
}

//排列扑克
BOOL CUpGradeGameLogic::SortCard(BYTE iCardList[], BOOL bUp[], int iCardCount)
{
	BOOL bSorted=TRUE,bTempUp;
	int iTemp,iLast=iCardCount-1,iStationVol[45];

	//获取位置数值
	for (int i=0;i<iCardCount;i++)
	{
		iStationVol[i]=GetCardBulk(iCardList[i],TRUE);
		if (iStationVol[i]>=15) iStationVol[i]+=m_iStation[4];
		else iStationVol[i]+=m_iStation[GetCardHuaKind(iCardList[i],FALSE)>>4];
	}

	//排序操作
	do
	{
		bSorted=TRUE;
		for (int i=0;i<iLast;i++)
		{
			if (iStationVol[i]<iStationVol[i+1])
			{	
				//交换位置
				iTemp=iCardList[i];
				iCardList[i]=iCardList[i+1];
				iCardList[i+1]=iTemp;
				iTemp=iStationVol[i];
				iStationVol[i]=iStationVol[i+1];
				iStationVol[i+1]=iTemp;
				if (bUp!=NULL)
				{
					bTempUp=bUp[i];
					bUp[i]=bUp[i+1];
					bUp[i+1]=bTempUp;
				}
				bSorted=FALSE;
			}	
		}
		iLast--;
	} while(!bSorted);
		
	return TRUE;
}

//获取扑克
BYTE CUpGradeGameLogic::GetCardFromHua(int iHuaKind, int iNum)
{
	if (iHuaKind!=UG_ERROR_HUA) return (iHuaKind+iNum-1);
	return 0;
}

//是否对牌
BOOL CUpGradeGameLogic::IsDouble(BYTE iCardList[], int iCardCount)
{
	if (iCardCount!=2) return FALSE;
	return (iCardList[0]==iCardList[1]);
}

//是否三条
BOOL CUpGradeGameLogic::IsThree(BYTE iCardList[], int iCardCount)
{
	if (iCardCount!=3) return FALSE;
	return ((iCardList[0]==iCardList[1])&&(iCardList[0]==iCardList[2]));
}

⌨️ 快捷键说明

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