📄 upgradelogic.cpp
字号:
#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 + -