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

📄 upgradelogic.cpp

📁 这是用Windows编写的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				for(int i=0;i <= (iTakeCount-iBaseCardCount);i += 3)
				{//循环手里的牌

					for(int j=0;j<iBaseCardCount;j += 3)
					{

						iResultCard[iBaseCardCount - j -1]=iTempCard[iTakeCount-(i+j)-1];//选出扑克	
						iResultCard[iBaseCardCount - (j+1) - 1]=iTempCard[iTakeCount-(i+j)-2];//选出扑克
						iResultCard[iBaseCardCount - (j+2) - 1]=iTempCard[iTakeCount-(i+j)-3];//选出扑克

					}

					iResultCardCount = iBaseCardCount;
					if (CanOutCard(iResultCard,iResultCardCount,iBaseCard,iBaseCardCount,IHandTmp,iHandCardCount))//如果能出牌
					{	
						  return true;
					}

				}

					break;
				}
			}
			//如果手里有炸弹
			for(int i = 0; i <  iHandCardCount - 3 ;i++)
			{// AfxMessageBox("进入炸弹循环");

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

			
					//提取火箭
		if ((IHandTmp[0] == 0x4F)&&(IHandTmp[1] == 0x4E)){
			iResultCard[0] =IHandTmp[0];
			iResultCard[1] =IHandTmp[1];
			iResultCardCount=2;
			return true;
			}



	
	}
	else //第一个出牌者
	{
 

			for(int i=iHandCardCount;i>=0;i--)
					{
                        
						if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]))
						{
							
							iResultCard[0] = IHandTmp[i];
							iResultCardCount = 1;
							return true;
						}
						
					} 

		//iResultCardCount=1;
		//iResultCard[0]=IHandTmp[iHandCardCount-1];
	}
	return false;
}

//是否可以甩牌
BOOL CUpGradeGameLogic::CanShowCard(BYTE iOutCard[], int iOutCardCount, int iOutStation, 
									BYTE * iCardArray[], int iCardArrayCount, 
									BYTE iResultCard[], int & 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;
			}
	}

	return -1;
}





//清除 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;
}


//删除扑克
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;
}


//
////获取牌型
//bool CUpGradeGameLogic::bCanFirstChu(BYTE iCardList[], int iCardCount)
//{
//	SortCard(iCardList,NULL,iCardCount); //!!!!!!!!增加  顺序重排 
//	int firstpd=-1;
//	
//	if (IsRocket(iCardList,iCardCount)) return true;//火箭
//
//	CCardParserDDZ p(iCardList, iCardCount,m_bLaiZiPaiDian);
//	
//	if (p.Is1 ( firstpd)) return true;//单牌
//	if (p.Is2 ( firstpd)) return true;//对牌
//	
//	if (p.Is3 ( firstpd)) return true;//三同张
//	if (p.IsBomb  ( firstpd)) return true;//炸弹
//
//	if((iCardList[0]!=0x4F)&&(iCardList[0]!=0x4E)&&(iCardList[0]!=0x01)&&(iCardList[0]!=0x11)&&(iCardList[0]!=0x21)&&(iCardList[0]!=0x31)){
//	if (p.Is1s(firstpd)) return true;//单顺
//		}
// 
//
//
//	if (p.Is2s ( firstpd)) return true;//双顺
//	if (p.Is3s ( firstpd)) return true;//三顺
//
//	if (p.Is3s1s ( firstpd) || p.Is3s2s ( firstpd)) return true;//三带一//////////////////
//	if (p.Is4s1s1s ( firstpd) || p.Is4s2s ( firstpd)|| p.Is4s2d ( firstpd)) return true;//四带二///////////////
//
//
//
//	return false;
//}



