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

📄 upgradelogic.cpp

📁 原子,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
	if (GetCardNum(m_iDaoCard) == first && count > 0) return FALSE;//王和刀牌不共存
	if (iCardCount == 4 && count == 4) return 3;//王单独使用只能当3
	return first;
}

//是否同花
BOOL CUpGradeGameLogic::IsSameHua(BYTE iCardList[], int iCardCount)
{
	if (iCardCount <= 0) return FALSE;
	int firsths = -1;
	for (int i = 0;i < iCardCount;i++)
	{
		if (firsths < 0)
		{
			firsths = GetCardHuaKind(iCardList[i]);
			continue;
		}
		if (firsths != GetCardHuaKind(iCardList[i])) return FALSE;
	}
	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;
}

//获取牌型
BYTE CUpGradeGameLogic::GetCardShape(BYTE iCardList[], int iCardCount)
{
	if (IsOnlyOne(iCardList,iCardCount)) return UG_ONLY_ONE;//单牌
	if (IsDouble(iCardList,iCardCount)) return UG_DOUBLE;//对牌
	if (IsDWAtom(iCardList,iCardCount)) return UG_DW_ATOM;//大王原子
	if (IsXWAtom(iCardList,iCardCount)) return UG_XW_ATOM;//小王原子
	if (IsDaoAtom(iCardList,iCardCount)) return UG_DAO_ATOM;//刀原子
	if (IsAtom(iCardList,iCardCount)) return UG_ATOM;//普通原子
	if (IsThree(iCardList,iCardCount)) return UG_THREE;//三同张
	if (IsDaoHydrogenBomb(iCardList,iCardCount)) return UG_DAO_HYDROGEN_BOMB;//刀氢弹
	if (IsHydrogenBomb(iCardList,iCardCount)) return UG_HYDROGEN_BOMB;//普通氢弹
	if (IsBomb(iCardList,iCardCount)) return UG_BOMB;//炸弹

	return UG_ERROR_KIND;
}

//对比单牌
BOOL CUpGradeGameLogic::CompareOnlyOne(int iFirstCard, int iNextCard)
{
	//int iFirstNum = GetCardNum(iFirstCard);//上手牌
	//int iNextNum  = GetCardNum(iNextCard);//本家牌
	
	if (iFirstCard == GetCardNum(m_iDaoCard)) return FALSE;
	if (iNextCard == GetCardNum(m_iDaoCard)) return TRUE;
	
	if (iFirstCard == 2) return FALSE;//2
	if (iNextCard == 2) return TRUE;

	return ((iNextCard - iFirstCard) > 0 ? TRUE : FALSE);//其他
	
}

//自动出牌函数
BOOL CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[], int iBaseCardCount,
									BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut)
{
	if (bFirstOut == TRUE)
	{
		iResultCard[0] = iHandCard[iHandCardCount-1];
		iResultCardCount = 1;
	}
	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);

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

//是否可以出牌
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_DAO_HYDROGEN_BOMB && iOutKind == UG_DAO_HYDROGEN_BOMB) return FALSE;
	if (iBaseKind == UG_DAO_HYDROGEN_BOMB) return FALSE;
	if (iOutKind == UG_DAO_HYDROGEN_BOMB) return TRUE;
	//普通氢弹
	if (iBaseKind == UG_HYDROGEN_BOMB && iOutKind == UG_HYDROGEN_BOMB)
	{
		return CompareOnlyOne(GetCardNum(iBaseCard[0]),GetCardNum(iOutCard[0]));
	}
	if (iBaseKind == UG_HYDROGEN_BOMB) return FALSE;
	if (iOutKind == UG_HYDROGEN_BOMB) return TRUE;

	//刀原子
	if (iBaseKind == UG_DAO_ATOM && iOutKind == UG_DAO_ATOM)
	{
		return GetCardHuaKind(iOutCard[0]) > GetCardHuaKind(iBaseCard[0]) ? TRUE : FALSE;
	}
	if (iBaseKind == UG_DAO_ATOM) return FALSE;
	if (iOutKind == UG_DAO_ATOM) return TRUE;
	//大王原子
	if (iBaseKind == UG_DW_ATOM) return FALSE;
	if (iOutKind == UG_DW_ATOM) return TRUE;
	//小王原子
	if (iBaseKind == UG_XW_ATOM) return FALSE;
	if (iOutKind == UG_XW_ATOM) return TRUE;
	//普通原子
	if (iBaseKind == UG_ATOM && iOutKind == UG_ATOM)
	{
		if (GetCardNum(iBaseCard[0]) != GetCardNum(iOutCard[0]))
		{
			return CompareOnlyOne(GetCardNum(iBaseCard[0]),GetCardNum(iOutCard[0]));
		}
		return GetCardHuaKind(iOutCard[0]) > GetCardHuaKind(iBaseCard[0]) ? TRUE : FALSE;
	}
	if (iBaseKind == UG_ATOM) return FALSE;
	if (iOutKind == UG_ATOM) return TRUE;

	//炸弹
	if ((iBaseKind == UG_BOMB) && (iOutKind == iBaseKind))//都出炸弹
	{	
		if (iOutCount < iBaseCount) return FALSE;
		if (iOutCount > iBaseCount) return TRUE;
		int iOutPd = IsBomb(iOutCard,iOutCount),
			iBasePd = IsBomb(iBaseCard,iBaseCount);
		return CompareOnlyOne(iBasePd,iOutPd);
	}
	if (iBaseKind == UG_BOMB) return FALSE;
	if (iOutKind == UG_BOMB) return TRUE;
		
	//其他类型
	if (iOutKind != iBaseKind) return FALSE;
	switch(iBaseKind)
	{
	case UG_ONLY_ONE:
		{
			int iBasePd = GetCardNum(iBaseCard[0]),
				iOutPd = GetCardNum(iOutCard[0]);
			if (iBaseCard[0] == 0x4E || iBaseCard[0] == 0x4F) iBasePd = 3;
			if (iOutCard[0] == 0x4E || iOutCard[0] == 0x4F) iOutPd = 3;
			return CompareOnlyOne(iBasePd,iOutPd);
		}

	case UG_DOUBLE:
		{
			int iBasePd = IsDouble(iBaseCard,iBaseCount),
				iOutPd = IsDouble(iOutCard,iOutCount);
			return CompareOnlyOne(iBasePd,iOutPd);
		}
	case UG_THREE:
		{
			int iBasePd = IsThree(iBaseCard,iOutCount),
				iOutPd = IsThree(iOutCard,iOutCount);
			return CompareOnlyOne(iBasePd,iOutPd);
		}
	}
	
	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;
}



⌨️ 快捷键说明

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