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

📄 upgradelogic.cpp

📁 这是用Windows编写的
💻 CPP
📖 第 1 页 / 共 3 页
字号:

#include "StdAfx.h"
#include "UpGradeLogic.h"

//构造函数
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)
{ 
	int iHuaKind=(iCard&UG_HUA_MASK);
	
	return iHuaKind; 
}

//获取扑克大小 (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 == 2) iCardNum = 16;
	//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[], BYTE 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;
}



//重新排序
BOOL CUpGradeGameLogic::ReSortCard(BYTE iCardList[], int iCardCount)
{
	CPtrList ptrList;

	for (int i = 0;i < iCardCount;i++)
	{	
		bool bFind = false;
		int pd = GetCardNum(iCardList[i]);
		if (pd == 16) pd = 17;	///大王 
		if (pd == 15) pd = 16;	///小王
		if (pd == 2)  pd = 15;
		for (POSITION pos = ptrList.GetHeadPosition();pos != NULL;)
		{
			PSTypeNode *pn = (PSTypeNode *) ptrList.GetNext(pos);
			if (!pn) continue;
			/////ASSERT(pn);
			if (pn->mps == pd)
			{
				pn->mcount++;
				bFind = true;
				break;
			}
		}
		if (!bFind)
		{
			PSTypeNode *pn = new PSTypeNode();
			pn->mps = pd;
			pn->mcount = 1;
			ptrList.AddTail(pn);
		}
	}

	///sort
	CPtrList tmpList;
	for (POSITION pos = ptrList.GetHeadPosition();pos != NULL;)
	{
		PSTypeNode *pn = (PSTypeNode *) ptrList.GetNext(pos);
   		if (!pn) continue;
		////ASSERT(pn);
		PSTypeNode *pii = new PSTypeNode();
		pii->mcount = pn->mcount;
		pii->mps = pn->mps;
		if (tmpList.IsEmpty())
		{
			tmpList.AddTail(pii);
			continue;
		}
		
		bool bFind = false;
		for (POSITION pos1 = tmpList.GetHeadPosition();pos1 != NULL;)
		{
			POSITION tp = pos1;
			PSTypeNode *pi = (PSTypeNode *) tmpList.GetNext(pos1);
			if (!pi) continue;
			if (pii->mcount > pi->mcount || (pii->mcount == pi->mcount && pii->mps > pi->mps))
			{
				tmpList.InsertBefore(tp, pii);
				bFind = true;
				break;
			}
		}

		if (!bFind)
		{
			tmpList.AddTail(pii);
		}
	}

	BYTE iTempCard[39];
	int iCnt = 0;

	for (POSITION pos = tmpList.GetHeadPosition();pos != NULL;)
	{
		PSTypeNode *pn = (PSTypeNode *) tmpList.GetNext(pos);
		if (!pn) continue;
		ASSERT(pn);
		for (int i = 0;i < iCardCount;i++)
		{
			int pd = GetCardNum(iCardList[i]);
			if (pd == 16) pd = 17;	///大王 
			if (pd == 15) pd = 16;	///小王
			if (pd == 2)  pd = 15;
			if (pd == pn->mps)
			{
				iTempCard[iCnt++] = iCardList[i];
			}
		}
	}
	
	while (!ptrList.IsEmpty())
	{
		PSTypeNode *ps = (PSTypeNode *) ptrList.RemoveHead();
		delete ps;
	}
	ptrList.RemoveAll();

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

	for (int i = 0;i < iCardCount;i++)
	{
		iCardList[i] = iTempCard[i];
	}
	
	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 (GetCardNum(iCardList[0])==GetCardNum(iCardList[1]));
}

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

////是否拖拉机逻辑
//BOOL CUpGradeGameLogic::IsTrackorRule(BYTE iFirstCard, BYTE iNextCard)
//{
//	int iCardBulk=GetCardBulk(iFirstCard,FALSE);
//	//如果主占了当中的位置
//	if(GetNTCardNum()!=0 && (iCardBulk==GetNTCardNum()-1 || iCardBulk==GetNTCardNum()+1) && 
//		(GetCardBulk(iNextCard,FALSE)==GetNTCardNum()-1 || GetCardBulk(iNextCard,FALSE)==GetNTCardNum()+1))
//	{
//		return true;
//	}
//	if (GetCardBulk(iNextCard,FALSE)!=(iCardBulk-1)) 
//		return FALSE;
//	return TRUE;
//}
//
////是否拖拉机(两条)
//BOOL CUpGradeGameLogic::IsDoubleTrackor(BYTE iCardList[], int iCardCount)
//{
//	if ((iCardCount<4)||((iCardCount%2)!=0)) return FALSE;
//
//	BYTE iCard=iCardList[0];
//	if (!IsDouble(iCardList,2)) return FALSE;
//	for (int i=2;i<iCardCount;i+=2)
//	{
//		if (!IsDouble(&iCardList[i],2)||!IsTrackorRule(iCard,iCardList[i])) return FALSE;
//		iCard=iCardList[i];
//	}
//	return TRUE;
//}
//
////是否拖拉机(三条)
//BOOL CUpGradeGameLogic::IsThreeTrackor(BYTE iCardList[], int iCardCount)
//{
//	if ((iCardCount<6)||((iCardCount%3)!=0)) return FALSE;
//
//	BYTE iCard=iCardList[0];
//	if (!IsThree(iCardList,3)) return FALSE;
//	for (int i=3;i<iCardCount;i+=3)
//	{
//		if (!IsThree(&iCardList[i],3)||!IsTrackorRule(iCard,iCardList[i])) return FALSE;
//		iCard=iCardList[i];
//	}
//	return TRUE;
//}


//是否三带一
BOOL CUpGradeGameLogic::IsThreeAndOne(BYTE iCardList[], int iCardCount)
{
	if (!(iCardCount == 4 || iCardCount == 5)) return FALSE;
	
	//AfxMessageBox("是否三带一");
	SortCard(iCardList,NULL,iCardCount);

	//三同张带一单牌或带一对牌
	int iTemp = -1;
	for (int i = 0;i < iCardCount - 2;i++)
	{
		if (GetCardNum(iCardList[i]) == GetCardNum(iCardList[i+2]))
		{
			iTemp = GetCardNum(iCardList[i]);
			break;
		}
	}

	if (iTemp < 0) return FALSE;

	BYTE iTempCard[2];
	int iCnt = 0,ishunCnt = 0;
	
	for (int i = 0;i < iCardCount;i++)
	{
		if (iTemp == GetCardNum(iCardList[i])) 
		{
			ishunCnt++;
			continue;
		}
		iTempCard[iCnt++] = iCardList[i];
	}
	
	if (ishunCnt != 3) return FALSE;

	if (iCnt == 1)//三带一单牌
	{
		if (iTemp == GetCardNum(iTempCard[0])) return FALSE;

		BYTE iBackCard[4];
		int count = 0;
		for (int i = 0;i < iCardCount;i++)
		{
			if (iTemp == GetCardNum(iCardList[i])) 
			{
				iBackCard[count++] = iCardList[i];
				continue;
			}
			else
			{
				iBackCard[3] = iCardList[i];
			}
		}
		::CopyMemory(iCardList,iBackCard,sizeof(iBackCard));
		 
	}
	else if (iCnt == 2)//三带一对
	{
		if ((GetCardNum(iTempCard[0]) != GetCardNum(iTempCard[1])) || (iTemp == GetCardNum(iTempCard[0])))
			return FALSE;
		////AfxMessageBox("三带一对");
		BYTE iBackCard[5];
		int count = 0;
		int num = 0;
		for (int i = 0;i < iCardCount;i++)
		{
			if (iTemp == GetCardNum(iCardList[i])) 
			{
				iBackCard[count++] = iCardList[i];
				continue;
			}
			else
			{
				iBackCard[3+num] = iCardList[i];
				num++;
			}
		}
		::CopyMemory(iCardList,iBackCard,sizeof(iBackCard));
	}
	
	return TRUE;
}

//是否单顺(至少5张)
BOOL CUpGradeGameLogic::IsSingleContinue(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 5) return FALSE;
	
	SortCard(iCardList,NULL,iCardCount);

	for (int i = 0;i < iCardCount - 1;i++)
	{
		if (GetCardNum(iCardList[i]) == 2 || iCardList[i] == 0x4E || iCardList[i] == 0x4F)//不能含2和大小王
			return FALSE;
		if ((GetCardNum(iCardList[i]) % 15) != ((GetCardNum(iCardList[i+1]) + 1) % 15))
			return FALSE;
	}
	return TRUE;
}

//是否双顺(跑的快可以两顺)
BOOL CUpGradeGameLogic::IsDoubleContinue(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 4 || iCardCount % 2 != 0) return FALSE;

	SortCard(iCardList,NULL,iCardCount);

	for (int i = 0;i < iCardCount - 2;i++)
	{
		if (GetCardNum(iCardList[i]) == 2 || iCardList[i] == 0x4E || iCardList[i] == 0x4F)
			return FALSE;
		if ((GetCardNum(iCardList[i]) % 15) != ((GetCardNum(iCardList[i+2]) + 1) % 15))
			return FALSE;
	}
	return TRUE;
}

//是否三顺(连三同张至少2个)
BOOL CUpGradeGameLogic::IsThreeContinue(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 6 || iCardCount % 3 != 0) return FALSE;

	SortCard(iCardList,NULL,iCardCount);

	for (int i = 0;i < iCardCount - 3;i++)
	{
		if (GetCardNum(iCardList[i]) == 2 || iCardList[i] == 0x4E || iCardList[0] == 0x4F)
			return FALSE;
		if ((GetCardNum(iCardList[i]) % 15) != ((GetCardNum(iCardList[i+3]) + 1) % 15))
			return FALSE;
	}
	return TRUE;
}

//是否飞机带翅膀(三顺+同数量的单张或对牌)
BOOL CUpGradeGameLogic::IsPlaneAndWing(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 8) return FALSE;
	
	SetCard(iCardList,iCardCount);
	
	bool IsDaiOne = true;
	int shunCount = 0,daiCount = 0;
	PSTypeNode *first = NULL;
	
	int iTempNum[5];
	int iCnt = 0;
	for (POSITION pos = m_ptrPSList.GetHeadPosition();pos != NULL;)
	{
		PSTypeNode *pn = (PSTypeNode *) m_ptrPSList.GetNext(pos);
		if (!pn) continue;
		if (!first)
		{
			first = pn;
			shunCount++;
			iTempNum[iCnt++] = pn->mps;
			continue;
		}
		if (first->mcount != 3) return FALSE;
		if (pn->mcount == 3)
		{
			if ((pn->mps + 1) % 15 == first->mps % 15)
			{
				first = pn;
				shunCount++;
				iTempNum[iCnt++] = pn->mps;
				continue;
			}
			else return FALSE;
		}

		if (pn->mcount == 2) 
		{
			daiCount++;
			IsDaiOne = false;
			continue;
		}
		else if (pn->mcount == 1)
		{
			if (!IsDaiOne) return FALSE;

			daiCount++;
			continue;
		}
		
	}

	if (shunCount != daiCount) return FALSE;

	BYTE iBackCard[20];
	iCnt = 0;
	int j = 0, p = 0;
	for (int i = 0;i < iCardCount;i++)
	{
		if (j == 3)
		{
			p++;
			j = 0;
		}
		if (GetCardNum(iCardList[i]) == iTempNum[p])
		{
			iBackCard[iCnt++] = iCardList[i];
			iCardList[i] = 0;
			j++;

		}
	}
	
	for (int i = 0;i < iCardCount;i++)
	{
		if (iCardList[i] != 0) iBackCard[iCnt++] = iCardList[i];
	}
	
	::CopyMemory(iCardList,iBackCard,sizeof(BYTE)*iCnt);

	return TRUE;
}

//是否四带二(四同张+2单张或2对牌)
BOOL CUpGradeGameLogic::IsFourAndTwo(BYTE iCardList[], int iCardCount)
{

⌨️ 快捷键说明

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