/** * 同意用户离开 * @param bDeskStation 玩家ID * @param pNetHead 参数基类 * @param pData 网络数据包 * @param uSize 数据包大小 * @param uSocketID 参数基类 * @param bWatchUser 是否旁观 */ bool CServerGameDesk::H0011_UserBuZhen(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser) { ///if(bWatchUser) return true; tagBuZhen * bz=(tagBuZhen *)pData; m_Logic.UserBuZhen (*bz); m_bBuzhen[bDeskStation]=true; for (int i=0;i<4;i++) SendGameData(i,bz,sizeof(*bz),MDM_GM_GAME_NOTIFY,ASS_BUZHEN,0); SendWatchData(m_bMaxPeople,bz,sizeof(*bz),MDM_GM_GAME_NOTIFY,ASS_BUZHEN,0); if(m_Logic.GetBuzhenCount() >= GetPlayerCount()&&GS_BUZHEN==m_bGameStation) { m_bGameStation=GS_PLAY_GAME; //发送开始消息 tagNextStep s; s.station=m_Logic.m_iNowOutPeople; for (int i=0;i<4;i++) SendGameData(i,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0); SendWatchData(m_bMaxPeople,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0); KillTimer(TIME_USER_OUT_CARD) ; m_iTimerCount = m_iLessCount + 3 ; SetTimer(TIME_USER_OUT_CARD ,1000) ; } return true; }
/** * 同意用户离开 * @param bDeskStation 玩家ID * @param pNetHead 参数基类 * @param pData 网络数据包 * @param uSize 数据包大小 * @param uSocketID 参数基类 * @param bWatchUser 是否旁观 */ bool CServerGameDesk::H048_ArgeeStopThing(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser) { if(bWatchUser) return false; StopResultStruct * pStop=(StopResultStruct *)pData; if(pStop->bArgee==1) { //同意 StopResultStruct stop; stop.bArgee=true; SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0); MessageStruct Mess; memset(&Mess,0,sizeof(Mess)); lstrcpy(Mess.Message,"敌家经过商量,提前结束了本局!"); SendGameData((bDeskStation+1)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0); SendGameData((bDeskStation+3)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0); memset(&Mess,0,sizeof(Mess)); lstrcpy(Mess.Message,"拣分的双方经过商量,提前结束了本局!"); SendWatchData(m_bMaxPeople,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0); //结束游戏 if (m_bGameStation==GS_PLAY_GAME) GameFinish(bDeskStation, GF_PREEND);//提前结束 } else { StopResultStruct stop; stop.bArgee=false; SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0); } return true; }
///用户设置托管 ///@param BYTE bDeskStation [in] 设置托管的玩家 ///@param AutoCardStruct *bAuto [in] 托管信息结构 ///@return 函数返回true BOOL CServerGameDesk::UserAuto(BYTE bDeskStation,AutoCardStruct *bAuto) { m_bIsAuto[bDeskStation] = bAuto->bAutoCard; bAuto->bDeskStation=bDeskStation; for(int i=0;i<m_bMaxPeople;i++) { SendGameData(i,bAuto,sizeof(AutoCardStruct),MDM_GM_GAME_NOTIFY,ASS_AUTO,0); } SendWatchData(m_bMaxPeople,bAuto,sizeof(AutoCardStruct),MDM_GM_GAME_NOTIFY,ASS_AUTO,0); return TRUE; }
/** * 游戏开始 */ bool CServerGameDesk::H001_GameBegin(BYTE bBeginFlag) { if (__super::GameBegin(bBeginFlag)==false) return false; //设置状态 m_bQueryQuit=false; m_iBeenPlayGame++; m_bGameStation=GS_BUZHEN; //发送开始消息 BeginGameStruct BeginMessage; BeginMessage.iPlayCount=m_iBeenPlayGame; 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); return TRUE; }
bool CServerGameDesk::H021_UserPass(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser) { //发送开始消息 m_Logic.m_iNowOutPeople=m_Logic.GetNextStation (bDeskStation); tagNextStep s; s.station=m_Logic.m_iNowOutPeople; for (int i=0;i<4;i++) SendGameData(i,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0); SendWatchData(m_bMaxPeople,&s,sizeof(s),MDM_GM_GAME_NOTIFY,ASS_NEXT_STEP,0); KillTimer(TIME_USER_OUT_CARD) ; m_iTimerCount = m_iLessCount + 3 ; SetTimer(TIME_USER_OUT_CARD ,1000) ; return true; }
/** * 游戏开始 */ BOOL CServerGameDesk::BeginPlayUpGrade() { //设置数据 m_bGameStation=GS_PLAY_GAME; // m_iBaseOutCount=0; // m_Logic.m_iOutCardPeople=m_Logic.m_iUpGradePeople; // m_iFirstOutPeople=m_Logic.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_Logic.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; }
//-------------------------------------------------------------------------------- //处理玩家摊牌动作; void CServerGameDesk::HandTanPaiAction(BYTE byDStation,BYTE byDownCard[]) { //安全判断 if(!m_bIsInGame[byDStation] || NULL == byDownCard || m_bHaveBaiPai[byDStation] || m_bGameStation != GS_PLAY_GAME) { return; } ::CopyMemory(m_bBullCard[byDStation],byDownCard,sizeof(BYTE)*USER_HAND_CARD); //摆牌数据 m_byCardShape[byDStation] = m_Logic.GetShape(m_byUCard[byDStation],m_iUCCount[byDStation],byDownCard); TanPaiStruct tanpai; tanpai.byStaiton = byDStation; tanpai.byShape = m_byCardShape[byDStation]; if(m_bWatchOther[byDStation]) { ::CopyMemory(tanpai.byDownCard,m_bBullCard[byDStation],sizeof(m_bBullCard[byDStation])); } for (int i = 0; i < PLAY_COUNT; ++i) { if(m_pUserInfo[i]) { SendGameData(i,&tanpai,sizeof(tanpai),MDM_GM_GAME_NOTIFY,ASS_TAN_PAI,0); } } SendWatchData(m_bMaxPeople,&tanpai,sizeof(tanpai),MDM_GM_GAME_NOTIFY,ASS_TAN_PAI,0); m_bHaveBaiPai[byDStation] = true; //检测是否所有人都已摊牌 if(CheckTanPaiFinish()) { GameFinish(byDStation,GF_NORMAL); } }
//框架消息处理函数 bool CServerGameDesk::HandleFrameMessage(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser) { DebugPrintf("接收到框架消息 位置=【%d】 ID=【%d】",bDeskStation,pNetHead->bAssistantID); switch(pNetHead->bAssistantID) { case ASS_GM_FORCE_QUIT: //强行退出//安全退出 { char cKey[10]; CString sPath=CBcfFile::GetAppPath(); int iResult = 1; if (CBcfFile::IsFileExist(sPath + "SpecialRule.bcf")) { CBcfFile fsr( sPath + "SpecialRule.bcf"); sprintf(cKey, "%d", NAME_ID); iResult = fsr.GetKeyVal (_T("ForceQuitAsAuto"), cKey, 0); } if(iResult == 0) { UserQuitStruct s_UserQuit; s_UserQuit.bDeskStation = bDeskStation; for(int i = 0; i < PLAY_COUNT; ++i) { if(i != bDeskStation); { SendGameData(i,&s_UserQuit,sizeof(UserQuitStruct),MDM_GM_GAME_NOTIFY,ASS_USER_QUIT_GAME,0); } } SendWatchData(m_bMaxPeople,&s_UserQuit,sizeof(UserQuitStruct),MDM_GM_GAME_NOTIFY,ASS_USER_QUIT_GAME,0); return __super::HandleFrameMessage( bDeskStation, pNetHead, pData, uSize, uSocketID, bWatchUser); } return true; } } return __super::HandleFrameMessage( bDeskStation, pNetHead, pData, uSize, uSocketID, bWatchUser); }
/** * 用户设置游戏 */ BOOL CServerGameDesk::UserSetGame(UserArgeeGame * pGameSet) { //效验数据 if (m_bGameStation!=GS_WAIT_SETGAME) return FALSE; //效验数据 if (((pGameSet->iPlayCount<=0)||(pGameSet->iPlayCount>99))) return FALSE; //设置数据 m_iLessCount=pGameSet->iPlayCount; // m_iPlayCardCount=1;//(pGameSet->iCardCount&1)?1:2;//2:3; m_iBeenPlayGame=0; m_bGameStation=GS_WAIT_ARGEE; //发送消息 UserArgeeGame Agree; 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; }
/** * 游戏结束 * @param bDeskStation 玩家ID * @param bCloseFlag 结束类型 */ bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag) { KillTimer(TIME_USER_OUT_CARD) ; //得到最小数的金币 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_PREEND: //提前结束 case GF_NORMAL: //游戏正常结束 { int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数 //计算得分 //游戏结束 GameEndStruct GameEnd; ::memset(&GameEnd,0,sizeof(GameEnd)); m_Logic.CountFen(GameEnd.iTurePoint); if (GF_PREEND == bCloseFlag)//提前结束 { GameEnd.iTurePoint[bDeskStation] = GameEnd.iTurePoint[(bDeskStation+2)%4] = -2;//提出提前结束的一方 GameEnd.iTurePoint[(bDeskStation+1)%4] = GameEnd.iTurePoint[(bDeskStation+3)%4] = 2;//另一方 } //设置基本分begin m_pDataManage->m_InitData.uBasePoint = 1; int base=-1; int temp; for(int i=1;i<m_bMaxPeople;i++) { if (m_pUserInfo[i]==NULL) continue; temp=m_Logic.GetBaseFen(m_pUserInfo[i]->m_UserData.dwPoint); if(base>temp||-1==base) base=temp; } for(int i=0; i<m_bMaxPeople; i++) { if(NULL == m_pUserInfo[i]) { GameEnd.iTurePoint[i] = 0; continue; } GameEnd.iTurePoint[i]*=base; } //设置基本分end //设置数据 m_bGameStation=GS_WAIT_ARGEE; for (int i=0;i<m_bMaxPeople;i++) { if (m_pUserInfo[i]!=NULL) m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING; } /*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]=__min(m_dwMaxPoint,GameEnd.iTurePoint[i]); if(GameEnd.iTurePoint[i]<0) GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]); if (GameEnd.iTurePoint[i]>=100) { if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME) GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*49L/50L; } } }*/ //写入数据库 /* bool temp_cut[PLAY_COUNT]; memset(temp_cut,0,sizeof(temp_cut)); ChangeUserPoint(GameEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(GameEnd.iChangeMoney);*/ //写入数据库 bool temp_cut[4]; memset(temp_cut,0,sizeof(temp_cut)); ChangeUserPoint(GameEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(GameEnd.iChangeMoney); GameEnd.iDoublePointEffect = GetDoublePointEffect();//20081125 bool bNotCostPoint = (m_pDataManage->m_InitData.dwRoomRule & GRR_NOT_COST_POINT) > 0; /// 金币场不扣积分 add by wys 2010-11-1 if (true == bNotCostPoint) { memset(GameEnd.iTurePoint,0,sizeof(GameEnd.iTurePoint)); } //发送数据 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); ReSetGameState(bCloseFlag); __super::GameFinish(bDeskStation,GF_SALE); 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_ARGEE; 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 { //设置分数 CutEnd.iTurePoint[bDeskStation]=0-m_pDataManage->m_InitData.uRunPublish;; 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 { //计算金币类和比赛类的实得分 /*if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME) { CutEnd.iTurePoint[0]*=iBasePoint; CutEnd.iTurePoint[1]*=iBasePoint; CutEnd.iTurePoint[2]*=iBasePoint; CutEnd.iTurePoint[3]*=iBasePoint; for (BYTE i=0;i<m_bMaxPeople;i++) { if(CutEnd.iTurePoint[i]>0) CutEnd.iTurePoint[i]=__min(m_dwMaxPoint,CutEnd.iTurePoint[i]); if(CutEnd.iTurePoint[i]<0) CutEnd.iTurePoint[i]=__max(-m_dwMaxPoint,CutEnd.iTurePoint[i]); if (CutEnd.iTurePoint[i]>=100) { if(m_pDataManage->m_InitData.uComType!=SUP_MATCH_GAME) CutEnd.iTurePoint[i]=CutEnd.iTurePoint[i]*49L/50L; } } }*/ /* bool temp_cut[PLAY_COUNT]; memset(temp_cut,0,sizeof(temp_cut)); for (int i=0;i<PLAY_COUNT;i++) { temp_cut[i]=(bDeskStation==i && CutEnd.iTurePoint[i]<0); } ChangeUserPoint(CutEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(CutEnd.iChangeMoney);*/ //写入数据库 bool temp_cut[4]; memset(temp_cut,0,sizeof(temp_cut)); for (int i=0;i<m_bMaxPeople;i++) { temp_cut[i]=(bDeskStation==i && CutEnd.iTurePoint[i]<0); } ChangeUserPoint(CutEnd.iTurePoint, temp_cut); __super::RecoderGameInfo(CutEnd.iChangeMoney); bool bNotCostPoint = (m_pDataManage->m_InitData.dwRoomRule & GRR_NOT_COST_POINT) > 0; /// 金币场不扣积分 add by wys 2010-11-1 if (true == bNotCostPoint) { memset(CutEnd.iTurePoint,0,sizeof(CutEnd.iTurePoint)); } for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0); SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0); } bCloseFlag=GFF_FORCE_FINISH; ReSetGameState(bCloseFlag); __super::GameFinish(bDeskStation,bCloseFlag); return true; } } //重置数据 ReSetGameState(bCloseFlag); __super::GameFinish(bDeskStation,bCloseFlag); return true; }
/** * 用户出牌 * @param bDeskStation 玩家ID * @param pNetHead 参数基类 * @param pData 网络数据包 * @param uSize 数据包大小 * @param uSocketID 参数基类 * @param bWatchUser 是否旁观 */ bool CServerGameDesk::H020_UserOutCard(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser) { //GameFinish(bDeskStation,GF_NORMAL);//*shingo* //return true; if (bWatchUser) return FALSE; if(m_bGameStation!=GS_PLAY_GAME) return true; if (uSize!=sizeof(tagMove)) return FALSE; if(bDeskStation!=m_Logic.m_iNowOutPeople) return false; tagMove * pOutCard=(tagMove *)pData; tagMoveResult m; memset(m.cPath, 255, sizeof(m.cPath)); /*if(pOutCard->m_iStartI==-1) {//有玩家无子可下了 m.station=bDeskStation; m.loseColor=m_Logic.GetColorFromStation(bDeskStation); m.m_iStartI=-1; m_Logic.ClearColorAllQiZi(m.loseColor); int *p=new int; *p=bDeskStation; bool cor[4]; m_Logic.GetDeadPeople(cor); m_Logic.mLoseStationList.AddTail(p); for(int i=0; i<4; i++) { if(i == *p) continue; if(!cor[i]) { TCHAR sz[100]; wsprintf(sz,"lose color %d",i); Testlog(sz); int *p1=new int; *p1=bDeskStation; m_Logic.mLoseStationList.AddTail(p1); } } m.nextstation=m_Logic.GetNextStation(m.station); } else {*/ m.station=bDeskStation; m_Logic.UserMove(*pOutCard,m); //} if(m_Logic.IsFinish()) m.nextstation=-1; m_Logic.m_iNowOutPeople=m.nextstation; m.iStep = pOutCard->iStep; memcpy(m.cPath, pOutCard->cPath, sizeof(m.cPath)); for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&m,sizeof(m),MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0); SendWatchData(m_bMaxPeople,&m,sizeof(m),MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0); KillTimer(TIME_USER_OUT_CARD) ; m_iTimerCount = m_iLessCount + 3 ; SetTimer(TIME_USER_OUT_CARD ,1000) ; if(m.loseColor >= 0)//m_Logic.IsStationLose(bDeskStation)) { tagNextStep N; if(pOutCard->m_iStartI==-1) N.station =bDeskStation; else N.station=m_Logic.GetStationFromColor(m.loseColor); N.station2=m_Logic.GetStationFromColor(m.loseColor2); for (int i=0;i<4;i++) SendGameData(i,&N,sizeof(N),MDM_GM_GAME_NOTIFY,ASS_LOSE,0); SendWatchData(m_bMaxPeople,&N,sizeof(N),MDM_GM_GAME_NOTIFY,ASS_LOSE,0); } if(m_Logic.IsFinish()) { m_bGameStation=GS_PLAY_GAME; SetTimer(TIME_GAME_FINISH,2000); } return true; }
//发送扑克给用户 BOOL CServerGameDesk::SendCard() { int iCardPos = 0; //当前发牌位置; //20121204DWJ 没有机器人就不去控制了; bool bAllUser = true;//全是玩家在那玩就不控制了; bool bALLAi = true;//全是机器人; for (int i =0 ;i< PLAY_COUNT ; i++) { if(NULL != m_pUserInfo[i] && m_pUserInfo[i]->m_UserData.isVirtual > 0 ) {// 有机器人存在,就去控制; bAllUser = false; break; } } for (int i =0 ;i< PLAY_COUNT ; i++) { if (NULL != m_pUserInfo[i] && m_pUserInfo[i]->m_UserData.isVirtual < 1) {//全是机器人,有玩家存在,就去控制; bALLAi = false; break; } } if (m_bSuperSet) { SuperSet(); //每局只设置完后初始化 m_bSuperSet = false; m_iSuperSet[0] = 255; m_iSuperSet[1] = 0; } else if (m_bAIWinAndLostAutoCtrl && !m_bSuperSet && !bAllUser && !bALLAi) {//机器人控制输赢 dwj 20121203 机器人控制输赢了且 没有超端控制、有机器人在里面玩; IAWinAutoCtrl(); } for(int i = 0; i < PLAY_COUNT; ++i) { if(!m_bIsInGame[i]) continue; ::CopyMemory(m_byUCard[i],&m_iTotalCard[iCardPos],sizeof(BYTE)*USER_HAND_CARD); m_iUCCount[i] = USER_HAND_CARD; iCardPos += USER_HAND_CARD; } //dddwwwjjj; //BYTE byTemp1[PLAY_COUNT][USER_HAND_CARD] = {{0x03,0x3C,0x29,0x02,0x07},{0x0D,0x0C,0x0A,0x15,0x3A},{0x4e,0x03,0x3d,0x08,0x0b}, // {0x07,0x01,0x4f,0x17,0x06},{0x32,0x14,0x26,0x18,0x38},{0x16,0x24,0x0B,0x2A,0x09}}; //for(int i = 0; i < PLAY_COUNT; ++i) //{ // if(NULL == m_pUserInfo[i]) // continue; // // ::CopyMemory(m_byUCard[i],byTemp1[i],sizeof(BYTE)*USER_HAND_CARD); //} SendCardStruct sCardData; ::CopyMemory(sCardData.iUCCount,m_iUCCount,sizeof(m_iUCCount)); for(int i = 0; i < PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) continue; ::CopyMemory(sCardData.byUCard[i],m_byUCard[i],sizeof(m_byUCard[i])); SendGameData(i,&sCardData,sizeof(sCardData),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0); //不充许 旁观 if(!m_bWatchOther[i]) { ::memset(sCardData.byUCard[i],0x4D,sizeof(sCardData.byUCard[i])); } SendWatchData(i,&sCardData,sizeof(sCardData),MDM_GM_GAME_NOTIFY,ASS_SEND_CARD,0); ::ZeroMemory(sCardData.byUCard[i],sizeof(sCardData.byUCard[i])); } SetGameTimer(TIME_WAIT_THINK,1250,false); //加上客户端发牌时间 return TRUE; }
//游戏开始 bool CServerGameDesk::GameBegin(BYTE bBeginFlag) { if (__super::GameBegin(bBeginFlag)==false) { GameFinish(0,GF_SALE); return false; } m_bGameStation = GS_SEND_CARD; //游戏状态 //-ADD--BY---DWJ-20121203 //这里每盘根据房间ID读取下配置文件中的ReSetAIHaveWinMoney 参数 设定下机器人赢了多少钱; GetAIContrlSetFromIni(m_pDataManage->m_InitData.uRoomID); //牛牛玩家人数 m_byCowUserNum = 0; //是否牛牛玩家 memset(m_bIsCowUser, false, sizeof(m_bIsCowUser)); for (int i = 0; i < PLAY_COUNT; ++i) { if(m_pUserInfo[i]) { m_bIsInGame[i] = true; } } //分发扑克 m_Logic.RandCard(m_iTotalCard,m_iAllCardCount,m_bHaveKing); int temp = rand()%100; //洗到好牌 if (temp < m_iGoodCard) { for (int i=0; i<20; i++) { if (GetMaxCardShape(m_iTotalCard,m_iAllCardCount) > UG_BULL_SEVEN) { break; } m_Logic.RandCard(m_iTotalCard,m_iAllCardCount,m_bHaveKing); } } srand(GetTickCount()); m_bGameStation = GS_SEND_CARD; BeginUpgradeStruct begindata; ::CopyMemory(begindata.bIsInGame,m_bIsInGame,sizeof(m_bIsInGame)); for(int i = 0; i < PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) continue; SendGameData(i,&begindata,sizeof(BeginUpgradeStruct),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0); } SendWatchData(m_bMaxPeople,&begindata,sizeof(BeginUpgradeStruct),MDM_GM_GAME_NOTIFY,ASS_BEGIN_UPGRADE,0); SendCard(); DebugPrintf("游戏开始__ happy landowner gamebing end!"); return true; }
//------------------------------------------------------------------------------------ //游戏结束 bool CServerGameDesk::GameFinish(BYTE bDeskStation, BYTE bCloseFlag) { DebugPrintf("happy landowner GameFinish 结束玩家【%d】,结束类型【%d】",bDeskStation,bCloseFlag); KillAllTimer(); GameEndStruct s_gameend; switch (bCloseFlag) { case GF_NORMAL: //游戏正常结束 { CountResultScore(bDeskStation,&s_gameend,GF_NORMAL); //计算得分 m_bGameStation = GS_WAIT_ARGEE; break; } case GFF_FORCE_FINISH: //强制退出结束 { CountResultScore(bDeskStation,&s_gameend,GFF_FORCE_FINISH); //计算得分 m_bGameStation = GS_WAIT_ARGEE; //游戏状态 等待下一盘开始 bCloseFlag = GF_SALE; break; } case GF_SALE: //游戏安全结束 { m_bGameStation = GS_WAIT_ARGEE; break; } default:break; } memcpy(s_gameend.bIsPrepare,m_bIsPrepare,sizeof(s_gameend.bIsPrepare)); //发送数据 for (int i=0; i<PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) continue; SendGameData(i,&s_gameend,sizeof(GameEndStruct),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0); } SendWatchData(m_bMaxPeople,&s_gameend,sizeof(GameEndStruct),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0); ReSetGameState(bCloseFlag); //重置数据 __super::GameFinish(bDeskStation,bCloseFlag); for(int i = 0; i < PLAY_COUNT; ++i) { if(NULL == m_pUserInfo[i]) { m_bIsAuto[i] = false; } } return true; }