📄 servermanage.cpp
字号:
// {
// playInfo.iScore[i] =m_iCurScoresArr[i];
// playInfo.iCardCnt[i] =m_iPlayRemainCardCnt[i];
//
// }
// for (int i = 0;i < 4;i++) SendGameData(i,&playInfo,sizeof(playInfo),MDM_GM_GAME_NOTIFY,ASS_MODIFY_PLAYINFO,0);
//
// SendWatchData(m_bMaxPeople,&playInfo,sizeof(playInfo),MDM_GM_GAME_NOTIFY,ASS_MODIFY_PLAYINFO,0);
// return;
//}
/******************************************************************************************************/
/***********************************************************************************************************/
//逻辑类
/***********************************************************************************************************/
//构造函数
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);
if (!bTrueHua)
{
//if ((iHuaKind==m_iNTHuaKind)||(GetCardNum(iCard)==m_iNTNum))
// return iHuaKind=UG_NT_CARD;
}
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==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[], BOOL 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]+=0;//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;
}
//获取扑克
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 (iCardList[0]==iCardList[1]);
}
//是否三条
BOOL CUpGradeGameLogic::IsThree(BYTE iCardList[], int iCardCount)
{
if (iCardCount!=3) return FALSE;
return ((iCardList[0]==iCardList[1])&&(iCardList[0]==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;
// //}
// //如果是主牌拖拉机(如打J,是副JJAA也属于拖拉机)
// int m1,m2;
// m1=iFirstCard&0xf0; m2=iNextCard&0xf0;
// //if( GetNTHuaKind()==m1 || GetNTHuaKind()==m2)
// //{
// // if( (iCardBulk==15 && GetCardBulk(iNextCard,FALSE)==14) ||
// // (iCardBulk==14 && GetCardBulk(iNextCard,FALSE)==15))
// // {
// // return true;
// // }
// //}
// if ((iFirstCard>iNextCard && GetCardBulk(iNextCard,FALSE)!=(iCardBulk-1)) ||
// (iFirstCard<iNextCard && 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::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 (GetCardListHua(iCardList,iCardCount)!=UG_ERROR_HUA)
// {
// if (IsOnlyOne(iCardList,iCardCount)) return UG_ONLY_ONE;
// if (IsDouble(iCardList,iCardCount)) return UG_DOUBLE;
// if (IsThree(iCardList,iCardCount)) return UG_THREE;
// if (IsDoubleTrackor(iCardList,iCardCount)) return UG_DOUBLE_TRACKOR;
// if (IsThreeTrackor(iCardList,iCardCount)) return UG_THREE_TARCKOR;
// if (IsShowCard(iCardList,iCardCount)) return UG_SHOW_CARD;
// }
// return UG_ERROR_KIND;
//}
////对比单牌
//BOOL CUpGradeGameLogic::CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard)
//{
// 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::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;
}
//混乱扑克
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);
//for (int i=0;i<108;i++)
// ::CopyMemory(&iCard[i],&m_CardArray[53],1);
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::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::CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[],
// int iBaseCount, BYTE iHandCard[], int iHandCount)
//{
//
// return TRUE;
//}
////用户请求离开
//bool CServerGameDesk::UserHaveThing(BYTE bDeskStation, char * szMessage)
//{
// if (m_bGameStation<GS_SEND_CARD) return TRUE;
//
// m_iLeaveArgee|=1<<bDeskStation;
// if (m_iLeaveArgee!=15)
// {
// HaveThingStruct HaveThing;
// HaveThing.pos=bDeskStation;
// ::CopyMemory(HaveThing.szMessage,szMessage,60*sizeof(char));
// for (int i=0;i<m_bMaxPeople;i++)
// if (i!=bDeskStation) SendGameData(i,&HaveThing,sizeof(HaveThing),MDM_GM_GAME_NOTIFY,ASS_HAVE_THING,0);
// }
// else GameFinish(bDeskStation,GF_SALE);
//
// return TRUE;
//}
//
////同意用户离开
//bool CServerGameDesk::ArgeeUserLeft(BYTE bDeskStation, BOOL bArgee)
//{
// if (bArgee) m_iLeaveArgee|=1<<bDeskStation;
// else m_iLeaveArgee&=~1<<bDeskStation;
// if (m_iLeaveArgee!=15)
// {
// //m_bQueryQuit=true;
// LeaveResultStruct Leave;
// Leave.bDeskStation=bDeskStation;
// Leave.bArgeeLeave=bArgee;
// for (int i=0;i<m_bMaxPeople;i++)
// if (i!=bDeskStation) SendGameData(i,&Leave,sizeof(Leave),MDM_GM_GAME_NOTIFY,ASS_LEFT_RESULT,0);
// }
// else GameFinish(bDeskStation,GF_SALE);
//
// return TRUE;
//}
//定时器消息
//bool CServerGameDesk::OnTimer(UINT uTimerID)
//{
//
//
// if (uTimerID==TIME_GAME_FINISH) //结束定时器
// {
// KillTimer(TIME_GAME_FINISH);
// if (m_bGameStation==GS_PLAY_GAME)
// }
// return __super::OnTimer(uTimerID);
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -