📄 servermanage.cpp
字号:
m_iUserCardCount[bDeskStation] = 0;
m_iCurMiCi++;
m_iMiCiArr[bDeskStation] = m_iCurMiCi;
m_iWinStation = bDeskStation;
/////上半局如果双夹则结束此局,否则进行下半局
if(!bFlagNextHalf)
{
bool flag1,flag2;
flag1 = (m_iMiCiArr[m_iUpGradePeople] > 0 && m_iMiCiArr[(m_iUpGradePeople+2)%4] > 0) &&
((m_iUserCardCount[(m_iUpGradePeople+1)%4] != 0 && m_iUserCardCount[(m_iUpGradePeople+3)%4] != 0) ||
(m_iCurScoresArr[(m_iUpGradePeople+1)%4] + m_iCurScoresArr[(m_iUpGradePeople+3)%4] < 60)
);
flag2 = (m_iMiCiArr[(m_iUpGradePeople+1)%4] > 0 && m_iMiCiArr[(m_iUpGradePeople+3)%4] > 0) &&
((m_iUserCardCount[m_iUpGradePeople] != 0 && m_iUserCardCount[(m_iUpGradePeople+2)%4] != 0) ||
(m_iCurScoresArr[m_iUpGradePeople] + m_iCurScoresArr[(m_iUpGradePeople+2)%4] < 60)
);
if (flag1 || flag2)
{
m_bDoubleClip = true;
m_iDoubleWin = bDeskStation;
SetTimer(TIME_GAME_FINISH,2000);
return TRUE;
}
else ///进行下半局
{
if ((m_iMiCiArr[m_iUpGradePeople] > 0 && m_iMiCiArr[(m_iUpGradePeople+2)%4] > 0) ||
(m_iMiCiArr[(m_iUpGradePeople+1)%4] > 0 && m_iMiCiArr[(m_iUpGradePeople+3)%4] > 0)
)
{
StartNextHalf();
return TRUE;
}
}
}
if(bFlagNextHalf) ////下半局结束
{
if ((m_iMiCiArr[m_iUpGradePeople] > 0 && m_iMiCiArr[(m_iUpGradePeople+2)%4] > 0) ||
(m_iMiCiArr[(m_iUpGradePeople+1)%4] > 0 && m_iMiCiArr[(m_iUpGradePeople+3)%4] > 0)
)
{
bFlagNextHalf = false;
SetTimer(TIME_GAME_FINISH,2000);
return TRUE;
}
}
}
NewPlayTurn(bDeskStation);
m_iCurStation[m_iOutCardPeople] = 0;
OutCardMsg UserOut;
UserOut.bDeskStation=bDeskStation;
UserOut.iNextDeskStation=m_iOutCardPeople;
UserOut.iCardCount=iCardCount;
::CopyMemory(UserOut.iCardList,iOutCard,sizeof(BYTE)*iCardCount);
int iSendSize=sizeof(UserOut)-sizeof(UserOut.iCardList)+sizeof(BYTE)*iCardCount;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
SendWatchData(m_bMaxPeople,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
return TRUE;
}
//新一轮开始
BOOL CServerGameDesk::NewPlayTurn(BYTE bDeskStation)
{
int iWiner;
int lastOutPeople = m_iLastOutPeople;
IsNewTurn = false;
m_iOutCardPeople = bDeskStation;
for (int i = 0;i < 3;i++)
{
//计算下一出牌者
m_iOutCardPeople = (m_iOutCardPeople + 1) % 4;
if (m_iOutCardPeople == m_iLastOutPeople) m_iLastOutPeople = -1;
if (m_iMiCiArr[m_iOutCardPeople] < 0)break;
}
if (m_iLastOutPeople < 0)
{
if (lastOutPeople >= 0)
{
m_iCurScoresArr[lastOutPeople] += m_iCurScores;
m_iBaseOutCount=0;
////m_iOutCardPeople=m_iOutCardPeople;
m_iFirstOutPeople=m_iOutCardPeople;
iWiner = m_iOutCardPeople;
m_iCurStation[m_iOutCardPeople] = 0;
::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,MDM_GM_GAME_NOTIFY,ASS_NEW_TURN,iWiner);
SendWatchData(m_bMaxPeople,MDM_GM_GAME_NOTIFY,ASS_NEW_TURN,iWiner);
IsNewTurn = true;
if (m_iCurScores != 0)
{
//m_iGamePoint+=m_iCurScores;
//GamePointStruct GamePoint;
//GamePoint.iPoint=m_iCurScores;
//GamePoint.bAdd=true;
//for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,iWiner);
//SendWatchData(m_bMaxPeople,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
ModifyPlayInfo(-1,0);
}
m_iCurScores = 0;
}
}
return TRUE;
}
void CServerGameDesk::ModifyPlayInfo(BYTE bDeskStation, int iCardCount)
{
if (bDeskStation >= 0) m_iPlayRemainCardCnt[bDeskStation] -= iCardCount;
tagPlayInfoStruct playInfo;
for (int i=0;i<4;i++)
{
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;
}
////开始下半局
void CServerGameDesk::StartNextHalf()
{
m_bGameStation=GS_WAIT_NEXT;
for (int i=0;i<m_bMaxPeople;i++)
{
if (m_pUserInfo[i]!=NULL)
m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
}
ReSetGameState(GF_NORMAL);
tagLastHalfStruct lastHalfInfo;
lastHalfInfo.iScores[0] = m_iCurScoresArr[m_iUpGradePeople] + m_iCurScoresArr[(m_iUpGradePeople + 2) % 4];
lastHalfInfo.iScores[1] = m_iCurScoresArr[(m_iUpGradePeople + 1) % 4] + m_iCurScoresArr[(m_iUpGradePeople + 3) % 4];
int iFirst;
for (int i = 0;i < 4;i++) ////下半局第一个出牌的人是上半局的“上游”
{
if (m_iMiCiArr[i] == 1) iFirst = i;
}
::strcpy(lastHalfInfo.szName,m_pUserInfo[iFirst]->m_UserData.szName);
for (int i = 0;i < 4;i++) SendGameData(i,&lastHalfInfo,sizeof(lastHalfInfo),MDM_GM_GAME_NOTIFY,ASS_START_NEXT_HALF,0);
SendWatchData(m_bMaxPeople,&lastHalfInfo,sizeof(lastHalfInfo),MDM_GM_GAME_NOTIFY,ASS_START_NEXT_HALF,0);
bFlagNextHalf = 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;
}
/******************************************************************************************************/
/***********************************************************************************************************/
// 升级逻辑类
/***********************************************************************************************************/
//构造函数
CUpGradeGameLogic::CUpGradeGameLogic(void)
{
m_iStation[4]=500;
for (int i=0;i<4;i++) m_iStation[i]=100*i;
}
//获取扑克花色
BYTE CUpGradeGameLogic::GetCardHuaKind(BYTE iCard, BOOL bTrueHua)
{
int iHuaKind=(iCard&UG_HUA_MASK);
return iHuaKind;
}
//获取扑克大小
int CUpGradeGameLogic::GetCardBulk(BYTE iCard, BOOL bExtVol)
{
if ((iCard==0x4E)||(iCard==0x4F))
{
return bExtVol?(iCard-58):(iCard-61); //大小鬼
}
int iCardNum=GetCardNum(iCard);
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);
}
//排序操作
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]));
}
//获取牌型
BYTE CUpGradeGameLogic::GetCardShape(BYTE iCardList[], int iCardCount)
{
return UG_ERROR_KIND;
}
//对比单牌
BOOL CUpGradeGameLogic::CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard)
{
return TRUE;
}
//自动出牌函数
BOOL CUpGradeGameLogic::AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[], int iBaseCardCount,
BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut)
{
return TRUE;
}
//清除 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -