📄 upgradelogic.cpp
字号:
if (iCardCount < 6) return FALSE;
SortCard(iCardList,NULL,iCardCount);
int iTempNum = -1;
for (int i = 0;i < iCardCount - 3;i++)
{
if (GetCardNum(iCardList[i]) == GetCardNum(iCardList[i+3]))
{
iTempNum = GetCardNum(iCardList[i]);
break;
}
}
if (iTempNum < 0) return FALSE;
BYTE iTempCard[4];
int iCnt = 0;
for (int i = 0;i < iCardCount;i++)
{
if (iTempNum != GetCardNum(iCardList[i]))
{
iTempCard[iCnt++] = iCardList[i];
continue;
}
}
if (iCnt == 2) //四带2单牌
{
if (GetCardNum(iTempCard[0]) == GetCardNum(iTempCard[1])) return FALSE;
BYTE iBackCard[6];
int j = 0;
for (int i = 0;i < iCardCount;i++)
{
if (GetCardNum(iCardList[i]) == iTempNum) iBackCard[j++] = iCardList[i];
}
iBackCard[4] = (GetCardNum(iTempCard[0]) > GetCardNum(iTempCard[1])) ? iTempCard[0] : iTempCard[1];
::CopyMemory(iCardList,iBackCard,sizeof(iBackCard));
}
else if (iCnt == 4) //四带2对牌
{
if (!((IsDouble(iTempCard,2) && IsDouble(&iTempCard[2],2)) && (GetCardNum(iTempCard[0]) != GetCardNum(iTempCard[2])))) return FALSE;
BYTE iBackCard[8];
int j = 0;
for (int i = 0;i < iCardCount;i++)
{
if (GetCardNum(iCardList[i]) == iTempNum) iBackCard[j++] = iCardList[i];
}
for (int i = 0;i < 4;i++)
{
iBackCard[j+i] = iTempCard[i];
}
::CopyMemory(iCardList,iBackCard,sizeof(iBackCard));
}
return TRUE;
}
//是否510K
BOOL CUpGradeGameLogic::Is510KBomb(BYTE iCardList[], int iCardCount)
{
if (iCardCount != 3) return FALSE;
bool h5 = false,
h10 = false,
hk = false;
SortCard(iCardList,NULL,iCardCount);
if (GetCardNum(iCardList[0]) == 13) hk = true;//13 Is K
if (GetCardNum(iCardList[1]) == 10) h10 = true;
if (GetCardNum(iCardList[2]) == 5) h5 =true;
if (hk && h10 && h5) return TRUE;
return FALSE;
}
//是否炸弹
BOOL CUpGradeGameLogic::IsBomb(BYTE iCardList[], int iCardCount)
{
if (iCardCount < 4) return FALSE;
int pd1 = GetCardNum(iCardList[0]);
for (int i = 0;i < iCardCount;i++)
{
if (GetCardNum(iCardList[i]) != pd1) return FALSE;
else continue;
}
return TRUE;
}
//是否火箭
BOOL CUpGradeGameLogic::IsRocket(BYTE iCardList[], int iCardCount)
{
if (iCardCount != 4) return FALSE;
SortCard(iCardList,NULL,iCardCount);
return ((iCardList[0] == 0x4F)&&(iCardList[1] == 0x4F)&&(iCardList[2] == 0x4E)&&(iCardList[3] == 0x4E));
}
////是否同花
//BOOL CUpGradeGameLogic::IsSameHua(BYTE iCardList[], int iCardCount)
//{
// if (iCardCount <= 0) return FALSE;
//
// int iFirstHua = GetCardHuaKind(iCardList[0],FALSE);
//
// for (int i = 0;i < iCardCount;i++)
// {
// if (GetCardHuaKind(iCardList[i],FALSE) != iFirstHua) return FALSE;
// else continue;
// }
//
// 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;
}
////是否甩牌
//BOOL CUpGradeGameLogic::IsShowCard(BYTE iCardList[], int iCardCount)
//{
// return (GetCardListHua(iCardList,iCardCount)!=UG_ERROR_HUA);
//}
//得到牌列花色
BYTE CUpGradeGameLogic::GetCardListHua(BYTE iCardList[], int iCardCount)
{
int iHuaKind=GetCardHuaKind(iCardList[0],FALSE);
if (GetCardHuaKind(iCardList[iCardCount-1],FALSE)!=iHuaKind) return UG_ERROR_HUA;
return iHuaKind;
}
//获取牌型
BYTE CUpGradeGameLogic::GetCardShape(BYTE iCardList[], int iCardCount)
{
if (IsOnlyOne(iCardList,iCardCount)) return UG_ONLY_ONE;//单牌
if (IsDouble(iCardList,iCardCount)) return UG_DOUBLE;//对牌
if (IsThree(iCardList,iCardCount)) return UG_THREE;//三同张
if (IsThreeAndOne(iCardList,iCardCount)) return UG_THREE_AND_ONE;//三带一
if (IsSingleContinue(iCardList,iCardCount)) return UG_SINGLE_CONTINUE;//单顺
if (IsDoubleContinue(iCardList,iCardCount)) return UG_DOUBLE_CONTINUE;//双顺
if (IsThreeContinue(iCardList,iCardCount)) return UG_THREE_CONTINUE;//三顺
if (IsBomb(iCardList,iCardCount)) return UG_BOMB;//炸弹
if (IsRocket(iCardList,iCardCount)) return UG_ROCKET;//火箭
//if (IsPlaneAndWing(iCardList,iCardCount)) return UG_PLANE_AND_WING;//飞机带翅膀
///if (IsFourAndTwo(iCardList,iCardCount)) return UG_FOUR_AND_TWO;//四带二
return UG_ERROR_KIND;
}
//对比单牌
BOOL CUpGradeGameLogic::CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard)
{
int iFirstNum = GetCardNum(iFirstCard);//上手牌
int iNextNum = GetCardNum(iNextCard);//本家牌
if (iFirstCard == 0x4F) return FALSE;//大王
if (iNextCard == 0x4F) return TRUE;
if (iFirstCard == 0x4E) return FALSE;//小王
if (iNextCard == 0x4E) return TRUE;
if (iFirstNum == 2) return FALSE;//2
if (iNextNum == 2) return TRUE;
return ((iNextNum - iFirstNum) > 0 ? TRUE : FALSE);//其他
/*int iFristHua=GetCardHuaKind(iFirstCard,FALSE);
int iNextHua=GetCardHuaKind(iNextCard,FALSE);
if (iFristHua!=iNextHua)
{
//不同花色对比
if (iFristHua==UG_NT_CARD) return TRUE;
return (iNextHua!=UG_NT_CARD);
}
//同花色对比
return GetCardBulk(iFirstCard,FALSE)>=GetCardBulk(iNextCard,FALSE);*/
}
//自动出牌函数
bool CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[]/*手里的牌*/, BYTE iHandCardCount/*手里的牌的数量*/, BYTE iBaseCard[]/*上轮的牌*/, BYTE iBaseCardCount/*上轮的牌的数量*/,
BYTE iResultCard[]/*要出的牌*/, int & iResultCardCount/*要出的牌的数量*/, BOOL bFirstOut)
{
for(int j = 0; j <sizeof(iResultCard); j++)
{
iResultCard[j] = 0;
}
BYTE IHandTmp[27];//建立临时扑克,重新排序
::CopyMemory(IHandTmp,iHandCard,sizeof(BYTE)*iHandCardCount);
SortCard(IHandTmp,NULL,iHandCardCount);//给临时扑克排序
//CString OutStr="上轮的牌:";
// for (int i=0;i<iBaseCardCount;i++)
// {
// OutStr.AppendFormat("0x%x,",iBaseCard[i]);
// }
// OutStr.AppendFormat("bFirstOut:%d",bFirstOut);
//AfxMessageBox(OutStr);
//
//自动出牌
if (bFirstOut==FALSE) //跟随出牌者
{
if (IsRocket(iBaseCard,iBaseCardCount)) return false;//上家是火箭
BYTE iBaseKind = GetCardShape(iBaseCard,iBaseCardCount);//上家所出牌
//上家牌饿类型
switch(iBaseKind)
{
case UG_BOMB://炸弹
{
for(int i = 0; i < iHandCardCount - 3 ;i++)
{
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;
}
}
}
return false;
}
case UG_ONLY_ONE://单牌
{
//for(int i = 0; i < iHandCardCount;i++)
for(int i=iHandCardCount;i>=0;i--)
{
if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]))
{
iResultCard[0] = IHandTmp[i];
iResultCardCount = 1;
return true;
}
}
break;
}
case UG_DOUBLE://对牌
{
//for(int i = 0; i < iHandCardCount - 1 ;i++)
for(int i=iHandCardCount;i>=0;i--)
{
if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]) )
{
if(GetCardNum(IHandTmp[i]) == GetCardNum(IHandTmp[i-1]))
{
iResultCard[0] = IHandTmp[i];
iResultCard[1] = IHandTmp[i-1];
iResultCardCount = 2;
return true;
}
//return false;
}
}
break;
}
case UG_THREE://三同张
{
//for(int i = 0; i < iHandCardCount - 2 ;i++)
for (int i =iHandCardCount; i>1;i--) {
}
{
if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]) )
{
if((GetCardNum(IHandTmp[i]) == GetCardNum(IHandTmp[i-1])) && (GetCardNum(IHandTmp[i])== GetCardNum(IHandTmp[i-2])))
{
iResultCard[0] = IHandTmp[i];
iResultCard[1] = IHandTmp[i-1];
iResultCard[2] = IHandTmp[i-2];
return true;
}
}
}
break;
}
case UG_SINGLE_CONTINUE://单顺
{
/* CString ss,s1;*/
SortCard(IHandTmp,NULL,iHandCardCount);
BYTE tempCard[13];
int index = 0;
tempCard[0] = IHandTmp[0];
for(int i = 0; i< iHandCardCount ;)
{
while(GetCardNum(IHandTmp[i++]) == GetCardNum(IHandTmp[i+1])) ;
tempCard[index++] = IHandTmp[i-1];
//s1.Format(" %0x ",IHandTmp[i-1]);
//ss += s1;
}
for(int j = 0; j < (iHandCardCount - iBaseCardCount) ;j++)
{
//ss = "";
for(int i = j; i < (j + iBaseCardCount);i++)
{
iResultCard[i-j] = tempCard[i];
//s1.Format(" %0x ",tempCard[i]);
//ss += s1;
}
iResultCardCount = iBaseCardCount;
if(CanOutCard(iResultCard,iBaseCardCount,iBaseCard,iBaseCardCount,IHandTmp,iHandCardCount))
return true;
}
break;
}
case UG_DOUBLE_CONTINUE://双顺
{
SortCard(IHandTmp,NULL,iHandCardCount);
BYTE tempCard[27];
int index = 0;
for(int i = 0; i< iHandCardCount - 1;i++)
{
if(IHandTmp[i] == IHandTmp[i+1])
{
tempCard[index++] = iHandCard[i];
tempCard[index++] = iHandCard[i+1];
}
}
for(int j = 0; j < (iHandCardCount - iBaseCardCount) ;j++)
{
//ss = "";
for(int i = j; i < (j + iBaseCardCount);i += 2)
{
iResultCard[i-j] = tempCard[i];
iResultCard[i-j +1 ] = tempCard[i +1];
//s1.Format(" %0x ",tempCard[i]);
//ss += s1;
}
iResultCardCount = iBaseCardCount;
if(CanOutCard(iResultCard,iBaseCardCount,iBaseCard,iBaseCardCount,IHandTmp,iHandCardCount))
return true;
}
break;
}
case UG_THREE_CONTINUE://三顺
{
//提出三顺//
int iTakeCount=0,iStationPos=0;
BYTE iTempCard[30];
iTakeCount=TackThreeShun(IHandTmp,iHandCardCount,iTempCard,false);
iHandCardCount -= iTakeCount;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -