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

📄 servermanage.cpp

📁 原子,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		m_iUserCardCount[bDeskStation] = 0;
		m_iCurMiCi++;
		m_iMiCiArr[bDeskStation] = m_iCurMiCi;
		m_iWinStation = bDeskStation;

		/////上半局如果双夹则结束此局,否则进行下半局
		if(!bFlagNextHalf)
		{	
			bool flag1,flag2;
			flag1 = (m_iMiCiArr[m_iUpGradePeople] > 0 && m_iMiCiArr[(m_iUpGradePeople+2)%4] > 0) &&
					((m_iUserCardCount[(m_iUpGradePeople+1)%4] != 0 && m_iUserCardCount[(m_iUpGradePeople+3)%4] != 0) ||
					(m_iCurScoresArr[(m_iUpGradePeople+1)%4] + m_iCurScoresArr[(m_iUpGradePeople+3)%4] < 60)
					);
			flag2 = (m_iMiCiArr[(m_iUpGradePeople+1)%4] > 0 && m_iMiCiArr[(m_iUpGradePeople+3)%4] > 0) &&
					((m_iUserCardCount[m_iUpGradePeople] != 0 && m_iUserCardCount[(m_iUpGradePeople+2)%4] != 0) ||
					(m_iCurScoresArr[m_iUpGradePeople] + m_iCurScoresArr[(m_iUpGradePeople+2)%4] < 60)
					);

			if (flag1 || flag2)
			{
				m_bDoubleClip = true;
				m_iDoubleWin = bDeskStation;

				SetTimer(TIME_GAME_FINISH,2000);
				return TRUE;
			}
			
			else	///进行下半局
			{	
				if ((m_iMiCiArr[m_iUpGradePeople] > 0 && m_iMiCiArr[(m_iUpGradePeople+2)%4] > 0) ||
					(m_iMiCiArr[(m_iUpGradePeople+1)%4] > 0 && m_iMiCiArr[(m_iUpGradePeople+3)%4] > 0)
					)
				{
					StartNextHalf();
					return TRUE;
				}
				
			}
		}
		if(bFlagNextHalf)	////下半局结束
		{
			if ((m_iMiCiArr[m_iUpGradePeople] > 0 && m_iMiCiArr[(m_iUpGradePeople+2)%4] > 0) ||
				(m_iMiCiArr[(m_iUpGradePeople+1)%4] > 0 && m_iMiCiArr[(m_iUpGradePeople+3)%4] > 0)
				)
			{	
				bFlagNextHalf = false;
				SetTimer(TIME_GAME_FINISH,2000);
				return TRUE;
			}
		}



	}


	NewPlayTurn(bDeskStation);

	m_iCurStation[m_iOutCardPeople] = 0;

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


		

	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;
			m_iCurStation[m_iOutCardPeople] = 0;

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


////开始下半局
void CServerGameDesk::StartNextHalf()
{	

	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;
	}
	
	ReSetGameState(GF_NORMAL);

	tagLastHalfStruct lastHalfInfo;
	lastHalfInfo.iScores[0] = m_iCurScoresArr[m_iUpGradePeople] + m_iCurScoresArr[(m_iUpGradePeople + 2) % 4];
	lastHalfInfo.iScores[1] = m_iCurScoresArr[(m_iUpGradePeople + 1) % 4] + m_iCurScoresArr[(m_iUpGradePeople + 3) % 4];
	int iFirst;
	for (int i = 0;i < 4;i++)	////下半局第一个出牌的人是上半局的“上游”
	{
		if (m_iMiCiArr[i] == 1) iFirst = i;
	}
	::strcpy(lastHalfInfo.szName,m_pUserInfo[iFirst]->m_UserData.szName);

	for (int i = 0;i < 4;i++) SendGameData(i,&lastHalfInfo,sizeof(lastHalfInfo),MDM_GM_GAME_NOTIFY,ASS_START_NEXT_HALF,0);
	SendWatchData(m_bMaxPeople,&lastHalfInfo,sizeof(lastHalfInfo),MDM_GM_GAME_NOTIFY,ASS_START_NEXT_HALF,0);

	bFlagNextHalf = true;

}


//用户请求离开
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_iStation[4]=500;
	for (int i=0;i<4;i++) m_iStation[i]=100*i;
}

//获取扑克花色
BYTE CUpGradeGameLogic::GetCardHuaKind(BYTE iCard, BOOL bTrueHua)
{ 
	int iHuaKind=(iCard&UG_HUA_MASK);
	return iHuaKind; 
}

//获取扑克大小 
int CUpGradeGameLogic::GetCardBulk(BYTE iCard, BOOL bExtVol)
{
	if ((iCard==0x4E)||(iCard==0x4F))
	{
		return bExtVol?(iCard-58):(iCard-61);	//大小鬼
	}

	int iCardNum=GetCardNum(iCard);

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

	//排序操作
	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]));
}


//获取牌型
BYTE CUpGradeGameLogic::GetCardShape(BYTE iCardList[], int iCardCount)
{
	
	return UG_ERROR_KIND;
}

//对比单牌
BOOL CUpGradeGameLogic::CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard)
{
	return TRUE;
}

//自动出牌函数
BOOL CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[], int iBaseCardCount,
									BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut)
{
	
	return TRUE;
}

//清除 0 位扑克
int CUpGradeGameLogic::RemoveNummCard(BYTE iCardList[], int iCardCount)
{
	int iRemoveCount=0;
	for (int i=0;i<iCardCount;i++)
	{
		if (iCardList[i]!=0) iCardList[i-iRemoveCount]=iCardList[i];
		else iRemoveCount++;
	}
	return iRemoveCount;
}

//混乱扑克
BYTE CUpGradeGameLogic::RandCard(BYTE iCard[], int iCardCount)
{
	static const BYTE m_CardArray[54]={
			0x01, 0x02 ,0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,		//方块 2 - A
			0x11, 0x12 ,0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,		//梅花 2 - A
			0x21, 0x22 ,0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,		//红桃 2 - A
			0x31, 0x32 ,0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,		//黑桃 2 - A
			0x4E, 0x4F};																		//小鬼,大鬼

	BYTE iSend=0,iStation=0,iCardList[162];
	srand((unsigned)time(NULL));
	
	for (int i=0;i<iCardCount;i+=54)
		::CopyMemory(&iCardList[i],m_CardArray,sizeof(m_CardArray));
	do
	{
		iStation=rand()%(iCardCount-iSend);
		iCard[iSend]=iCardList[iStation];
		iSend++;
		iCardList[iStation]=iCardList[iCardCount-iSend];
	} while (iSend<iCardCount);

	//for (int i=0;i<108;i++)
	//	::CopyMemory(&iCard[i],&m_CardArray[53],1);

	return iCardCount;
}

//删除扑克
int CUpGradeGameLogic::RemoveCard(BYTE iRemoveCard[], int iRemoveCount, BYTE iCardList[], int iCardCount)
{
	//检验数据
	if ((iRemoveCount>iCardCount)) return 0;

	//把要删除的牌置零
	int iDeleteCount=0;
	for (int i=0;i<iRemoveCount;i++)
	{
		for (int j=0;j<iCardCount;j++)
		{
			if (iRemoveCard[i]==iCardList[j])
			{
				iDeleteCount++;
				iCardList[j]=0;
				break;
			}
		}
	}
	RemoveNummCard(iCardList,iCardCount);
	if (iDeleteCount!=iRemoveCount) return 0;

	return iDeleteCount;
}

//查找分数
int CUpGradeGameLogic::FindPoint(BYTE iCardList[], int iCardCount)
{
	int iPoint=0,iNum=0;
	for (int i=0;i<iCardCount;i++)
	{
		iNum=GetCardNum(iCardList[i]);
		if (iNum==5) iPoint+=5;
		else if ((iNum==10)||(iNum==13)) iPoint+=10;
	}
	return iPoint;
}




//是否可以出牌
BOOL CUpGradeGameLogic::CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[], 
								   int iBaseCount, BYTE iHandCard[], int iHandCount)
{
	
	return TRUE;
}

⌨️ 快捷键说明

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