📄 upgradelogic.cpp
字号:
for(int i=0;i <= (iTakeCount-iBaseCardCount);i += 3)
{//循环手里的牌
for(int j=0;j<iBaseCardCount;j += 3)
{
iResultCard[iBaseCardCount - j -1]=iTempCard[iTakeCount-(i+j)-1];//选出扑克
iResultCard[iBaseCardCount - (j+1) - 1]=iTempCard[iTakeCount-(i+j)-2];//选出扑克
iResultCard[iBaseCardCount - (j+2) - 1]=iTempCard[iTakeCount-(i+j)-3];//选出扑克
}
iResultCardCount = iBaseCardCount;
if (CanOutCard(iResultCard,iResultCardCount,iBaseCard,iBaseCardCount,IHandTmp,iHandCardCount))//如果能出牌
{
return true;
}
}
break;
}
}
//如果手里有炸弹
for(int i = 0; i < iHandCardCount - 3 ;i++)
{// AfxMessageBox("进入炸弹循环");
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;
}
}
}
//提取火箭
if ((IHandTmp[0] == 0x4F)&&(IHandTmp[1] == 0x4E)){
iResultCard[0] =IHandTmp[0];
iResultCard[1] =IHandTmp[1];
iResultCardCount=2;
return true;
}
}
else //第一个出牌者
{
for(int i=iHandCardCount;i>=0;i--)
{
if(CompareOnlyOne(iBaseCard[0],IHandTmp[i]))
{
iResultCard[0] = IHandTmp[i];
iResultCardCount = 1;
return true;
}
}
//iResultCardCount=1;
//iResultCard[0]=IHandTmp[iHandCardCount-1];
}
return false;
}
//是否可以甩牌
BOOL CUpGradeGameLogic::CanShowCard(BYTE iOutCard[], int iOutCardCount, int iOutStation,
BYTE * iCardArray[], int iCardArrayCount,
BYTE iResultCard[], int & 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;
}
}
return -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;
}
//删除扑克
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;
}
//
////获取牌型
//bool CUpGradeGameLogic::bCanFirstChu(BYTE iCardList[], int iCardCount)
//{
// SortCard(iCardList,NULL,iCardCount); //!!!!!!!!增加 顺序重排
// int firstpd=-1;
//
// if (IsRocket(iCardList,iCardCount)) return true;//火箭
//
// CCardParserDDZ p(iCardList, iCardCount,m_bLaiZiPaiDian);
//
// if (p.Is1 ( firstpd)) return true;//单牌
// if (p.Is2 ( firstpd)) return true;//对牌
//
// if (p.Is3 ( firstpd)) return true;//三同张
// if (p.IsBomb ( firstpd)) return true;//炸弹
//
// if((iCardList[0]!=0x4F)&&(iCardList[0]!=0x4E)&&(iCardList[0]!=0x01)&&(iCardList[0]!=0x11)&&(iCardList[0]!=0x21)&&(iCardList[0]!=0x31)){
// if (p.Is1s(firstpd)) return true;//单顺
// }
//
//
//
// if (p.Is2s ( firstpd)) return true;//双顺
// if (p.Is3s ( firstpd)) return true;//三顺
//
// if (p.Is3s1s ( firstpd) || p.Is3s2s ( firstpd)) return true;//三带一//////////////////
// if (p.Is4s1s1s ( firstpd) || p.Is4s2s ( firstpd)|| p.Is4s2d ( firstpd)) return true;//四带二///////////////
//
//
//
// return false;
//}
//是否可以出牌!!!!!!!!!!!!!!!!!!!!!!
BOOL CUpGradeGameLogic::CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[],
int iBaseCount, BYTE iHandCard[], int iHandCount)
{
//获取扑克类型
BYTE iBaseKind = GetCardShape(iBaseCard,iBaseCount);//上家所出牌
BYTE iOutKind = GetCardShape(iOutCard,iOutCount);//本家所出牌
//判断是否与这轮的出牌参数敏合
//火箭
//if (iBaseKind == UG_ROCKET) return FALSE;
//if (iOutKind == UG_ROCKET) return TRUE;
//炸弹
if ((iBaseKind == UG_BOMB) && (iOutKind == iBaseKind))//都出炸弹
{
if (iOutCount < iBaseCount) return FALSE;
if (iOutCount > iBaseCount) return TRUE;
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
if (iBaseKind == UG_BOMB) return FALSE;
if (iOutKind == UG_BOMB) return TRUE;
//其他类型
if (iOutKind != iBaseKind) return FALSE;
switch(iBaseKind)
{
case UG_ONLY_ONE://单牌
{
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
case UG_DOUBLE://对牌
{
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
case UG_THREE://三同张
{
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
case UG_THREE_AND_ONE://三带一
{
if (iOutCount != iBaseCount) return FALSE;
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
case UG_SINGLE_CONTINUE://单顺
{
if (iOutCount != iBaseCount) return FALSE;
//if (GetCardNum(iBaseCard[0]) == GetCardNum(iOutCard[0]))
//{
// if (IsSameHua(iBaseCard,iBaseCount) && IsSameHua(iOutCard,iOutCount))//同花顺无大小比较
// return FALSE;
// if (IsSameHua(iBaseCard,iBaseCount)) return FALSE;
// if (IsSameHua(iOutCard,iOutCount)) return TRUE;
//}
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
case UG_DOUBLE_CONTINUE://双顺
{
if (iOutCount != iBaseCount) return FALSE;
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
case UG_THREE_CONTINUE://三顺
{
if (iOutCount != iBaseCount) return FALSE;
return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
}
//case UG_PLANE_AND_WING://飞机带翅膀
// {
// if (iOutCount != iBaseCount) return FALSE;
// return CompareOnlyOne(iBaseCard[0],iOutCard[0]);
// }
}
return FALSE;
}
//查找分数
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;
}
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]; //!!!!
//BYTE iTempCard[52];
BYTE iTempCard[54]; //需要修改
::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;
}
//提取对牌函数
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);
}
//提取三顺
int CUpGradeGameLogic::TackThreeShun(BYTE iCardList[], int iCardCount, BYTE iThreeShunBuffer[], BOOL bRemoveCard)
{
int iCount = 0;
for(int i=0; i < iCardCount; i++)
{
if(GetCardNum(iCardList[i]) == GetCardNum(iCardList[i+1]))
{
iThreeShunBuffer[iCount] = iCardList[i];
iThreeShunBuffer[iCount+1] = iCardList[i+1];
iThreeShunBuffer[iCount+2] = iCardList[i+2];
if (bRemoveCard) iCardList[i] = iCardList[i+1] = iCardList[i+2]= 0;
while (++i < iCardCount)
{
if (GetCardNum(iCardList[i]) != GetCardNum(iCardList[i+1]))
{
break;
}
}
iCount += 3;
}
}
if (iCount && bRemoveCard) RemoveNummCard(iCardList,iCardCount);
return iCount;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -