📄 upgradelogic.cpp
字号:
BOOL CUpGradeGameLogic::IsFourAndTwo(BYTE iCardList[], int iCardCount)
{
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 (iCardCount == 1)
{
if (iCardList[0] == 0x36) return UG_ONLY_ONE;
}
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);*/
}
//自动出牌函数
int CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[][13], BYTE iBaseCardCount[],
BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut)
{
if (!bFirstOut) ///跟随出牌
{
bool bFindLiveCard = false;
for (int i = 0;i < 4;i++)
{
if (iBaseCardCount[i] <= 0) continue;
int ph = GetCardNum(iBaseCard[i][0]);
int pt = GetCardNum(iBaseCard[i][iBaseCardCount[i]-1]);
if(ph < 0 || pt < 0) continue;
if (ph == 13) ph = -1; ///首为K
else ph++;
if (pt == 14) pt = -1; ///尾为A
else if (pt == 2) pt = 14;
else pt--;
for (int j = 0;j < iHandCardCount;j++)
{
int pi = GetCardNum(iHandCard[j]);
if (pi == ph && GetCardHuaKind(iHandCard[j],FALSE) == GetCardHuaKind(iBaseCard[i][0],FALSE)||
pi == pt && GetCardHuaKind(iHandCard[j],FALSE) == GetCardHuaKind(iBaseCard[i][0],FALSE)
)
{
iResultCardCount = 1;
iResultCard[0] = iHandCard[j];
bFindLiveCard = true;
return 1;
}
}
}
for (int i = 0;i < iHandCardCount;i++)
{
if (GetCardNum(iHandCard[i]) == 7)
{
iResultCardCount = 1;
iResultCard[0] = iHandCard[i];
bFindLiveCard = true;
return 1;
}
}
if (!bFindLiveCard)
{
iResultCardCount=1;
iResultCard[0]=iHandCard[iHandCardCount-1];
return 2;
}
}
else ///第一张出牌必须出黑桃7
{
iResultCardCount=1;
iResultCard[0]=0x36;
return 1;
}
return 0;
}
//是否可以甩牌
BOOL CUpGradeGameLogic::CanShowCard(BYTE iOutCard[], int iOutCardCount, int iOutStation,
BYTE * iCardArray[], int iCardArrayCount,
BYTE iResultCard[], int & iResultCardCount)
{
CardAnalyseStruct AnalyseOut;
BYTE iTempCard[54],iSameHuaCard[39];
int iTempCount=0,iOtherSameCount=0;
AnalyseCard(iOutCard,iOutCardCount,AnalyseOut);
for (int i=0;i<4;i++)
{
if (iOutStation==i) continue;
//提取扑克
iOtherSameCount=TackOutCardByHua(iCardArray[i],iCardArrayCount,AnalyseOut.iCardHuaKind,iSameHuaCard,FALSE);
//分析三条拖拉机
if (AnalyseOut.iThreeTractorCount!=0)
{
int iOutStation=0,iOtherStation=0,iCompOutCount=0,iCompOtherCount=0;
iTempCount=TackOutThreeTrackor(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
if (iTempCount!=0)
{
do
{
iOtherStation=0;
iCompOtherCount=0;
while (iCompOtherCount<iTempCount)
{
if ((AnalyseOut.iThreeTractorArray[iOutStation+1]<=iTempCard[iOtherStation+1])
&&(CompareOnlyOne(AnalyseOut.iThreeTractorArray[iOutStation+2],iTempCard[0])==FALSE))
{
//甩牌失败
iResultCardCount=AnalyseOut.iThreeTractorArray[iOutStation+1];
::CopyMemory(iResultCard,&AnalyseOut.iThreeTractorArray[iOutStation+2],sizeof(BYTE)*iResultCardCount);
return FALSE;
}
iCompOtherCount+=iTempCard[iOtherStation+1];
iOtherStation+=iTempCard[iOtherStation+1]+2;
}
iCompOutCount+=AnalyseOut.iThreeTractorArray[iOutStation+1];
iOutStation+=AnalyseOut.iThreeTractorArray[iOutStation+1]+2;
} while (iCompOutCount<AnalyseOut.iThreeTractorCount);
}
}
//分析两条拖拉机
if (AnalyseOut.iDoubleTractorCount!=0)
{
int iOutStation=0,iOtherStation=0,iCompOutCount=0,iCompOtherCount=0;
iTempCount=TackOutDoubleTrackor(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
if (iTempCount!=0)
{
do
{
iOtherStation=0;
iCompOtherCount=0;
while (iCompOtherCount<iTempCount)
{
if ((AnalyseOut.iDoubleTractorArray[iOutStation+2]<=iTempCard[iOtherStation+2])
&&(CompareOnlyOne(AnalyseOut.iDoubleTractorArray[iOutStation+2],iTempCard[2])==FALSE))
{
//甩牌失败
iResultCardCount=AnalyseOut.iDoubleTractorArray[iOutStation+1];
::CopyMemory(iResultCard,&AnalyseOut.iDoubleTractorArray[iOutStation+2],sizeof(BYTE)*iResultCardCount);
return FALSE;
}
iCompOtherCount+=iTempCard[iOtherStation+1];
iOtherStation+=iTempCard[iOtherStation+1]+2;
}
iCompOutCount+=AnalyseOut.iDoubleTractorArray[iOutStation+1];
iOutStation+=AnalyseOut.iDoubleTractorArray[iOutStation+1]+2;
} while (iCompOutCount<AnalyseOut.iDoubleTractorCount);
}
}
//分析三条
if (AnalyseOut.iThreeCount!=0)
{
iTempCount=TackOutThree(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
if ((iTempCount!=0)&&(CompareOnlyOne(AnalyseOut.iThreeArray[AnalyseOut.iThreeCount-3],iTempCard[0])==FALSE))
{
//甩牌失败
iResultCardCount=3;
::CopyMemory(iResultCard,&AnalyseOut.iThreeArray[AnalyseOut.iThreeCount-3],sizeof(BYTE)*iResultCardCount);
return FALSE;
}
}
//分析对牌
if (AnalyseOut.iDoubleCount!=0)
{
iTempCount=TackOutDouble(iSameHuaCard,iOtherSameCount,iTempCard,FALSE);
if ((iTempCount!=0)&&(CompareOnlyOne(AnalyseOut.iDoubleArray[AnalyseOut.iDoubleCount-2],iTempCard[0])==FALSE))
{
//甩牌失败
iResultCardCount=2;
::CopyMemory(iResultCard,&AnalyseOut.iDoubleArray[AnalyseOut.iDoubleCount-2],sizeof(BYTE)*iResultCardCount);
return FALSE;
}
}
//分析单牌
if ((AnalyseOut.iSignedCount!=0)&&(iOtherSameCount>0)&&
(CompareOnlyOne(AnalyseOut.iLessSignedCard,iSameHuaCard[0])==FALSE))
{
//甩牌失败
iResultCardCount=1;
iResultCard[0]=AnalyseOut.iLessSignedCard;
return FALSE;
}
}
//甩牌成功
iResultCardCount=iOutCardCount;
::CopyMemory(iResultCard,iOutCard,sizeof(BYTE)*iResultCardCount);
return TRUE;
}
//对比函数
int CUpGradeGameLogic::CompareCard(BYTE * iCardListArray[], int iCardCount)
{
//排列扑克
for (int i=0;i<4;i++) SortCard(iCardListArray[i],NULL,iCardCount);
//对比处理
int iWinner=0;
int iCardShape=GetCardShape(iCardListArray[0],iCardCount);
switch (iCardShape)
{
case UG_ONLY_ONE:
case UG_DOUBLE:
case UG_THREE:
case UG_DOUBLE_TRACKOR:
case UG_THREE_TARCKOR:
{
for (int i=1;i<4;i++)
{
if ((GetCardShape(iCardListArray[i],iCardCount)==iCardShape)&&
(CompareOnlyOne(iCardListArray[iWinner][0],iCardListArray[i][0])==FALSE))
iWinner=i;
}
return iWinner;
}
case UG_SHOW_CARD: return CompareShowCard(iCardListArray,iCardCount);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -