📄 upgradelogic.cpp
字号:
return -1;
}
//对比甩牌
int CUpGradeGameLogic::CompareShowCard(BYTE * iCardListArray[], int iCardCount)
{
CardAnalyseStruct AnalyseResul[4];
//分析扑克
AnalyseCard(iCardListArray[0],iCardCount,AnalyseResul[0]);
if (AnalyseResul[0].iCardHuaKind==UG_NT_CARD) return 0;
///////////
//如果是用主杀,别人追杀,就不是按这样的方式比较了,而是比最大的一类牌
///////////
//开始对比
int iWiner=0;
for (int i=1;i<4;i++)
{
if (GetCardListHua(iCardListArray[i],iCardCount)!=UG_NT_CARD) continue;
if (FixCardType(iCardListArray[i],iCardCount,AnalyseResul[0],AnalyseResul[i])==FALSE) continue;
//分析三条拖拉机
if (AnalyseResul[0].iThreeTractorCount!=0)
{
if (AnalyseResul[i].iThreeTractorCount!=AnalyseResul[iWiner].iThreeTractorCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iThreeTractorArray[2],AnalyseResul[i].iThreeTractorArray[2])==TRUE)
continue;
}
//分析两条拖拉机
if (AnalyseResul[0].iDoubleTractorCount!=0)
{
if (AnalyseResul[i].iDoubleTractorCount!=AnalyseResul[iWiner].iDoubleTractorCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iDoubleArray[2],AnalyseResul[i].iDoubleArray[2])==TRUE)
continue;
}
//分析三条
if (AnalyseResul[0].iThreeCount!=0)
{
if (AnalyseResul[i].iThreeCount!=AnalyseResul[iWiner].iThreeCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iThreeArray[0],AnalyseResul[i].iThreeArray[0])==TRUE)
continue;
}
//分析对牌
if (AnalyseResul[0].iDoubleCount!=0)
{
if (AnalyseResul[i].iDoubleCount!=AnalyseResul[iWiner].iDoubleCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iDoubleArray[0],AnalyseResul[i].iDoubleArray[0])==TRUE)
continue;
}
//分析单牌
if (AnalyseResul[i].iSignedCount!=0)
{
if (AnalyseResul[i].iSignedCount!=AnalyseResul[iWiner].iSignedCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iBigSignedCard,AnalyseResul[i].iBigSignedCard)==TRUE)
continue;
}
//对比成功
iWiner=i;
}
//考虑追杀的情况
if(iWiner!=0 && iCardCount>=3)
{
for(int i=1;i<4;i++)
{
if (GetCardListHua(iCardListArray[i],iCardCount)!=UG_NT_CARD) continue;
if (FixCardType(iCardListArray[i],iCardCount,AnalyseResul[0],AnalyseResul[i])==FALSE) continue;
//分析三条拖拉机
if (AnalyseResul[0].iThreeTractorCount!=0)
{
if (AnalyseResul[i].iThreeTractorCount!=AnalyseResul[iWiner].iThreeTractorCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iThreeTractorArray[2],AnalyseResul[i].iThreeTractorArray[2])==FALSE)
{
iWiner=i;
break;
}
}
//分析两条拖拉机
if (AnalyseResul[0].iDoubleTractorCount!=0)
{
if (AnalyseResul[i].iDoubleTractorCount!=AnalyseResul[iWiner].iDoubleTractorCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iDoubleArray[2],AnalyseResul[i].iDoubleArray[2])==FALSE)
{
iWiner=i;
break;
}
}
//分析三条
if (AnalyseResul[0].iThreeCount!=0)
{
if (AnalyseResul[i].iThreeCount!=AnalyseResul[iWiner].iThreeCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iThreeArray[0],AnalyseResul[i].iThreeArray[0])==FALSE)
{
iWiner=i;
break;
}
}
//分析对牌
if (AnalyseResul[0].iDoubleCount!=0)
{
if (AnalyseResul[i].iDoubleCount!=AnalyseResul[iWiner].iDoubleCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iDoubleArray[0],AnalyseResul[i].iDoubleArray[0])==FALSE)
{
iWiner=i;
break;
}
}
//分析单牌
if (AnalyseResul[i].iSignedCount!=0)
{
if (AnalyseResul[i].iSignedCount!=AnalyseResul[iWiner].iSignedCount) continue;
if (CompareOnlyOne(AnalyseResul[iWiner].iBigSignedCard,AnalyseResul[i].iBigSignedCard)==FALSE)
{
iWiner=i;
break;
}
}
}
}
return iWiner;
}
//分析函数
BOOL CUpGradeGameLogic::AnalyseCard(BYTE iCardList[], int iCardCount, CardAnalyseStruct & Analyse)
{
//初始化数据
/* ::memset(&Analyse,0,sizeof(Analyse));
//判断是否同花色
Analyse.iCardHuaKind=GetCardListHua(iCardList,iCardCount);
if (Analyse.iCardHuaKind==UG_ERROR_HUA) return FALSE;
//分析临时数据
BYTE iTempCard[39];
::CopyMemory(iTempCard,iCardList,sizeof(BYTE)*iCardCount);
//去除一张扑克的分析过程
if (iCardCount==1)
{
Analyse.iSignedCount=1;
Analyse.iLessSignedCard=iCardList[0];
return TRUE;
}
//提取三条
Analyse.iThreeCount=TackOutThree(iTempCard,iCardCount,Analyse.iThreeArray,TRUE);
iCardCount-=Analyse.iThreeCount;
//提取三条拖拉机
Analyse.iThreeTractorCount=TackOutThreeTrackor(Analyse.iThreeArray,Analyse.iThreeCount,
Analyse.iThreeTractorArray,TRUE);
Analyse.iThreeCount-=Analyse.iThreeTractorCount;
//提取对牌
Analyse.iDoubleCount=TackOutDouble(iTempCard,iCardCount,Analyse.iDoubleArray,TRUE);
iCardCount-=Analyse.iDoubleCount;
//提取两条拖拉机
Analyse.iDoubleTractorCount=TackOutDoubleTrackor(Analyse.iDoubleArray,Analyse.iDoubleCount,
Analyse.iDoubleTractorArray,TRUE);
Analyse.iDoubleCount-=Analyse.iDoubleTractorCount;
//提取单牌
if (iCardCount>0)
{
Analyse.iSignedCount=iCardCount;
Analyse.iBigSignedCard=iTempCard[0];
Analyse.iLessSignedCard=iTempCard[iCardCount-1];
}*/
return TRUE;
}
//变化扑克格式
BOOL CUpGradeGameLogic::FixCardType(BYTE iCardList[], int iCardCount, CardAnalyseStruct & BaseAnalyse, CardAnalyseStruct & OutAnalyse)
{
return TRUE;
}
//提取对牌函数
int CUpGradeGameLogic::TackOutDouble(BYTE iCardList[], int iCardCount, BYTE iDoubleBuffer[], BOOL bRemoveCard)
{
int iCount=0;
for (int i=0;i<iCardCount-1;i++)
{
if (iCardList[i]==iCardList[i+1])
{
iDoubleBuffer[iCount+1]=iDoubleBuffer[iCount]=iCardList[i];
iCount+=2;
if (bRemoveCard) iCardList[i]=iCardList[i+1]=0;
i++;
}
}
if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
return iCount;
}
//提取两条拖拉机函数
int CUpGradeGameLogic::TackOutDoubleTrackor(BYTE iCardList[], int iCardCount, BYTE iDoubleBuffer[], BOOL bRemoveCard)
{
BOOL bEndFind=FALSE;
int iCount=0,iRecordPos=0,iDataPos=0,iTrackorLen=0;
for (int i=0;i<iCardCount-3;i++)
{
if (IsDouble(&iCardList[i],2))
{
iDataPos=i;
iTrackorLen=2;
bEndFind=FALSE;
do
{
if ((IsDouble(&iCardList[i+2],2))&&(IsTrackorRule(iCardList[i],iCardList[i+2])))
{
//是拖拉机
i+=2;
iTrackorLen+=2;
}
else bEndFind=TRUE;
} while ((bEndFind==FALSE)&&(i<iCardCount-3));
//记录数据
if (iTrackorLen>=4)
{
iCount+=iTrackorLen;
iDoubleBuffer[iRecordPos]=0;
iDoubleBuffer[iRecordPos+1]=iTrackorLen;
for (int j=0;j<iTrackorLen;j++)
{
iDoubleBuffer[iRecordPos+j+2]=iCardList[iDataPos+j];
if (bRemoveCard) iCardList[iDataPos+j]=0;
}
iRecordPos+=(iTrackorLen+2);
}
}
}
if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
return iCount;
}
//提取三条函数
int CUpGradeGameLogic::TackOutThree(BYTE iCardList[], int iCardCount, BYTE iThreeBuffer[], BOOL bRemoveCard)
{
int iCount=0;
for (int i=0;i<iCardCount-2;i++)
{
if ((iCardList[i]==iCardList[i+1])&&(iCardList[i]==iCardList[i+2]))
{
iThreeBuffer[iCount]=iThreeBuffer[iCount+1]=iThreeBuffer[iCount+2]=iCardList[i];
iCount+=3;
if (bRemoveCard) iCardList[i]=iCardList[i+1]=iCardList[i+2]=0;
i+=2;
}
}
if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
return iCount;
}
//提取三条拖拉机函数
int CUpGradeGameLogic::TackOutThreeTrackor(BYTE iCardList[], int iCardCount, BYTE iThreeBuffer[], BOOL bRemoveCard)
{
BOOL bEndFind=FALSE;
int iCount=0,iRecordPos=0,iDataPos=0,iTrackorLen=0;
for (int i=0;i<iCardCount-5;i++)
{
if (IsThree(&iCardList[i],3))
{
iDataPos=i;
iTrackorLen=3;
bEndFind=FALSE;
do
{
if ((IsThree(&iCardList[i+3],3))&&(IsTrackorRule(iCardList[i],iCardList[i+3])))
{
//是拖拉机
i+=3;
iTrackorLen+=3;
}
else bEndFind=TRUE;
} while ((bEndFind==FALSE)&&(i<iCardCount-5));
//记录数据
if (iTrackorLen>=6)
{
iCount+=iTrackorLen;
iThreeBuffer[iRecordPos]=0;
iThreeBuffer[iRecordPos+1]=iTrackorLen;
for (int j=0;j<iTrackorLen;j++)
{
iThreeBuffer[iRecordPos+j+2]=iCardList[iDataPos+j];
if (bRemoveCard) iCardList[iDataPos+j]=0;
}
iRecordPos+=(iTrackorLen+2);
}
}
}
if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
return iCount;
}
//提取同一花色扑克
int CUpGradeGameLogic::TackOutCardByHua(BYTE iCardList[], int iCardCount, BYTE iHuaKind, BYTE iCardBuffer[], BOOL bRemoveCard)
{int iBeginPos,iEndPos;////Visual C++ .Net 2005
for (iBeginPos=0;iBeginPos<iCardCount;iBeginPos++)
{
if (GetCardHuaKind(iCardList[iBeginPos],FALSE)==iHuaKind) break;
}
if (iBeginPos==iCardCount) return 0;
for (iEndPos=iCardCount-1;iEndPos>=0;iEndPos--)
{
if (GetCardHuaKind(iCardList[iEndPos],FALSE)==iHuaKind) break;
}
::CopyMemory(iCardBuffer,&iCardList[iBeginPos],sizeof(BYTE)*(iEndPos-iBeginPos+1));
if (bRemoveCard) RemoveNummCard(iCardList,iCardCount);
return (iEndPos-iBeginPos+1);
}
//清除 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;
}
//是否可以出牌
int CUpGradeGameLogic::CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[][13],
BYTE iBaseCount[], BYTE iHandCard[], int iHandCount)
{
///1出活牌,2扣牌,0有活牌没出
if (iOutCount != 1) return 0;
//////AfxMessageBox("是否可以出牌");
if (GetCardNum(iOutCard[0]) == 7) return 1; ///出活牌
bool bHaveLiveCard = false;
for (int i = 0;i < iHandCount;i++)
{
if (GetCardNum(iHandCard[i]) == 7)
{
bHaveLiveCard = true;
break;
}
}
for (int i = 0;i < 4;i++)
{
if (iBaseCount[i] <= 0) continue;
int ph = GetCardNum(iBaseCard[i][0]);
int pt = GetCardNum(iBaseCard[i][iBaseCount[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--;
if ((GetCardNum(iOutCard[0]) == ph && GetCardHuaKind(iOutCard[0],FALSE) == GetCardHuaKind(iBaseCard[i][0],FALSE))||
(GetCardNum(iOutCard[0]) == pt && GetCardHuaKind(iOutCard[0],FALSE) == GetCardHuaKind(iBaseCard[i][0],FALSE))
) return 1; //出活牌
for (int j = 0;j < iHandCount;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))||
(pi == 7)
)
{
bHaveLiveCard = true;
break;
}
}
}
if (bHaveLiveCard) return 0; ///有活牌
else return 2;
}
//查找分数
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;
}
//查找最长的拖拉机
int CUpGradeGameLogic::MaxThreeTractorLong(BYTE iCardList[], int iCardCount, BYTE iTrackorBuffer[])
{
int iMaxPos=0,iMaxCount=0,i=0;
BYTE iTempThreeTrackor[48];
int iCount=TackOutThreeTrackor(iCardList,iCardCount,iTempThreeTrackor,FALSE);
while (i<iCount)
{
if (iTempThreeTrackor[i+1]>iMaxCount)
{
iMaxPos=i;
iMaxCount=iTrackorBuffer[i+1];
}
i+=(iTempThreeTrackor[i+1]+2);
}
if ((iMaxCount!=0)&&(iTrackorBuffer!=NULL))
::CopyMemory(iTrackorBuffer,&iTempThreeTrackor[iMaxPos],sizeof(BYTE)*(iMaxCount+2));
return iMaxCount;
}
//查找最长的拖拉机
int CUpGradeGameLogic::MaxDoubleTractorLong(BYTE iCardList[], int iCardCount, BYTE iTrackorBuffer[])
{
int iMaxPos=0,iMaxCount=0,i=0;
BYTE iTempDoubleTrackor[54];
int iCount=TackOutDoubleTrackor(iCardList,iCardCount,iTempDoubleTrackor,FALSE);
while (i<iCount)
{
if (iTempDoubleTrackor[i+1]>iMaxCount)
{
iMaxPos=i;
iMaxCount=iTempDoubleTrackor[i+1];
}
i+=(iTempDoubleTrackor[i+1]+2);
}
if ((iMaxCount!=0)&&(iTrackorBuffer!=NULL))
::CopyMemory(iTrackorBuffer,&iTempDoubleTrackor[iMaxPos],sizeof(BYTE)*(iMaxCount+2));
return iMaxCount;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -