📄 servermanage1.cpp
字号:
//LeaveResultStruct * pLeave=(LeaveResultStruct *)pNetHead;
//return ArgeeUserLeft(bDeskStation,pLeave->bArgeeLeave);
}
}
return __super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
}
//计算得分
int CServerGameDesk::GetUpGrade(int iGamePoint, int iPlayCardCount)
{
if (iPlayCardCount==2)
{
if (iGamePoint==0) return 3;
else if (iGamePoint<40) return 2;
else if (iGamePoint<80) return 1;
else return -(iGamePoint-40)/40;
}
if (iPlayCardCount==3)
{
if (iGamePoint==0) return 3;
else if (iGamePoint<60) return 2;
else if (iGamePoint<120) return 1;
else return -(iGamePoint-60)/60;
}
return 0;
}
//用户坐到游戏桌
//BYTE CServerGameDesk::UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo)
//{
// if ((m_pUserInfo[bDeskStation]!=NULL)&&(m_bGameStation==GS_WAIT_ARGEE)&&(bDeskStation==0))
// {
// //更改数据
// m_iDeskFlags=0;
// m_bGameStation=GS_WAIT_SETGAME;
//
// //发送大厅取消同意消息
// RoomArgeeStruct RoomArgee;
// RoomArgee.bDeskNO=m_iDeskIndex;
// RoomArgee.bDeskStation=255;
// m_pDataManage->m_SocketManage.BatchSendData(&RoomArgee,sizeof(RoomArgee),TRUE,MDM_ROOM_INFO,ASS_UNARGEE_INFO,0);
// }
// return CBase_GameDesk::UserSitDesk(bDeskStation,pUserInfo,bAdd);
//}
//用户设置游戏
BOOL CServerGameDesk::UserSetGame(UserArgeeGame * pGameSet)
{
//效验数据
if (m_bGameStation!=GS_WAIT_SETGAME) return FALSE;
//效验数据
if (((pGameSet->iPlayCount<=0)||(pGameSet->iPlayCount>99))||
(pGameSet->iBeginStation<2)||(pGameSet->iEndStation>14)||
(pGameSet->iBeginStation>pGameSet->iEndStation))
return FALSE;
if ((m_CardCount & pGameSet->iCardCount)==0) return FALSE;
//设置数据
m_iLessCount=pGameSet->iPlayCount;
m_iPlayCardCount=(pGameSet->iCardCount&1)?2:3;
m_iBeginStation=pGameSet->iBeginStation;
m_iEndStation=pGameSet->iEndStation;
m_iBeenPlayGame=0;
m_bGameStation=GS_WAIT_ARGEE;
m_Logic.SetNTCardNum(pGameSet->iBeginStation);
m_Logic.SetNTHuaKind(UG_ERROR_HUA);
m_iPlayNTNum[0]=pGameSet->iBeginStation;
m_iPlayNTNum[1]=pGameSet->iBeginStation;
//发送消息
UserArgeeGame Agree;
Agree.iBeginStation=m_iBeginStation;
Agree.iEndStation=m_iEndStation;
Agree.iPlayCount=m_iLessCount;
Agree.iCardCount=m_iPlayCardCount;
for (int i=0;i<4;i++) SendGameData(i,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);
SendWatchData(m_bMaxPeople,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);
return TRUE;
}
//发送扑克给用户
BOOL CServerGameDesk::SendCard()
{
if (m_iSendCardPos==((m_iPlayCardCount==2)?100:156)) //发牌完成
{
KillTimer(TIME_SEND_CARD);
if (m_iNtPeople==-1) //等待反牌
{
SetTimer(TIME_WAIT_NT,16000);
NetMessageHead SendFinish;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,15);
SendWatchData(m_bMaxPeople,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,0);
}
else
{
SetTimer(TIME_WAIT_NT,6000);
NetMessageHead SendFinish;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,5);
SendWatchData(m_bMaxPeople,&SendFinish,sizeof(SendFinish),MDM_GM_GAME_NOTIFY,ASS_SEND_FINISH,0);
}
return FALSE;
}
//继续发送扑克
SendCardStruct SendCard;
SendCard.iCard=m_iUserCard[m_iSendCardPos%4][m_iSendCardPos/m_bMaxPeople];
SendGameData(m_iSendCardPos%4,&SendCard,sizeof(SendCard),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0);
SendWatchData(m_iSendCardPos%4,&SendCard,sizeof(SendCard),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0);
m_iUserCardCount[m_iSendCardPos%4]++;
m_iSendCardPos++;
return TRUE;
}
//用户反牌
BOOL CServerGameDesk::UserNtCard(BYTE bDeskStation, int iHuaKind, int iCardCount)
{
if ((iHuaKind==UG_HEI_TAO)||(iHuaKind==UG_HONG_TAO)||(iHuaKind==UG_MEI_HUA)||(iHuaKind==UG_FANG_KUAI))
{
//效验数据
if ((iCardCount<1)||(iCardCount>3)) return FALSE;
//调整数据
if (iCardCount<m_iNtCardCount) return TRUE;
if (bDeskStation==m_iNtPeople)
{
if ((iHuaKind!=m_Logic.GetNTHuaKind())&&(iCardCount<=m_iNtCardCount)) return TRUE;
}
else
{
if (m_iNtCardCount==0)
{
iCardCount=1;
}
else if ((iCardCount>m_iNtCardCount)||(iHuaKind>m_Logic.GetNTHuaKind()))
{
iCardCount=m_iNtCardCount+(iHuaKind>m_Logic.GetNTHuaKind())?0:1;
iCardCount=__min(iCardCount,3);
}
else return TRUE;
}
//设置数据
m_iNtPeople=bDeskStation;
m_iNtCardCount=iCardCount;
m_Logic.SetNTHuaKind(iHuaKind);
//发送消息
ServerNtStruct ServerNt;
ServerNt.bDeskStation=bDeskStation;
ServerNt.iHuaKind=iHuaKind;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&ServerNt,sizeof(ServerNt),MDM_GM_GAME_NOTIFY,ASS_NT_CARD,0);
SendWatchData(m_bMaxPeople,&ServerNt,sizeof(ServerNt),MDM_GM_GAME_NOTIFY,ASS_NT_CARD,0);
return TRUE;
}
return FALSE;
}
//发送底牌
BOOL CServerGameDesk::SendBackCard()
{
BOOL bExtBack=FALSE;
if (m_iUpGradePeople==-1) //抢庄状态
{
m_iUpGradePeople=(m_iNtPeople==-1)?0:m_iNtPeople;
}
if (m_iNtPeople==-1) //没有人反牌,分析主牌
{
bExtBack=TRUE;
m_iNtPeople=m_iUpGradePeople;
m_Logic.SetNTHuaKind(UG_HEI_TAO);
}
//保存数据
m_bGameStation=GS_WAIT_BACK;
::CopyMemory(&m_iUserCard[m_iUpGradePeople][m_iUserCardCount[m_iUpGradePeople]],
m_iBackCard,sizeof(BYTE)*((m_iPlayCardCount==2)?8:6));
m_iUserCardCount[m_iUpGradePeople]+=((m_iPlayCardCount==2)?8:6);
if (bExtBack==FALSE)
{
//发送状态信息
BackStationStruct UserGiveBack;
UserGiveBack.iNtPeople=m_iNtPeople;
UserGiveBack.iGiveBackStation=m_iUpGradePeople;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserGiveBack,sizeof(UserGiveBack),MDM_GM_GAME_NOTIFY,ASS_WAIT_BACK,0);
SendWatchData(m_bMaxPeople,&UserGiveBack,sizeof(UserGiveBack),MDM_GM_GAME_NOTIFY,ASS_WAIT_BACK,0);
//发送底牌信息
BackCardStruct BackCard;
BackCard.iBackCardCount=(m_iPlayCardCount==2)?8:6;
::CopyMemory(BackCard.iBackCard,m_iBackCard,sizeof(BYTE)*BackCard.iBackCardCount);
SendGameData(m_iUpGradePeople,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD,0);
SendWatchData(m_iUpGradePeople,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD,0);
}
else //发送底牌信息
{
BackCardExStruct BackCard;
BackCard.iNtHua=m_Logic.GetNTHuaKind();
BackCard.iGiveBackPeople=m_iUpGradePeople;
BackCard.iBackCardCount=(m_iPlayCardCount==2)?8:6;
::CopyMemory(BackCard.iBackCard,m_iBackCard,sizeof(BYTE)*BackCard.iBackCardCount);
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_EX,0);
SendWatchData(m_bMaxPeople,&BackCard,sizeof(BackCard),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_EX,0);
}
return TRUE;
}
//用户上交底牌
BOOL CServerGameDesk::UserGiveBackCard(BYTE bDeskStation, BYTE iBackCard[], int iCardCount)
{
if ((iCardCount!=((m_iPlayCardCount==2)?8:6))||(bDeskStation!=m_iUpGradePeople)) return FALSE;
//记录数据
::CopyMemory(m_iBackCard,iBackCard,sizeof(BYTE)*iCardCount);
if (m_Logic.RemoveCard(iBackCard,iCardCount,m_iUserCard[bDeskStation],m_iUserCardCount[bDeskStation])==0)
return FALSE;
m_iUserCardCount[bDeskStation]-=iCardCount;
//发送结果消息
BackCardStruct BackCard;
BackCard.iBackCardCount=(m_iPlayCardCount==2)?8:6;
::CopyMemory(BackCard.iBackCard,m_iBackCard,sizeof(BYTE)*BackCard.iBackCardCount);
SendGameData(bDeskStation,&BackCard,sizeof(BackCardStruct),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_RES,0);
SendWatchData(bDeskStation,&BackCard,sizeof(BackCardStruct),MDM_GM_GAME_NOTIFY,ASS_BACK_CARD_RES,0);
//开始游戏
BeginPlayUpGrade();
return TRUE;
}
//游戏开始
BOOL CServerGameDesk::BeginPlayUpGrade()
{
//设置数据
m_bGameStation=GS_PLAY_GAME;
m_iBaseOutCount=0;
m_iOutCardPeople=m_iUpGradePeople;
m_iFirstOutPeople=m_iUpGradePeople;
m_iGamePoint=0;
::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
//排列扑克
for (int i=0;i<4;i++) m_Logic.SortCard(m_iUserCard[i],NULL,m_iUserCardCount[i]);
//发送游戏开始消息
BeginPlayStruct Begin;
Begin.iOutDeskStation=m_iOutCardPeople;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&Begin,sizeof(Begin),MDM_GM_GAME_NOTIFY,ASS_GAME_PLAY,0);
SendWatchData(m_bMaxPeople,&Begin,sizeof(Begin),MDM_GM_GAME_NOTIFY,ASS_GAME_PLAY,0);
return TRUE;
}
//用户出牌
BOOL CServerGameDesk::UserOutCard(BYTE bDeskStation, BYTE iOutCard[], int iCardCount)
{
if (bDeskStation!=m_iOutCardPeople) return FALSE;
BOOL bShowFalse=FALSE;
//记录数据
if (bDeskStation==m_iFirstOutPeople) //第一出牌者
{
//数据效验
m_Logic.SortCard(iOutCard,NULL,iCardCount);
BYTE iOutCardKind=m_Logic.GetCardShape(iOutCard,iCardCount);
if (iOutCardKind==UG_ERROR_KIND) return FALSE;
if (iOutCardKind==UG_SHOW_CARD) //判断甩牌
{
int iResultCount=0;
BYTE iResultCard[39];
BYTE * iCardArray[4];
for (int i=0;i<4;i++) iCardArray[i]=m_iUserCard[i];
if (m_Logic.CanShowCard(iOutCard,iCardCount,bDeskStation,iCardArray,m_iUserCardCount[0],iResultCard,iResultCount)==FALSE)
{
//甩牌不成功
bShowFalse=TRUE;
m_PunishPoint[bDeskStation]++;
//设置数据包
OutShowCardStruct ShowCardFalse;
ShowCardFalse.iCardCount=iCardCount;
ShowCardFalse.iResultCount=iResultCount;
ShowCardFalse.bDeskStation=bDeskStation;
::CopyMemory(ShowCardFalse.iCardList,iOutCard,iCardCount);
::CopyMemory(&ShowCardFalse.iCardList[iCardCount],iResultCard,iResultCount);
//设置数据
iCardCount=iResultCount;
::CopyMemory(iOutCard,iResultCard,sizeof(BYTE)*iResultCount);
//发送消息
int iSendSize=sizeof(ShowCardFalse)-sizeof(ShowCardFalse.iCardList)
+sizeof(BYTE)*(ShowCardFalse.iResultCount+ShowCardFalse.iCardCount);
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&ShowCardFalse,iSendSize,MDM_GM_GAME_NOTIFY,ASS_SHOW_CARD,0);
SendWatchData(m_bMaxPeople,&ShowCardFalse,iSendSize,MDM_GM_GAME_NOTIFY,ASS_SHOW_CARD,0);
}
}
m_iBaseOutCount=iCardCount;
}
else //跟随出牌者
{
if (iCardCount!=m_iBaseOutCount) return FALSE;
m_Logic.SortCard(iOutCard,NULL,iCardCount);
}
//删除扑克
if (m_Logic.RemoveCard(iOutCard,iCardCount,m_iUserCard[bDeskStation],m_iUserCardCount[bDeskStation])==0)
return FALSE;
m_iUserCardCount[bDeskStation]-=iCardCount;
//记录出牌信息
m_iDeskCardCount[bDeskStation]=iCardCount;
::CopyMemory(m_iDeskCard[bDeskStation],iOutCard,sizeof(BYTE)*iCardCount);
//计算下一出牌者
m_iOutCardPeople=(bDeskStation+1)%4;
if (m_iOutCardPeople==m_iFirstOutPeople) m_iOutCardPeople=-1;
if (bShowFalse==TRUE) return TRUE;
//判断是否最后出牌
if (m_iUserCardCount[bDeskStation]==0)
{
BatchOutCardMsg UserOut;
for (int i=0;i<4;i++)
{
m_iUserCardCount[i]=0;
m_iDeskCardCount[i]=iCardCount;
if (i==bDeskStation)
{
::CopyMemory(m_iDeskCard[i],iOutCard,sizeof(BYTE)*iCardCount);
::CopyMemory(&UserOut.iCardList[i*iCardCount],iOutCard,sizeof(BYTE)*iCardCount);
}
else
{
::CopyMemory(m_iDeskCard[i],m_iUserCard[i],sizeof(BYTE)*iCardCount);
::CopyMemory(&UserOut.iCardList[i*iCardCount],m_iUserCard[i],sizeof(BYTE)*iCardCount);
}
}
//设置数据信息
UserOut.iCardCount=iCardCount;
m_iOutCardPeople=-1;
int iSendSize=sizeof(UserOut)-sizeof(UserOut.iCardList)+sizeof(BYTE)*iCardCount*4;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_BATCH_OUT,0);
SendWatchData(m_bMaxPeople,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_BATCH_OUT,0);
}
else
{
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);
}
//判断一轮是否结束
if (m_iOutCardPeople==-1)
{
//计算胜利者
BYTE * pUserOutCard[4];
for (int i=0;i<4;i++) pUserOutCard[i]=m_iDeskCard[(m_iFirstOutPeople+4+i)%4];
int iWiner=(m_Logic.CompareCard(pUserOutCard,m_iBaseOutCount)+m_iFirstOutPeople)%4;
if ((iWiner!=m_iUpGradePeople)&&(iWiner!=(m_iUpGradePeople+2)%4))
{
//发送分数
int iPoint=0;
for (int i=0;i<4;i++) iPoint+=m_Logic.FindPoint(m_iDeskCard[i],m_iBaseOutCount);
if (iPoint!=0)
{
m_iGamePoint+=iPoint;
GamePointStruct GamePoint;
GamePoint.iPoint=iPoint;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
SendWatchData(m_bMaxPeople,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
}
}
if (m_iUserCardCount[bDeskStation]==0) //最后一轮
{
if ((iWiner!=m_iUpGradePeople)&&(iWiner!=(m_iUpGradePeople+2)%4))
{
//计算底牌分数
BYTE iCardKind=m_Logic.GetCardShape(m_iDeskCard[bDeskStation],m_iDeskCardCount[bDeskStation]);
m_iGamePoint+=iCardKind*2*m_Logic.FindPoint(m_iBackCard,(m_iPlayCardCount==2)?8:6);
}
SetTimer(TIME_GAME_FINISH,5000);
}
else NewPlayTurn(iWiner); //进行新一轮游戏
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -