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

📄 upgradelogic.cpp

📁 原子,棋牌游戏源代码,功能齐全,稳定,适合用于棋牌游戏开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:

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

//构造函数
CUpGradeGameLogic::CUpGradeGameLogic(void)
{
	m_iDaoCard = 0;
	m_iStation[4]=500;
	for (int i=0;i<4;i++) m_iStation[i]=100*i;
	
}

//设置刀牌
void CUpGradeGameLogic::SetDaoCard(BYTE iDaoCard)
{
	m_iDaoCard = iDaoCard;
	return;
}

//获取扑克花色
BYTE CUpGradeGameLogic::GetCardHuaKind(BYTE iCard)
{ 
	int iHuaKind=(iCard&UG_HUA_MASK);
	
	return iHuaKind; 
}

//获取扑克大小 
int CUpGradeGameLogic::GetCardBulk(BYTE iCard)
{
	if ((iCard==0x4E)||(iCard==0x4F))
	{
		return (iCard-58);	//大小鬼
	}

	int iCardNum=GetCardNum(iCard);
	if (iCardNum == 2) iCardNum = 16;
	if (iCardNum == GetCardNum(m_iDaoCard)) iCardNum = 23;
	
	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]);
		///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;
			}
			if (iStationVol[i] == iStationVol[i+1])//牌点同按花色
			{
				if (GetCardHuaKind(iCardList[i]) < GetCardHuaKind(iCardList[i+1]))
				{
					//交换
					iTemp=iCardList[i];
					iCardList[i]=iCardList[i+1];
					iCardList[i+1]=iTemp;
				
				}
			}
		}
		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[45];
	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;

	int count = 0,first = -1;
	for (int i = 0;i < iCardCount;i++)
	{
		if (iCardList[i] == 0x4E || iCardList[i] == 0x4F)//大小王
		{
			count++;
			continue;
		}
		if (first < 0)
		{
			first = GetCardNum(iCardList[i]);
			continue;
		}
		if (first != GetCardNum(iCardList[i])) return FALSE;
	}

	if (count == 2) return 3;
	if (count > 0 && first == GetCardNum(m_iDaoCard)) return FALSE;
	return first;
}

//是否三条
BOOL CUpGradeGameLogic::IsThree(BYTE iCardList[], int iCardCount)
{
	if (iCardCount!=3) return FALSE;
	
	int count = 0,first = -1;
	for (int i = 0;i < iCardCount;i++)
	{
		if (iCardList[i] == 0x4E || iCardList[i] == 0x4F)
		{
			count++;
			continue;
		}
		if (first < 0)
		{
			first = GetCardNum(iCardList[i]);
			continue;
		}
		if (first != GetCardNum(iCardList[i])) return FALSE;
	}
	if (count == 3) return 3;
	if (count > 0 && first == GetCardNum(m_iDaoCard)) return FALSE;
	return first;
}

//是否氢弹
BOOL CUpGradeGameLogic::IsHydrogenBomb(BYTE iCardList[], int iCardCount)
{
	if (iCardCount != 8) return FALSE;
	int hetao = 0,
		ht = 0,
		mh = 0,
		fp = 0;
	int first = -1;
	for (int i = 0;i < iCardCount;i++)
	{
		if (GetCardHuaKind(iCardList[0]) == UG_HEI_TAO) hetao++;
		if (GetCardHuaKind(iCardList[i]) == UG_HONG_TAO) ht++;
		if (GetCardHuaKind(iCardList[i]) == UG_MEI_HUA) mh++;
		if (GetCardHuaKind(iCardList[i]) == UG_FANG_KUAI) fp++;

		if (first < 0)
		{
			first = GetCardNum(iCardList[i]);
			continue;
		}
		if (first != GetCardNum(iCardList[i])) return FALSE;
	}

	return (hetao == 2 && ht == 2 && mh == 2 && fp == 2);
}

//是否刀氢弹
BOOL CUpGradeGameLogic::IsDaoHydrogenBomb(BYTE iCardList[], int iCardCount)
{
	return ((GetCardNum(m_iDaoCard) == GetCardNum(iCardList[0])) && IsHydrogenBomb(iCardList,iCardCount));
}

//是否原子
BOOL CUpGradeGameLogic::IsAtom(BYTE iCardList[], int iCardCount)
{
	if (iCardCount != 3) return FALSE;
	int firsths = -1,firstpd = -1;
	for (int i = 0;i < iCardCount;i++)
	{
		if (firstpd < 0)
		{
			firsths = GetCardHuaKind(iCardList[i]);
			firstpd = GetCardNum(iCardList[i]);
			continue;
		}
		if (firsths != GetCardHuaKind(iCardList[i]) || firstpd != GetCardNum(iCardList[i])) return FALSE;
	}
	return TRUE;
}

//是否刀原子
BOOL CUpGradeGameLogic::IsDaoAtom(BYTE iCardList[], int iCardCount)
{
	return (GetCardNum(m_iDaoCard) == GetCardNum(iCardList[0]) && IsAtom(iCardList,iCardCount));
}

//是否大王原子
BOOL CUpGradeGameLogic::IsDWAtom(BYTE iCardList[], int iCardCount)
{
	return (iCardList[0] == 0x4F  && IsAtom(iCardList,iCardCount));
}

//是否小王原子
BOOL CUpGradeGameLogic::IsXWAtom(BYTE iCardList[], int iCardCount)
{
	return (iCardList[0] == 0x4E && IsAtom(iCardList,iCardCount));
}

//是否炸弹
BOOL CUpGradeGameLogic::IsBomb(BYTE iCardList[], int iCardCount)
{
	if (iCardCount < 4) return FALSE;
	
	int first = -1,count = 0;
	for (int i = 0;i < iCardCount;i++)
	{
		if (iCardList[i] == 0x4E || iCardList[i] == 0x4F)//王可代牌
		{
			count++;
			continue;
		}
		if (first < 0)
		{
			first = GetCardNum(iCardList[i]);
			continue;
		}
		if (first != GetCardNum(iCardList[i])) return FALSE;
	}

⌨️ 快捷键说明

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