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

📄 upgradelogic.cpp

📁 这是用Windows编写的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 (IsOnlyOne(iCardList,iCardCount)) return UG_ONLY_ONE;//单牌
	if (IsDouble(iCardList,iCardCount)) return UG_DOUBLE;//对牌
	if (IsThree(iCardList,iCardCount)) return UG_THREE;//三同张
	if (IsThreeAndOne(iCardList,iCardCount)) return UG_THREE_AND_ONE;//三带一
	if (IsSingleContinue(iCardList,iCardCount)) return UG_SINGLE_CONTINUE;//单顺
	if (IsDoubleContinue(iCardList,iCardCount)) return UG_DOUBLE_CONTINUE;//双顺
	if (IsThreeContinue(iCardList,iCardCount)) return UG_THREE_CONTINUE;//三顺
	if (IsBomb(iCardList,iCardCount)) return UG_BOMB;//炸弹
	if (IsRocket(iCardList,iCardCount)) return UG_ROCKET;//火箭
	//if (IsPlaneAndWing(iCardList,iCardCount)) return UG_PLANE_AND_WING;//飞机带翅膀
	///if (IsFourAndTwo(iCardList,iCardCount)) return UG_FOUR_AND_TWO;//四带二
	
	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);*/
}

//自动出牌函数
bool CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[]/*手里的牌*/, BYTE iHandCardCount/*手里的牌的数量*/, BYTE iBaseCard[]/*上轮的牌*/, BYTE iBaseCardCount/*上轮的牌的数量*/,
									BYTE iResultCard[]/*要出的牌*/, int & iResultCardCount/*要出的牌的数量*/, BOOL bFirstOut)
{

	for(int j = 0; j <sizeof(iResultCard); j++)
	{
		iResultCard[j] = 0; 
	}
	
	BYTE IHandTmp[27];//建立临时扑克,重新排序 
	::CopyMemory(IHandTmp,iHandCard,sizeof(BYTE)*iHandCardCount);	
	SortCard(IHandTmp,NULL,iHandCardCount);//给临时扑克排序

	
		//CString OutStr="上轮的牌:";

//	for (int i=0;i<iBaseCardCount;i++)
//	{
//		OutStr.AppendFormat("0x%x,",iBaseCard[i]);
//	}
//	OutStr.AppendFormat("bFirstOut:%d",bFirstOut);
//AfxMessageBox(OutStr);
//


		//自动出牌
	if (bFirstOut==FALSE)	//跟随出牌者
	{    
		
			if (IsRocket(iBaseCard,iBaseCardCount)) return false;//上家是火箭
		
		BYTE iBaseKind = GetCardShape(iBaseCard,iBaseCardCount);//上家所出牌

			//上家牌饿类型
			switch(iBaseKind)
			{
			case UG_BOMB://炸弹
				{	
				for(int i = 0; i <  iHandCardCount - 3 ;i++)
				{

					if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]) )
					{

						if((GetCardNum(IHandTmp[i]) == GetCardNum(IHandTmp[i+1])) && (GetCardNum(IHandTmp[i])== GetCardNum(IHandTmp[i+2]))&& (GetCardNum(IHandTmp[i])== GetCardNum(IHandTmp[i+2]))) 
						{
							iResultCard[0] = IHandTmp[i];
							iResultCard[1] = IHandTmp[i-1];
							iResultCard[2] = IHandTmp[i-2];
							iResultCard[3] = IHandTmp[i-3];

							return true;
						}
					 }
				}
				return false;
			
             }

					
			case UG_ONLY_ONE://单牌
				{
					
					//for(int i = 0; i <  iHandCardCount;i++)
				
					for(int i=iHandCardCount;i>=0;i--)
					{
                        
						if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]))
						{
							
							iResultCard[0] = IHandTmp[i];
							iResultCardCount = 1;
							return true;
						}
						
					}
					break;
				}

			case UG_DOUBLE://对牌
				{
					
					//for(int i = 0; i <  iHandCardCount - 1 ;i++)
					for(int i=iHandCardCount;i>=0;i--)
					{
						
						
						if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]) )
						{
							
						
							if(GetCardNum(IHandTmp[i]) == GetCardNum(IHandTmp[i-1]))
							{
								iResultCard[0] = IHandTmp[i];
								iResultCard[1] = IHandTmp[i-1];
								iResultCardCount = 2;
								
								return true;
							}
								

							//return false;
							
						}
					}
					break;
				}

			case UG_THREE://三同张
				{
					
 					//for(int i = 0; i <  iHandCardCount - 2 ;i++)
					for (int i =iHandCardCount; i>1;i--) {
					}
					{
						
						if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]) )
						{
												
							if((GetCardNum(IHandTmp[i]) == GetCardNum(IHandTmp[i-1])) && (GetCardNum(IHandTmp[i])== GetCardNum(IHandTmp[i-2]))) 
							{
							iResultCard[0] = IHandTmp[i];
							iResultCard[1] = IHandTmp[i-1];
							iResultCard[2] = IHandTmp[i-2];
								
							return true;
							}
						}
					}
					break;
				}

			case UG_SINGLE_CONTINUE://单顺
				{
				/*	CString ss,s1;*/

					SortCard(IHandTmp,NULL,iHandCardCount);
					BYTE tempCard[13];
					int index = 0;
					tempCard[0] = IHandTmp[0];
					for(int i = 0; i< iHandCardCount ;)
					{	
					  while(GetCardNum(IHandTmp[i++]) == GetCardNum(IHandTmp[i+1])) ;
					 tempCard[index++] = IHandTmp[i-1];
							//s1.Format(" %0x ",IHandTmp[i-1]);
							//ss += s1;
					}
					for(int j = 0; j < (iHandCardCount - iBaseCardCount) ;j++)
					{
						//ss = "";
						for(int i = j; i < (j + iBaseCardCount);i++)
						{
							iResultCard[i-j] = tempCard[i];
							//s1.Format(" %0x ",tempCard[i]);
							//ss += s1;
						}
						iResultCardCount = iBaseCardCount;
						if(CanOutCard(iResultCard,iBaseCardCount,iBaseCard,iBaseCardCount,IHandTmp,iHandCardCount))
						return true;
					}
					break;

				}

			case UG_DOUBLE_CONTINUE://双顺
				{
					SortCard(IHandTmp,NULL,iHandCardCount);
					BYTE tempCard[27];
					int index = 0;
					for(int i = 0; i< iHandCardCount - 1;i++)
					{	
					  if(IHandTmp[i] == IHandTmp[i+1])
					  {
							tempCard[index++] = iHandCard[i];
							tempCard[index++] = iHandCard[i+1];
					  }
					 		
					}
					for(int j = 0; j < (iHandCardCount - iBaseCardCount) ;j++)
					{
						//ss = "";
						for(int i = j; i < (j + iBaseCardCount);i += 2)
						{
							iResultCard[i-j] = tempCard[i];
							iResultCard[i-j +1 ] = tempCard[i +1];
							//s1.Format(" %0x ",tempCard[i]);
							//ss += s1;
						}
						iResultCardCount = iBaseCardCount;
						if(CanOutCard(iResultCard,iBaseCardCount,iBaseCard,iBaseCardCount,IHandTmp,iHandCardCount))
						return true;
					}
					
					break;
				}

			case UG_THREE_CONTINUE://三顺
				{
				
					
				//提出三顺//				
				int iTakeCount=0,iStationPos=0;
				BYTE iTempCard[30];
				iTakeCount=TackThreeShun(IHandTmp,iHandCardCount,iTempCard,false);
				iHandCardCount -= iTakeCount;

⌨️ 快捷键说明

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