//是否可以出牌!!!!!!!!!!!!!!!!!!!!!!
BOOL CUpGradeGameLogic::CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[], 
								   int iBaseCount, BYTE iHandCard[], int iHandCount)
{
	//获取扑克类型
	BYTE iBaseKind = GetCardShape(iBaseCard,iBaseCount);//上家所出牌
	BYTE iOutKind  = GetCardShape(iOutCard,iOutCount);//本家所出牌
	
	//判断是否与这轮的出牌参数敏合
	//火箭
	//if (iBaseKind == UG_ROCKET) return FALSE;
	//if (iOutKind == UG_ROCKET) return TRUE;

	//炸弹
	if ((iBaseKind == UG_BOMB) && (iOutKind == iBaseKind))//都出炸弹
	{	
		if (iOutCount < iBaseCount) return FALSE;
		if (iOutCount > iBaseCount) return TRUE;
		return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
	}
	if (iBaseKind == UG_BOMB) return FALSE;
	if (iOutKind == UG_BOMB) return TRUE;


	//其他类型
	if (iOutKind != iBaseKind) return FALSE;
	switch(iBaseKind)
	{
	case UG_ONLY_ONE://单牌
		{	
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	case UG_DOUBLE://对牌
		{
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	case UG_THREE://三同张
		{
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	case UG_THREE_AND_ONE://三带一
		{
			if (iOutCount != iBaseCount) return FALSE;
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	case UG_SINGLE_CONTINUE://单顺
		{	
			if (iOutCount != iBaseCount) return FALSE;
			//if (GetCardNum(iBaseCard[0]) == GetCardNum(iOutCard[0]))
			//{
			//	if (IsSameHua(iBaseCard,iBaseCount) && IsSameHua(iOutCard,iOutCount))//同花顺无大小比较
			//		return FALSE;
			//	if (IsSameHua(iBaseCard,iBaseCount)) return FALSE;
			//	if (IsSameHua(iOutCard,iOutCount)) return TRUE;
			//}
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	case UG_DOUBLE_CONTINUE://双顺
		{
			if (iOutCount != iBaseCount) return FALSE;
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	case UG_THREE_CONTINUE://三顺
		{
			if (iOutCount != iBaseCount) return FALSE;
			return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
		}

	//case UG_PLANE_AND_WING://飞机带翅膀
	//	{
	//		if (iOutCount != iBaseCount) return FALSE;
	//		return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
	//	}
	
	}
	
	return FALSE;

}

//查找分数
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::AnalyseCard(BYTE iCardList[], int iCardCount, CardAnalyseStruct & Analyse)
{
	//初始化数据
	::memset(&Analyse,0,sizeof(Analyse));

	//判断是否同花色
	Analyse.iCardHuaKind=GetCardListHua(iCardList,iCardCount);
	if (Analyse.iCardHuaKind==UG_ERROR_HUA) return FALSE;

	//分析临时数据
	//BYTE iTempCard[39]; //!!!!
			//BYTE iTempCard[52];  
		BYTE iTempCard[54];  //需要修改
	::CopyMemory(iTempCard,iCardList,sizeof(BYTE)*iCardCount);

	//去除一张扑克的分析过程
	if (iCardCount==1) 
	{
		Analyse.iSignedCount=1;
		Analyse.iLessSignedCard=iCardList[0];
		return TRUE;
	}

	//提取三条
	Analyse.iThreeCount=TackOutThree(iTempCard,iCardCount,Analyse.iThreeArray,TRUE);
	iCardCount-=Analyse.iThreeCount;
	
	//提取三条拖拉机
	//Analyse.iThreeTractorCount=TackOutThreeTrackor(Analyse.iThreeArray,Analyse.iThreeCount,
	//						   Analyse.iThreeTractorArray,TRUE);
	//Analyse.iThreeCount-=Analyse.iThreeTractorCount;

	//提取对牌
	Analyse.iDoubleCount=TackOutDouble(iTempCard,iCardCount,Analyse.iDoubleArray,TRUE);
	iCardCount-=Analyse.iDoubleCount;

	////提取两条拖拉机
	//Analyse.iDoubleTractorCount=TackOutDoubleTrackor(Analyse.iDoubleArray,Analyse.iDoubleCount,
	//						    Analyse.iDoubleTractorArray,TRUE);
	//Analyse.iDoubleCount-=Analyse.iDoubleTractorCount;

	//提取单牌
	if (iCardCount>0)
	{
		Analyse.iSignedCount=iCardCount;
		Analyse.iBigSignedCard=iTempCard[0];
		Analyse.iLessSignedCard=iTempCard[iCardCount-1];
	}

	return TRUE;
}


//提取对牌函数
int CUpGradeGameLogic::TackOutDouble(BYTE iCardList[], int iCardCount, BYTE iDoubleBuffer[], BOOL bRemoveCard)
{
	int iCount=0;
	for (int i=0;i<iCardCount-1;i++)
	{
		if (iCardList[i]==iCardList[i+1])
		{
			iDoubleBuffer[iCount+1]=iDoubleBuffer[iCount]=iCardList[i];
			iCount+=2;
			if (bRemoveCard) iCardList[i]=iCardList[i+1]=0;
			i++;
		}
	}
	if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);

	return iCount;
}
//
////提取两条拖拉机函数
//int CUpGradeGameLogic::TackOutDoubleTrackor(BYTE iCardList[], int iCardCount, BYTE iDoubleBuffer[], BOOL bRemoveCard)
//{
//	BOOL bEndFind=FALSE;
//	int iCount=0,iRecordPos=0,iDataPos=0,iTrackorLen=0;
//
//	for (int i=0;i<iCardCount-3;i++)
//	{
//		if (IsDouble(&iCardList[i],2))
//		{
//			iDataPos=i;
//			iTrackorLen=2;
//			bEndFind=FALSE;
//			do
//			{
//				if ((IsDouble(&iCardList[i+2],2))&&(IsTrackorRule(iCardList[i],iCardList[i+2])))
//				{
//					//是拖拉机
//					i+=2;
//					iTrackorLen+=2;
//				}
//				else bEndFind=TRUE;
//			} while ((bEndFind==FALSE)&&(i<iCardCount-3));
//
//			//记录数据
//			if (iTrackorLen>=4)
//			{
//				iCount+=iTrackorLen;
//				iDoubleBuffer[iRecordPos]=0;
//				iDoubleBuffer[iRecordPos+1]=iTrackorLen;
//				for (int j=0;j<iTrackorLen;j++)
//				{
//					iDoubleBuffer[iRecordPos+j+2]=iCardList[iDataPos+j];
//					if (bRemoveCard) iCardList[iDataPos+j]=0;
//				}
//				iRecordPos+=(iTrackorLen+2);
//			}
//		}
//	}
//	if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
//
//	return iCount;
//}

//提取三条函数
int CUpGradeGameLogic::TackOutThree(BYTE iCardList[], int iCardCount, BYTE iThreeBuffer[], BOOL bRemoveCard)
{
	int iCount=0;
	for (int i=0;i<iCardCount-2;i++)
	{
		if ((iCardList[i]==iCardList[i+1])&&(iCardList[i]==iCardList[i+2]))
		{
			iThreeBuffer[iCount]=iThreeBuffer[iCount+1]=iThreeBuffer[iCount+2]=iCardList[i];
			iCount+=3;
			if (bRemoveCard) iCardList[i]=iCardList[i+1]=iCardList[i+2]=0;
			i+=2;
		}
	}
	if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);

	return iCount;
}

////提取三条拖拉机函数
//int CUpGradeGameLogic::TackOutThreeTrackor(BYTE iCardList[], int iCardCount, BYTE iThreeBuffer[], BOOL bRemoveCard)
//{
//	BOOL bEndFind=FALSE;
//	int iCount=0,iRecordPos=0,iDataPos=0,iTrackorLen=0;
//
//	for (int i=0;i<iCardCount-5;i++)
//	{
//		if (IsThree(&iCardList[i],3))
//		{
//			iDataPos=i;
//			iTrackorLen=3;
//			bEndFind=FALSE;
//			do
//			{
//				if ((IsThree(&iCardList[i+3],3))&&(IsTrackorRule(iCardList[i],iCardList[i+3])))
//				{
//					//是拖拉机
//					i+=3;
//					iTrackorLen+=3;
//				}
//				else bEndFind=TRUE;
//			} while ((bEndFind==FALSE)&&(i<iCardCount-5));
//
//			//记录数据
//			if (iTrackorLen>=6)
//			{
//				iCount+=iTrackorLen;
//				iThreeBuffer[iRecordPos]=0;
//				iThreeBuffer[iRecordPos+1]=iTrackorLen;
//				for (int j=0;j<iTrackorLen;j++)
//				{
//					iThreeBuffer[iRecordPos+j+2]=iCardList[iDataPos+j];
//					if (bRemoveCard) iCardList[iDataPos+j]=0;
//				}
//				iRecordPos+=(iTrackorLen+2);
//			}
//		}
//	}
//	if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
//
//	return iCount;
//}

//提取同一花色扑克
int CUpGradeGameLogic::TackOutCardByHua(BYTE iCardList[], int iCardCount, BYTE iHuaKind, BYTE iCardBuffer[], BOOL bRemoveCard)
{int iBeginPos,iEndPos;//Visual C++ .Net 2005
	for (iBeginPos=0;iBeginPos<iCardCount;iBeginPos++)
	{
		if (GetCardHuaKind(iCardList[iBeginPos],FALSE)==iHuaKind) break;
	}
	if (iBeginPos==iCardCount) return 0;
	for (iEndPos=iCardCount-1;iEndPos>=0;iEndPos--)
	{
		if (GetCardHuaKind(iCardList[iEndPos],FALSE)==iHuaKind) break;
	}
	::CopyMemory(iCardBuffer,&iCardList[iBeginPos],sizeof(BYTE)*(iEndPos-iBeginPos+1));
	if (bRemoveCard) RemoveNummCard(iCardList,iCardCount);
	return (iEndPos-iBeginPos+1);
}
//提取三顺
int CUpGradeGameLogic::TackThreeShun(BYTE iCardList[], int iCardCount, BYTE iThreeShunBuffer[], BOOL bRemoveCard)
{
	int iCount = 0;
	for(int i=0; i < iCardCount; i++)
	{
		if(GetCardNum(iCardList[i]) == GetCardNum(iCardList[i+1]))
		{	
			iThreeShunBuffer[iCount] = iCardList[i];
			iThreeShunBuffer[iCount+1] = iCardList[i+1];	
	        iThreeShunBuffer[iCount+2] = iCardList[i+2];	
			if (bRemoveCard)  iCardList[i] = iCardList[i+1] = iCardList[i+2]= 0;
			while (++i < iCardCount)
			{
				if (GetCardNum(iCardList[i]) != GetCardNum(iCardList[i+1]))
				{ 
					break;
				}
			}
			iCount += 3;
		}
	}
	if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
	return iCount;
}

⌨️ 快捷键说明

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