📄 servermanage.cpp
字号:
#include "StdAfx.h"
#include "ServerManage.h"
//构造函数
CServerGameDesk::CServerGameDesk(void):CGameDesk(FULL_BEGIN)
{
//m_bQueryQuit=false;
m_bQueryQuit=true;//只要结束就退出
m_iEnableWatch=0;
m_iLeaveArgee=0;
m_iNtCardCount=0;
m_iLessCount=0;
m_iPlayCardCount=0;
m_iBeginStation=0;
m_iEndStation=0;
m_iBaseOutCount=0;
m_iNtPeople=-1;
m_iFirstOutPeople=-1;
m_iOutCardPeople=-1;
m_iUpGradePeople=-1;
m_iBeenPlayGame=0;
m_iGamePoint=0;
m_bGameStation=GS_WAIT_SETGAME;
m_CardCount=PLAY_TWO_CARD;
::memset(&m_PunishPoint,0,sizeof(m_PunishPoint));
::memset(m_iPlayNTNum,0,sizeof(m_iPlayNTNum));
::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
::memset(m_iCurStation,0,sizeof(m_iCurStation));
memset(m_iCurScoresArr,0,sizeof(m_iCurScoresArr));
memset(m_iPlayRemainCardCnt,0,sizeof(m_iPlayRemainCardCnt));
}
//析构函数
CServerGameDesk::~CServerGameDesk(void)
{
}
//定时器消息
bool CServerGameDesk::OnTimer(UINT uTimerID)
{
if (uTimerID==TIME_SEND_CARD) //发牌定时器
{
if (m_bGameStation==GS_SEND_CARD) SendCard();
else KillTimer(TIME_SEND_CARD);
return TRUE;
}
if (uTimerID==TIME_GAME_FINISH) //结束定时器
{
KillTimer(TIME_GAME_FINISH);
if (m_bGameStation==GS_PLAY_GAME) GameFinish(0,GF_NORMAL);
}
return __super::OnTimer(uTimerID);
}
//获取游戏状态信息
bool CServerGameDesk::OnGetGameStation(BYTE bDeskStation, UINT uSocketID, bool bWatchUser)
{
switch (m_bGameStation)
{
case GS_WAIT_SETGAME: //游戏没有开始状态
{
GameStation_1 GameStation;
::memset(&GameStation,0,sizeof(GameStation));
GameStation.iCardCount=m_CardCount;
GameStation.iVersion=7;
GameStation.iVersion2=0;
//发送数据
SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,sizeof(GameStation));
MessageStruct Mess;
ZeroMemory(Mess.Message,200);
strcpy(Mess.Message,"欢迎你参加原子游戏,祝你玩得开心,你的快乐就是我们的快乐!");
SendGameData(bDeskStation,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
return TRUE;
}
case GS_WAIT_ARGEE: //等待玩家开始状态
{
GameStation_2 GameStation;
::memset(&GameStation,0,sizeof(GameStation));
GameStation.iPlayCount=m_iLessCount;
GameStation.iCardCount=m_iPlayCardCount;
GameStation.iBeginStation=m_iBeginStation;
GameStation.iEndStation=m_iEndStation;
//发送数据
SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,sizeof(GameStation));
return TRUE;
}
case GS_SEND_CARD: //发牌状态
{
GameStation_3 GameStation;
::memset(&GameStation,0,sizeof(GameStation));
GameStation.iPlayCount=m_iLessCount;
GameStation.iCardCount=m_iPlayCardCount;
GameStation.iUpGradePeople=m_iUpGradePeople;
GameStation.iBeenPlayGame=m_iBeenPlayGame;
GameStation.iUserCardCount=m_iUserCardCount[bDeskStation];
::CopyMemory(GameStation.iUserCard,m_iUserCard[bDeskStation],sizeof(BYTE)*m_iUserCardCount[bDeskStation]);
//发送数据
int iSendSize=sizeof(GameStation)-sizeof(GameStation.iUserCard)+sizeof(BYTE)*m_iUserCardCount[bDeskStation];
SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,iSendSize);
return TRUE;
}
case GS_PLAY_GAME: //游戏中状态
{
GameStation_4 GameStation;
::memset(&GameStation,0,sizeof(GameStation));
GameStation.iPlayCount=m_iLessCount;
GameStation.iCardCount=m_iPlayCardCount;
GameStation.iUpGradePeople=m_iUpGradePeople;
GameStation.iBeenPlayGame=m_iBeenPlayGame;
GameStation.iOutCardPeople=m_iOutCardPeople;
GameStation.iFirstOutPeople=m_iFirstOutPeople;
GameStation.iBaseOutCount=m_iBaseOutCount;
GameStation.iDaoCard = m_iDaoCard;
GameStation.bNextHalf = bFlagNextHalf;
GameStation.iUserCardCount=m_iUserCardCount[bDeskStation];
::CopyMemory(GameStation.iCurStation,m_iCurStation,sizeof(m_iCurStation));
::CopyMemory(GameStation.iUserCardList,m_iUserCard[bDeskStation],sizeof(BYTE)*m_iUserCardCount[bDeskStation]);
::CopyMemory(GameStation.iRemainCard,m_iPlayRemainCardCnt,sizeof(m_iPlayRemainCardCnt));
::CopyMemory(GameStation.iUserPoint,m_iCurScoresArr,sizeof(m_iCurScoresArr));
int iPos=GameStation.iUserCardCount;
for (int i=0;i<4;i++)
{
GameStation.iDeskCardCount[i]=m_iDeskCardCount[i];
::CopyMemory(&GameStation.iUserCardList[iPos],m_iDeskCard[i],sizeof(BYTE)*m_iDeskCardCount[i]);
iPos+=m_iDeskCardCount[i];
}
//发送数据
int iSendSize=sizeof(GameStation)-sizeof(GameStation.iUserCardList)+sizeof(BYTE)*iPos;
SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,iSendSize);
return TRUE;
}
case GS_WAIT_NEXT: //等待下一盘游戏开始
{
GameStation_5 GameStation;
::memset(&GameStation,0,sizeof(GameStation));
GameStation.iPlayCount=m_iLessCount;
GameStation.iCardCount=m_iPlayCardCount;
GameStation.iUpGradePeople=m_iUpGradePeople;
GameStation.iBeenPlayGame=m_iBeenPlayGame;
//发送数据
SendGameStation(bDeskStation,uSocketID,bWatchUser,&GameStation,sizeof(GameStation));
return TRUE;
}
}
return false;
}
//重置游戏状态
bool CServerGameDesk::ReSetGameState(BYTE bLastStation)
{
KillTimer(TIME_SEND_CARD);
KillTimer(TIME_WAIT_NT);
KillTimer(TIME_GAME_FINISH);
if ((bLastStation==GFF_FORCE_FINISH)||(bLastStation==GF_SALE))
{
m_iLessCount=0;
m_iPlayCardCount=0;
m_iBeginStation=0;
m_iEndStation=0;
m_iBeenPlayGame=0;
m_iUpGradePeople=-1;
::memset(m_iPlayNTNum,0,sizeof(m_iPlayNTNum));
::memset(m_PunishPoint,0,sizeof(m_PunishPoint));
}
//m_bQueryQuit=false;
m_bQueryQuit=true;//只要结束就退出
m_iLeaveArgee=0;
m_iGamePoint=0;
m_iBaseOutCount=0;
m_iFirstOutPeople=-1;
m_iOutCardPeople=-1;
m_iNtPeople=-1;
m_iNtCardCount=0;
m_iSendCardPos=0;
memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
memset(m_iUserCardCount,0,sizeof(m_iUserCardCount));
return TRUE;
}
//游戏开始
bool CServerGameDesk::GameBegin(BYTE bBeginFlag)
{
if (__super::GameBegin(bBeginFlag)==false)
return false;
//设置状态
//m_bQueryQuit=false;
m_bQueryQuit=true;//只要结束就退出
m_iNtPeople=-1;
m_iNtCardCount=0;
m_iSendCardPos=0;
m_iDoubleWin = -1;
m_bDoubleClip = false;
if (!bFlagNextHalf) m_iBeenPlayGame++;
m_bGameStation=GS_SEND_CARD;
::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
::memset(m_iUserCardCount,0,sizeof(m_iUserCardCount));
m_iCurMiCi = 0;
m_iCurScores = 0;
memset(m_iCurScoresArr,0,sizeof(m_iCurScoresArr));
::CopyMemory(m_iPlayRemainCardCnt,m_iUserCardCount,sizeof(m_iUserCardCount));
//发送开始消息
BeginUpgradeStruct BeginMessage;
BeginMessage.iPlayCount=m_iBeenPlayGame;
BeginMessage.iUpgradeStation=m_iUpGradePeople;
for (int i=0;i<4;i++) SendGameData(i,&BeginMessage,sizeof(BeginMessage),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);
SendWatchData(m_bMaxPeople,&BeginMessage,sizeof(BeginMessage),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0);
//分发扑克
//BYTE iCardArray[162];
BYTE iCardArray[162];
//m_Logic.RandCard(iCardArray,(m_iPlayCardCount==2)?108:162);
m_Logic.RandCard(iCardArray,162);
int index = rand() % 162;
m_iDaoCard = iCardArray[index];////产生刀牌
int iFirst;
if (!bFlagNextHalf) iFirst = ((m_iDaoCard&UG_VALUE_MASK) + 1) % 4; ////每局第一个摸牌的人
else
{
for (int i = 0;i < 4;i++) ////下半局第一个摸牌的人是上半局的“上游”
{
if (m_iMiCiArr[i] == 1) iFirst = i;
}
}
m_iFirstTouchCard = iFirst;
::CopyMemory(m_iUserCard[iFirst],&iCardArray[0],sizeof(BYTE)*41);
::CopyMemory(m_iUserCard[(iFirst+1)%4],&iCardArray[41],sizeof(BYTE)*41);
::CopyMemory(m_iUserCard[(iFirst+2)%4],&iCardArray[82],sizeof(BYTE)*40);
::CopyMemory(m_iUserCard[(iFirst+3)%4],&iCardArray[122],sizeof(BYTE)*40);
//发牌消息
SetTimer(TIME_SEND_CARD,200);
return TRUE;
}
//游戏结束
bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag)
{
//得到最小数的金币
long m_dwMaxPoint=0;
bool bSetMaxMoney=false;
for (BYTE i=0;i<m_bMaxPeople;i++)
{
if (m_pUserInfo[i]!=NULL)
{
if (bSetMaxMoney==false)
{
bSetMaxMoney=true;
m_dwMaxPoint=(long int)m_pUserInfo[i]->m_UserData.dwPoint-1;
}
else
m_dwMaxPoint=__min(m_dwMaxPoint,(long int)m_pUserInfo[i]->m_UserData.dwPoint-1);
}
}
if(m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME && m_dwMaxPoint<0)
{
TRACE("出现错误,升级金币或比赛游戏中,玩家的金币数为负数.");
return false;
}
//编写代码
switch (bCloseFlag)
{
case GF_NORMAL: //游戏正常结束
{
int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
//计算得分
int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);
//游戏结束
GameEndStruct GameEnd;
::memset(&GameEnd,0,sizeof(GameEnd));
GameEnd.iUpGradeStation=m_iUpGradePeople;
GameEnd.iGamePoint=m_iGamePoint;
for(int i = 0;i < 3;i++) m_iBackCard[i] = 0x4E;
::CopyMemory(GameEnd.iBackList,m_iBackCard,sizeof(m_iBackCard));
//继续下一盘
{
//设置数据
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;
}
for (int i = 0;i < 4;i++)GameEnd.iTurePoint[i]=m_iTurePoint[i];
if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME)
{
GameEnd.iTurePoint[0]*=iBasePoint;
GameEnd.iTurePoint[1]*=iBasePoint;
GameEnd.iTurePoint[2]*=iBasePoint;
GameEnd.iTurePoint[3]*=iBasePoint;
for (BYTE i=0;i<m_bMaxPeople;i++)
{
if(GameEnd.iTurePoint[i]<0)
GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]);
if (GameEnd.iTurePoint[i]>0)
{
GameEnd.iTurePoint[i]=__min(m_dwMaxPoint,GameEnd.iTurePoint[i]);
//if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME)
GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*19L/20L;
}
}
}
//写入数据库
for (int i=0;i<3;i++)
ChangeUserPoint(m_pUserInfo[i],GameEnd.iTurePoint[i],GameEnd.iTurePoint[i]>0,GameEnd.iTurePoint[i]<0,GameEnd.iTurePoint[i]==0,false);
//发送数据
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
SendWatchData(m_bMaxPeople,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
if (!bFlagNextHalf)
{
__super::GameFinish(bDeskStation,bCloseFlag);
}
if(m_bQueryQuit)
{
GameFinish(bDeskStation,GF_SALE);
}
ReSetGameState(bCloseFlag);
}
return true;
}
case GF_SALE: //游戏安全结束
case GFF_FORCE_FINISH: //用户断线离开
{
int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
//计算得分
int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);
//设置数据
m_bGameStation=GS_WAIT_SETGAME;
for (int i=0;i<m_bMaxPeople;i++)
{
if (m_pUserInfo[i]!=NULL)
m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
}
GameCutStruct CutEnd;
CutEnd.bDeskStation=bDeskStation;
if(bCloseFlag==GF_SALE)
{
CutEnd.iTurePoint[bDeskStation]=0;
CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
}
else
{
//设置分数
if (iTurePoint>0) m_iUpGradePeople=(m_iUpGradePeople+2)%4;
else m_iUpGradePeople=(m_iUpGradePeople+1)%4;
if(iTurePoint>-1)
{
CutEnd.iTurePoint[bDeskStation]=-15;
CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
}
else
{
if(bDeskStation==m_iUpGradePeople || bDeskStation==(m_iUpGradePeople+2)%4)//如果将能升级,逃跑者不得分,他对家得分
{
CutEnd.iTurePoint[m_iUpGradePeople%4]=CutEnd.iTurePoint[(m_iUpGradePeople+2)%4]=abs(iTurePoint*3);
CutEnd.iTurePoint[bDeskStation]=0;
CutEnd.iTurePoint[(m_iUpGradePeople+1)%4]=CutEnd.iTurePoint[(m_iUpGradePeople+3)%4]=-abs(iTurePoint*3);
}
else
{
CutEnd.iTurePoint[bDeskStation]=-15;
CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
}
}
}
//发送信息
if (bCloseFlag==GF_SALE)
{
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
}
else
{
//计算金币类和比赛类的实得分
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -