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

📄 upgradelogic.cpp

📁 添七,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 3 页
字号:
BOOL CUpGradeGameLogic::IsFourAndTwo(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 6) return FALSE;
	
	SortCard(iCardList,NULL,iCardCount);

	int iTempNum = -1;
	for (int i = 0;i < iCardCount - 3;i++)
	{
		if (GetCardNum(iCardList[i]) == GetCardNum(iCardList[i+3])) 
		{
			iTempNum = GetCardNum(iCardList[i]);
			break;
		}
	}

	if (iTempNum < 0) return FALSE;
	
	BYTE iTempCard[4];
	int iCnt = 0;

	for (int i = 0;i < iCardCount;i++)
	{
		if (iTempNum != GetCardNum(iCardList[i]))
		{
			iTempCard[iCnt++] = iCardList[i];
			continue;
		}
	}
	
	
	if (iCnt == 2) //四带2单牌
	{
		if (GetCardNum(iTempCard[0]) == GetCardNum(iTempCard[1])) return FALSE;

		BYTE iBackCard[6];
		int j = 0;
		for (int i = 0;i < iCardCount;i++)
		{
			if (GetCardNum(iCardList[i]) == iTempNum) iBackCard[j++] = iCardList[i];
		}
		iBackCard[4] = (GetCardNum(iTempCard[0]) > GetCardNum(iTempCard[1])) ? iTempCard[0] : iTempCard[1];
		::CopyMemory(iCardList,iBackCard,sizeof(iBackCard));
	}
	else if (iCnt == 4) //四带2对牌
	{
		if (!((IsDouble(iTempCard,2) && IsDouble(&iTempCard[2],2)) && (GetCardNum(iTempCard[0]) != GetCardNum(iTempCard[2])))) return FALSE;
		
		BYTE iBackCard[8];
		int j = 0;
		for (int i = 0;i < iCardCount;i++)
		{
			if (GetCardNum(iCardList[i]) == iTempNum) iBackCard[j++] = iCardList[i];
		}
		for (int i = 0;i < 4;i++)
		{
			iBackCard[j+i] = iTempCard[i];
		}
		::CopyMemory(iCardList,iBackCard,sizeof(iBackCard));
	}
	
	
	return TRUE;
}

//是否510K
BOOL CUpGradeGameLogic::Is510KBomb(BYTE iCardList[], int iCardCount)
{
	if (iCardCount != 3) return FALSE;

	bool h5 = false,
		 h10 = false,
		 hk = false;

	SortCard(iCardList,NULL,iCardCount);
	if (GetCardNum(iCardList[0]) == 13) hk = true;//13 Is K
	if (GetCardNum(iCardList[1]) == 10) h10 = true;
	if (GetCardNum(iCardList[2]) == 5) h5 =true;
	if (hk && h10 && h5) return TRUE;
	return FALSE;
}


//是否炸弹
BOOL CUpGradeGameLogic::IsBomb(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 4) return FALSE;

	int pd1 = GetCardNum(iCardList[0]);
	
	for (int i = 0;i < iCardCount;i++)
	{
		if (GetCardNum(iCardList[i]) != pd1) return FALSE;
		else continue;
	}

	return TRUE;
}

//是否火箭
BOOL CUpGradeGameLogic::IsRocket(BYTE iCardList[], int iCardCount)
{
	if (iCardCount != 4) return FALSE;
	SortCard(iCardList,NULL,iCardCount);
	return ((iCardList[0] == 0x4F)&&(iCardList[1] == 0x4F)&&(iCardList[2] == 0x4E)&&(iCardList[3] == 0x4E));
}

//是否同花
BOOL CUpGradeGameLogic::IsSameHua(BYTE iCardList[], int iCardCount)
{
	if (iCardCount <= 0) return FALSE;
	
	int iFirstHua = GetCardHuaKind(iCardList[0],FALSE);
	
	for (int i = 0;i < iCardCount;i++)
	{
		if (GetCardHuaKind(iCardList[i],FALSE) != iFirstHua) return FALSE;
		else continue;
	}

	return TRUE;
}


void CUpGradeGameLogic::SetCard(BYTE iCardList[], int iCardCount)
{
	if (iCardCount <= 0) return;
	ClearPSInfo();
	
	//add node
	for (int i = 0;i < iCardCount;i++)
	{
		int pd = GetCardNum(iCardList[i]);
		bool flag = false;

		for (POSITION pos = m_ptrPSList.GetHeadPosition();pos != NULL;)
		{
			PSTypeNode * ps = (PSTypeNode *) m_ptrPSList.GetNext(pos);
			if (!ps) continue;
			if (pd == ps->mps)
			{
				ps->mcount++;
				flag = true;
				break;
			}
		}

		if (!flag)
		{
			PSTypeNode * pn = new PSTypeNode();
			pn->mps = pd;
			pn->mcount = 1;
			m_ptrPSList.AddTail(pn);
		}
	}

	CPtrList temp;
	bool Is2In = false;

	for (POSITION pos = m_ptrPSList.GetHeadPosition();pos != NULL;)
	{
		PSTypeNode * pi = (PSTypeNode *) m_ptrPSList.GetNext(pos);
		if (!pi) continue;
		PSTypeNode *pn = new PSTypeNode();
		pn->mps = pi->mps;
		pn->mcount = pi->mcount;
		temp.AddTail(pn);
		if (pn->mps == 2) Is2In = true;
	}

	ClearPSInfo();
	//sort
	for (POSITION pos = temp.GetHeadPosition();pos != NULL;)
	{
		PSTypeNode *pi = (PSTypeNode *) temp.GetNext(pos);
		if (!pi) continue;
		PSTypeNode *pn = new PSTypeNode();
		pn->mps = pi->mps;
		pn->mcount = pi->mcount;

		if (m_ptrPSList.IsEmpty())
		{
			m_ptrPSList.AddTail(pn);
			continue;
		}

		bool bAdd = false;
		for (POSITION pos1 = m_ptrPSList.GetHeadPosition();pos1 != NULL;)
		{	
			POSITION tp = pos1;
			PSTypeNode *pii = (PSTypeNode *) m_ptrPSList.GetNext(pos1);
			if (!pii) continue;

			if ((pn->mcount > pii->mcount) || ((pn->mcount == pii->mcount) && (pn->mps > pii->mps))) 
			{
				m_ptrPSList.InsertBefore(tp,pn);
				bAdd = true;
				continue;
			}

		}

		if (!bAdd)
		{
			m_ptrPSList.AddTail(pn);
		}
	}

	while (!temp.IsEmpty())
	{
		PSTypeNode *ps = (PSTypeNode *) temp.RemoveHead();
		//delete ps;
	}
	temp.RemoveAll();

	if (Is2In)
	{
		PSTypeNode *pii = (PSTypeNode *) m_ptrPSList.RemoveHead();
		if (!pii) return;
		if (pii->mps == 14)//14为A
		{
			m_ptrPSList.AddTail(pii);
		}
		else
		{
			m_ptrPSList.AddHead(pii);
		}
	}

	return;
}



void CUpGradeGameLogic::ClearPSInfo()
{
	while (!m_ptrPSList.IsEmpty())
	{
		PSTypeNode *ps = (PSTypeNode *) m_ptrPSList.RemoveHead();
		//delete ps;
	}
	m_ptrPSList.RemoveAll();

	return;
}



//是否甩牌
BOOL CUpGradeGameLogic::IsShowCard(BYTE iCardList[], int iCardCount)
{
	return (GetCardListHua(iCardList,iCardCount)!=UG_ERROR_HUA);
}

//得到牌列花色
BYTE CUpGradeGameLogic::GetCardListHua(BYTE iCardList[], int iCardCount)
{
	int iHuaKind=GetCardHuaKind(iCardList[0],FALSE);
	if (GetCardHuaKind(iCardList[iCardCount-1],FALSE)!=iHuaKind) return UG_ERROR_HUA;
	return iHuaKind;
}

//获取牌型
BYTE CUpGradeGameLogic::GetCardShape(BYTE iCardList[], int iCardCount)
{
	if (iCardCount == 1) 
	{
		if (iCardList[0] == 0x36) return UG_ONLY_ONE;
	}
	
	return UG_ERROR_KIND;
}

//对比单牌
BOOL CUpGradeGameLogic::CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard)
{
	int iFirstNum = GetCardNum(iFirstCard);//上手牌
	int iNextNum  = GetCardNum(iNextCard);//本家牌

	if (iFirstCard == 0x4F) return FALSE;//大王
	if (iNextCard == 0x4F) return TRUE;

	if (iFirstCard == 0x4E) return FALSE;//小王
	if (iNextCard == 0x4E) return TRUE;

	if (iFirstNum == 2) return FALSE;//2
	if (iNextNum == 2) return TRUE;

	return ((iNextNum - iFirstNum) > 0 ? TRUE : FALSE);//其他

	/*int iFristHua=GetCardHuaKind(iFirstCard,FALSE);
	int iNextHua=GetCardHuaKind(iNextCard,FALSE);
	if (iFristHua!=iNextHua)
	{
		//不同花色对比
		if (iFristHua==UG_NT_CARD) return TRUE;
		return (iNextHua!=UG_NT_CARD);
	}
	
	//同花色对比
	return GetCardBulk(iFirstCard,FALSE)>=GetCardBulk(iNextCard,FALSE);*/
}

//自动出牌函数
int CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[][13], BYTE iBaseCardCount[],
									BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut)
{
		if (!bFirstOut)	///跟随出牌
		{
			
			bool bFindLiveCard = false;
			for (int i = 0;i < 4;i++)
			{	
				if (iBaseCardCount[i] <= 0) continue;
				int ph = GetCardNum(iBaseCard[i][0]);
				int pt = GetCardNum(iBaseCard[i][iBaseCardCount[i]-1]);
				if(ph < 0 || pt < 0) continue;

				if (ph == 13) ph = -1;	///首为K
				else ph++;

				if (pt == 14) pt = -1;	///尾为A
				else if (pt == 2) pt = 14;
				else pt--;

				for (int j = 0;j < iHandCardCount;j++)
				{
					int pi = GetCardNum(iHandCard[j]);
					if (pi == ph && GetCardHuaKind(iHandCard[j],FALSE) == GetCardHuaKind(iBaseCard[i][0],FALSE)|| 
						pi == pt && GetCardHuaKind(iHandCard[j],FALSE) == GetCardHuaKind(iBaseCard[i][0],FALSE) 
						)					
					{
						iResultCardCount = 1;
						iResultCard[0] = iHandCard[j];
						bFindLiveCard = true;
						return 1;
					}
				}
			}
			for (int i = 0;i < iHandCardCount;i++)
			{
				if (GetCardNum(iHandCard[i]) == 7) 
				{
					iResultCardCount = 1;
					iResultCard[0] = iHandCard[i];
					bFindLiveCard = true;
					return 1;
				}
			}

			if (!bFindLiveCard)
			{
				iResultCardCount=1;
				iResultCard[0]=iHandCard[iHandCardCount-1];
				return 2;
			}
			
		}

	
		else	///第一张出牌必须出黑桃7
		{
			iResultCardCount=1;
			iResultCard[0]=0x36;
			return 1;
		}
	 return 0;
}

//是否可以甩牌
BOOL CUpGradeGameLogic::CanShowCard(BYTE iOutCard[], int iOutCardCount, int iOutStation, 
									BYTE * iCardArray[], int iCardArrayCount, 
									BYTE iResultCard[], int & iResultCardCount)
{
	CardAnalyseStruct AnalyseOut;
	BYTE iTempCard[54],iSameHuaCard[39];
	int iTempCount=0,iOtherSameCount=0;

	AnalyseCard(iOutCard,iOutCardCount,AnalyseOut);
	for (int i=0;i<4;i++)
	{
		if (iOutStation==i) continue;

		//提取扑克
		iOtherSameCount=TackOutCardByHua(iCardArray[i],iCardArrayCount,AnalyseOut.iCardHuaKind,iSameHuaCard,FALSE);

		//分析三条拖拉机
		if (AnalyseOut.iThreeTractorCount!=0)
		{
			int iOutStation=0,iOtherStation=0,iCompOutCount=0,iCompOtherCount=0;
			iTempCount=TackOutThreeTrackor(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
			if (iTempCount!=0)
			{
				do
				{
					iOtherStation=0;
					iCompOtherCount=0;
					while (iCompOtherCount<iTempCount)
					{
						if ((AnalyseOut.iThreeTractorArray[iOutStation+1]<=iTempCard[iOtherStation+1])
							&&(CompareOnlyOne(AnalyseOut.iThreeTractorArray[iOutStation+2],iTempCard[0])==FALSE))
						{
							//甩牌失败
							iResultCardCount=AnalyseOut.iThreeTractorArray[iOutStation+1];
							::CopyMemory(iResultCard,&AnalyseOut.iThreeTractorArray[iOutStation+2],sizeof(BYTE)*iResultCardCount);
							return FALSE;
						}
						iCompOtherCount+=iTempCard[iOtherStation+1];
						iOtherStation+=iTempCard[iOtherStation+1]+2;
					}
					iCompOutCount+=AnalyseOut.iThreeTractorArray[iOutStation+1];
					iOutStation+=AnalyseOut.iThreeTractorArray[iOutStation+1]+2;
				} while (iCompOutCount<AnalyseOut.iThreeTractorCount);
			}
		}

		//分析两条拖拉机
		if (AnalyseOut.iDoubleTractorCount!=0)
		{
			int iOutStation=0,iOtherStation=0,iCompOutCount=0,iCompOtherCount=0;
			iTempCount=TackOutDoubleTrackor(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
			if (iTempCount!=0)
			{
				do
				{
					iOtherStation=0;
					iCompOtherCount=0;
					while (iCompOtherCount<iTempCount)
					{
						if ((AnalyseOut.iDoubleTractorArray[iOutStation+2]<=iTempCard[iOtherStation+2])
							&&(CompareOnlyOne(AnalyseOut.iDoubleTractorArray[iOutStation+2],iTempCard[2])==FALSE))
						{
							//甩牌失败
							iResultCardCount=AnalyseOut.iDoubleTractorArray[iOutStation+1];
							::CopyMemory(iResultCard,&AnalyseOut.iDoubleTractorArray[iOutStation+2],sizeof(BYTE)*iResultCardCount);
							return FALSE;
						}
						iCompOtherCount+=iTempCard[iOtherStation+1];
						iOtherStation+=iTempCard[iOtherStation+1]+2;
					}
					iCompOutCount+=AnalyseOut.iDoubleTractorArray[iOutStation+1];
					iOutStation+=AnalyseOut.iDoubleTractorArray[iOutStation+1]+2;
				} while (iCompOutCount<AnalyseOut.iDoubleTractorCount);
			}
		}
		
		//分析三条
		if (AnalyseOut.iThreeCount!=0)
		{
			iTempCount=TackOutThree(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
			if ((iTempCount!=0)&&(CompareOnlyOne(AnalyseOut.iThreeArray[AnalyseOut.iThreeCount-3],iTempCard[0])==FALSE))
			{
				//甩牌失败
				iResultCardCount=3;
				::CopyMemory(iResultCard,&AnalyseOut.iThreeArray[AnalyseOut.iThreeCount-3],sizeof(BYTE)*iResultCardCount);
				return FALSE;
			}
		}

		//分析对牌
		if (AnalyseOut.iDoubleCount!=0)
		{
			iTempCount=TackOutDouble(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
			if ((iTempCount!=0)&&(CompareOnlyOne(AnalyseOut.iDoubleArray[AnalyseOut.iDoubleCount-2],iTempCard[0])==FALSE))
			{
				//甩牌失败
				iResultCardCount=2;
				::CopyMemory(iResultCard,&AnalyseOut.iDoubleArray[AnalyseOut.iDoubleCount-2],sizeof(BYTE)*iResultCardCount);
				return FALSE;
			}
		}

		//分析单牌
		if ((AnalyseOut.iSignedCount!=0)&&(iOtherSameCount>0)&&
			(CompareOnlyOne(AnalyseOut.iLessSignedCard,iSameHuaCard[0])==FALSE))
		{
			//甩牌失败
			iResultCardCount=1;
			iResultCard[0]=AnalyseOut.iLessSignedCard;
			return FALSE;
		}
	}

	//甩牌成功
	iResultCardCount=iOutCardCount;
	::CopyMemory(iResultCard,iOutCard,sizeof(BYTE)*iResultCardCount);

	return TRUE;
}

//对比函数
int CUpGradeGameLogic::CompareCard(BYTE * iCardListArray[], int iCardCount)
{
	//排列扑克
	for (int i=0;i<4;i++) SortCard(iCardListArray[i],NULL,iCardCount);
	
	//对比处理
	int iWinner=0;
	int iCardShape=GetCardShape(iCardListArray[0],iCardCount);
	switch (iCardShape)
	{
		case UG_ONLY_ONE:
		case UG_DOUBLE:
		case UG_THREE: 
		case UG_DOUBLE_TRACKOR:
		case UG_THREE_TARCKOR:
			{
				for (int i=1;i<4;i++)
				{
					if ((GetCardShape(iCardListArray[i],iCardCount)==iCardShape)&&
					   (CompareOnlyOne(iCardListArray[iWinner][0],iCardListArray[i][0])==FALSE))
						iWinner=i;
				}
				return iWinner;
			}
		case UG_SHOW_CARD: return CompareShowCard(iCardListArray,iCardCount);
	}

⌨️ 快捷键说明

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