#include "Stdafx.h" #include "AndroidUserItemSink.h" #include "AndroidAI.h" ////////////////////////////////////////////////////////////////////////// //辅助时间 #ifdef _DEBUG #define TIME_LESS 1 //最少时间 #define TIME_START_GAME 1 //开始时间 #define TIME_OPERATE_CARD 1 //操作牌时间 #else #define TIME_LESS 2 //最少时间 #define TIME_START_GAME 10 //开始时间 #define TIME_OPERATE_CARD 8 //操作牌时间 #endif //游戏时间 //游戏时间 #define IDI_OUT_CARD (0) //出牌时间 #define IDI_START_GAME (1) //开始时间 #define IDI_OPERATE_CARD (2) // ////////////////////////////////////////////////////////////////////////// //构造函数 CAndroidUserItemSink::CAndroidUserItemSink() { //游戏变量 m_wBankerUser=INVALID_CHAIR; m_wCurrentUser=INVALID_CHAIR; m_cbActionMask = 0; m_cbActionCard = 0; //组合扑克 ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount)); ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray)); //扑克变量 m_cbLeftCardCount=0; ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex)); return; } //析构函数 CAndroidUserItemSink::~CAndroidUserItemSink() { } //接口查询 VOID * CAndroidUserItemSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(IAndroidUserItemSink,Guid,dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IAndroidUserItemSink,Guid,dwQueryVer); return NULL; } //初始接口 bool CAndroidUserItemSink::Initialization(IUnknownEx * pIUnknownEx) { //查询接口 m_pIAndroidUserItem=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,IAndroidUserItem); if (m_pIAndroidUserItem==NULL) return false; return true; } //重置接口 bool CAndroidUserItemSink::RepositionSink() { //游戏变量 m_wBankerUser=INVALID_CHAIR; m_wCurrentUser=INVALID_CHAIR; m_cbActionMask = 0; m_cbActionCard = 0; //组合扑克 ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount)); ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray)); //扑克变量 m_cbLeftCardCount=0; ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex)); return true; } //时间消息 bool CAndroidUserItemSink::OnEventTimer(UINT nTimerID) { switch (nTimerID) { case IDI_START_GAME: //开始游戏 { m_pIAndroidUserItem->KillGameTimer(IDI_START_GAME); //开始判断 if( m_pIAndroidUserItem->GetGameStatus()==GS_MJ_FREE ) m_pIAndroidUserItem->SendUserReady(NULL,0); return true; } case IDI_OPERATE_CARD: //操作定时器 { tagOutCardResult OutCardResult; WORD wMeChairId = m_pIAndroidUserItem->GetChairID(); #ifdef _DEBUG BYTE byCardCount = m_GameLogic.GetCardCount( m_cbCardIndex[wMeChairId] ); if( wMeChairId == m_wCurrentUser ) ASSERT( (byCardCount+1)%3 == 0 ); else ASSERT( byCardCount%3 == 1 ); #endif try { //搜索出牌 if( SearchOutCard(OutCardResult) ) { if( OutCardResult.cbOperateCode != WIK_NULL ) { //效验 ASSERT( OutCardResult.cbOperateCode&m_cbActionMask ); if( !(OutCardResult.cbOperateCode&m_cbActionMask) ) throw 0; //响应操作 OnOperateCard(OutCardResult.cbOperateCode,OutCardResult.cbOperateCard); } else { //效验 ASSERT( m_cbCardIndex[m_pIAndroidUserItem->GetChairID()][m_GameLogic.SwitchToCardIndex(OutCardResult.cbOperateCard)] > 0 ); if( m_cbCardIndex[m_pIAndroidUserItem->GetChairID()][m_GameLogic.SwitchToCardIndex(OutCardResult.cbOperateCard)] == 0 ) throw 0; //出牌 OnOutCard(OutCardResult.cbOperateCard); } }else { //效验 ASSERT( wMeChairId != m_wCurrentUser ); if( wMeChairId == m_wCurrentUser ) throw 0; //响应操作 OnOperateCard(WIK_NULL,0); } }catch(...) { ASSERT(FALSE); //异常处理 if( wMeChairId == m_wCurrentUser ) { for( BYTE i = 0; i < MAX_INDEX; i++ ) { if( m_cbCardIndex[wMeChairId][i] > 0 ) { OnOutCard( m_GameLogic.SwitchToCardData(i) ); return true; } } } else OnOperateCard( WIK_NULL,0 ); } return true; } } return false; } //游戏消息 bool CAndroidUserItemSink::OnEventGameMessage(WORD wSubCmdID, void * pData, WORD wDataSize) { switch (wSubCmdID) { case SUB_S_GAME_START: //游戏开始 { return OnSubGameStart(pData,wDataSize); } case SUB_S_OUT_CARD: //用户出牌 { return OnSubOutCard(pData,wDataSize); } case SUB_S_SEND_CARD: //发牌消息 { return OnSubSendCard(pData,wDataSize); } case SUB_S_OPERATE_NOTIFY: //操作提示 { return OnSubOperateNotify(pData,wDataSize); } case SUB_S_OPERATE_RESULT: //操作结果 { return OnSubOperateResult(pData,wDataSize); } case SUB_S_GAME_END: //游戏结束 { return OnSubGameEnd(pData,wDataSize); } case SUB_S_TRUSTEE: //用户托管 { return true; } case SUB_S_CHI_HU: { return true; } case SUB_S_GANG_SCORE: { return true; } } //错误断言 ASSERT(FALSE); return true; } //游戏消息 bool CAndroidUserItemSink::OnEventFrameMessage(WORD wSubCmdID, void * pData, WORD wDataSize) { return true; } //场景消息 bool CAndroidUserItemSink::OnEventSceneMessage(BYTE cbGameStatus, bool bLookonOther, void * pData, WORD wDataSize) { switch (cbGameStatus) { case GS_MJ_FREE: //空闲状态 { //效验数据 ASSERT(wDataSize==sizeof(CMD_S_StatusFree)); if (wDataSize!=sizeof(CMD_S_StatusFree)) return false; //变量定义 CMD_S_StatusFree * pStatusFree=(CMD_S_StatusFree *)pData; IServerUserItem * pIServerUserItem=m_pIAndroidUserItem->GetMeUserItem(); //玩家设置 if (pIServerUserItem->GetUserStatus()!=US_READY) { UINT nElapse=rand()%TIME_START_GAME+TIME_LESS; m_pIAndroidUserItem->SetGameTimer(IDI_START_GAME,nElapse); } return true; } case GS_MJ_PLAY: //游戏状态 { ASSERT( FALSE ); return true; } default: { ASSERT(FALSE); return false; } } return true; } //用户进入 void CAndroidUserItemSink::OnEventUserEnter(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser) { return; } //用户离开 void CAndroidUserItemSink::OnEventUserLeave(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser) { return; } //用户积分 void CAndroidUserItemSink::OnEventUserScore(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser) { return; } //用户状态 void CAndroidUserItemSink::OnEventUserStatus(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser) { return; } //用户段位 void CAndroidUserItemSink::OnEventUserSegment(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser) { return; } //庄家信息 bool CAndroidUserItemSink::OnSubGameStart(const void * pData, WORD wDataSize) { //效验数据 ASSERT(wDataSize==sizeof(CMD_S_GameStart)); if (wDataSize!=sizeof(CMD_S_GameStart)) return false; //变量定义 CMD_S_GameStart * pGameStart=(CMD_S_GameStart *)pData; //设置状态 m_pIAndroidUserItem->SetGameStatus(GS_MJ_PLAY); //设置变量 m_wBankerUser=pGameStart->wBankerUser; m_wCurrentUser=pGameStart->wCurrentUser; m_cbLeftCardCount=MAX_REPERTORY-GAME_PLAYER*(MAX_COUNT-1)-1; m_cbActionMask = pGameStart->cbUserAction; m_cbActionCard = 0; //出牌信息 m_cbOutCardData=0; m_wOutCardUser=INVALID_CHAIR; ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard)); ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount)); //组合扑克 ZeroMemory(m_cbWeaveCount,sizeof(m_cbWeaveCount)); ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray)); //设置扑克 WORD wMeChairId = m_pIAndroidUserItem->GetChairID(); BYTE cbCardCount = (wMeChairId==m_wBankerUser)?MAX_COUNT:(MAX_COUNT-1); m_GameLogic.SwitchToCardIndex(pGameStart->cbCardData,cbCardCount,m_cbCardIndex[wMeChairId]); BYTE bIndex = 1; for( WORD i = 0; i < GAME_PLAYER; i++ ) { if( i == wMeChairId ) continue; cbCardCount=(i==m_wBankerUser)?MAX_COUNT:(MAX_COUNT-1); m_GameLogic.SwitchToCardIndex(&pGameStart->cbCardData[MAX_COUNT*bIndex++],cbCardCount,m_cbCardIndex[i]); } //动作处理 if ((pGameStart->cbUserAction!=WIK_NULL) || m_wCurrentUser==wMeChairId ) { UINT nElapse = rand()%TIME_OPERATE_CARD+TIME_LESS+5; m_pIAndroidUserItem->SetGameTimer(IDI_OPERATE_CARD,nElapse); } return true; } //游戏结束 bool CAndroidUserItemSink::OnSubGameEnd(const void * pData, WORD wDataSize) { //效验数据 ASSERT(wDataSize==sizeof(CMD_S_GameEnd)); if (wDataSize!=sizeof(CMD_S_GameEnd)) return false; //删除定时器 m_pIAndroidUserItem->KillGameTimer(IDI_OPERATE_CARD); //设置状态 m_pIAndroidUserItem->SetGameStatus(GS_MJ_FREE); //设置 UINT nElapse = rand()%TIME_START_GAME+TIME_LESS; m_pIAndroidUserItem->SetGameTimer(IDI_START_GAME,nElapse); return true; } //操作通知 bool CAndroidUserItemSink::OnSubOperateNotify( const void *pBuffer,WORD wDataSize ) { //效验数据 ASSERT(wDataSize==sizeof(CMD_S_OperateNotify)); if (wDataSize!=sizeof(CMD_S_OperateNotify)) return false; //变量定义 CMD_S_OperateNotify * pOperateNotify=(CMD_S_OperateNotify *)pBuffer; //用户界面 if ((pOperateNotify->cbActionMask!=WIK_NULL)) { //获取变量 WORD wMeChairID=m_pIAndroidUserItem->GetChairID(); m_cbActionMask = pOperateNotify->cbActionMask; m_cbActionCard = pOperateNotify->cbActionCard; //设置时间 UINT nElapse = rand()%TIME_OPERATE_CARD+TIME_LESS; m_pIAndroidUserItem->SetGameTimer(IDI_OPERATE_CARD,nElapse); } return true; } //操作结果通知 bool CAndroidUserItemSink::OnSubOperateResult( const void *pBuffer,WORD wDataSize ) { //效验消息 ASSERT(wDataSize==sizeof(CMD_S_OperateResult)); if (wDataSize!=sizeof(CMD_S_OperateResult)) return false; //消息处理 CMD_S_OperateResult * pOperateResult=(CMD_S_OperateResult *)pBuffer; m_pIAndroidUserItem->KillGameTimer( IDI_OPERATE_CARD ); //变量定义 BYTE cbPublicCard=TRUE; WORD wOperateUser=pOperateResult->wOperateUser; BYTE cbOperateCard = pOperateResult->cbOperateCard; //出牌变量 if (pOperateResult->cbOperateCode!=WIK_NULL) { m_cbOutCardData=0; m_wOutCardUser=INVALID_CHAIR; } //设置变量 m_cbActionMask = WIK_NULL; m_cbActionCard = 0; //设置组合 if ((pOperateResult->cbOperateCode&WIK_GANG)!=0) { //设置变量 m_wCurrentUser=INVALID_CHAIR; //组合扑克 BYTE cbWeaveIndex=0xFF; for (BYTE i=0;icbOperateCode; m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser; break; } } //组合扑克 if (cbWeaveIndex==0xFF) { //暗杠判断 cbPublicCard=(pOperateResult->wProvideUser==wOperateUser)?FALSE:TRUE; //设置扑克 cbWeaveIndex=m_cbWeaveCount[wOperateUser]++; m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=cbPublicCard; m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbCenterCard=cbOperateCard; m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode; m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser; } //扑克设置 m_cbCardIndex[wOperateUser][m_GameLogic.SwitchToCardIndex(cbOperateCard)]=0; } else if (pOperateResult->cbOperateCode!=WIK_NULL&&pOperateResult->cbOperateCode!=WIK_CHI_HU) { //设置变量 m_wCurrentUser=pOperateResult->wOperateUser; //设置组合 BYTE cbWeaveIndex=m_cbWeaveCount[wOperateUser]++; m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=TRUE; m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbCenterCard=cbOperateCard; m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode; m_WeaveItemArray[wOperateUser][cbWeaveIndex].wProvideUser=pOperateResult->wProvideUser; //组合界面 BYTE cbWeaveCard[4]={0,0,0,0},cbWeaveKind=pOperateResult->cbOperateCode; BYTE cbWeaveCardCount=m_GameLogic.GetWeaveCard(cbWeaveKind,cbOperateCard,cbWeaveCard); //删除扑克 m_GameLogic.RemoveCard(cbWeaveCard,cbWeaveCardCount,&cbOperateCard,1); m_GameLogic.RemoveCard(m_cbCardIndex[wOperateUser],cbWeaveCard,cbWeaveCardCount-1); } //设置时间 if (m_wCurrentUser==m_pIAndroidUserItem->GetChairID()) { //计算时间 UINT nElapse=rand()%TIME_OPERATE_CARD+TIME_LESS; //设置时间 m_pIAndroidUserItem->SetGameTimer(IDI_OPERATE_CARD,nElapse); } return true; } //用户出牌 bool CAndroidUserItemSink::OnSubOutCard( const void *pBuffer,WORD wDataSize ) { //效验消息 ASSERT(wDataSize==sizeof(CMD_S_OutCard)); if (wDataSize!=sizeof(CMD_S_OutCard)) return false; //消息处理 CMD_S_OutCard * pOutCard=(CMD_S_OutCard *)pBuffer; //变量定义 WORD wMeChairID=m_pIAndroidUserItem->GetChairID(); //设置变量 m_wCurrentUser=INVALID_CHAIR; m_wOutCardUser=pOutCard->wOutCardUser; ASSERT( pOutCard->cbOutCardData != 0 ); m_cbOutCardData=pOutCard->cbOutCardData; //删除扑克 if( wMeChairID != pOutCard->wOutCardUser ) m_GameLogic.RemoveCard(m_cbCardIndex[pOutCard->wOutCardUser],pOutCard->cbOutCardData); return true; } //用户发牌 bool CAndroidUserItemSink::OnSubSendCard( const void *pBuffer,WORD wDataSize ) { //效验数据 ASSERT(wDataSize==sizeof(CMD_S_SendCard)); if (wDataSize!=sizeof(CMD_S_SendCard)) return false; //变量定义 CMD_S_SendCard * pSendCard=(CMD_S_SendCard *)pBuffer; //设置变量 WORD wMeChairID=m_pIAndroidUserItem->GetChairID(); m_wCurrentUser=pSendCard->wCurrentUser; //丢弃扑克 if ((m_wOutCardUser!=INVALID_CHAIR)&&(m_cbOutCardData!=0)) { //丢弃扑克 m_cbDiscardCard[m_wOutCardUser][m_cbDiscardCount[m_wOutCardUser]++] = m_cbOutCardData; //设置变量 m_cbOutCardData=0; m_wOutCardUser=INVALID_CHAIR; } //发牌处理 if (pSendCard->cbCardData!=0) { m_cbCardIndex[pSendCard->wCurrentUser][m_GameLogic.SwitchToCardIndex(pSendCard->cbCardData)]++; //扣除扑克 m_cbLeftCardCount--; } //设置时间 if( wMeChairID == m_wCurrentUser ) { m_cbActionMask = pSendCard->cbActionMask; m_cbActionCard = pSendCard->cbCardData; //计算时间 UINT nElapse=rand()%TIME_OPERATE_CARD+TIME_LESS; m_pIAndroidUserItem->SetGameTimer(IDI_OPERATE_CARD,nElapse); } return true; } //出牌 void CAndroidUserItemSink::OnOutCard( BYTE cbOutCard ) { //删除定时器 m_pIAndroidUserItem->KillGameTimer(IDI_OPERATE_CARD); //设置变量 m_wCurrentUser=INVALID_CHAIR; m_cbActionMask = WIK_NULL; m_cbActionCard = 0; //删除牌 m_GameLogic.RemoveCard(m_cbCardIndex[m_pIAndroidUserItem->GetChairID()],cbOutCard); //发送数据 CMD_C_OutCard OutCard; OutCard.cbCardData=cbOutCard; if( !m_pIAndroidUserItem->SendSocketData(SUB_C_OUT_CARD,&OutCard,sizeof(OutCard)) ) { ASSERT( FALSE ); return ; } return ; } //操作牌 void CAndroidUserItemSink::OnOperateCard( BYTE cbOperateCode,BYTE cbOperateCard ) { //删除时间 m_pIAndroidUserItem->KillGameTimer(IDI_OPERATE_CARD); //设置变量 m_cbActionMask = WIK_NULL; m_cbActionCard = 0; //发送命令 CMD_C_OperateCard OperateCard; OperateCard.cbOperateCode=cbOperateCode; OperateCard.cbOperateCard = cbOperateCard; if( !m_pIAndroidUserItem->SendSocketData(SUB_C_OPERATE_CARD,&OperateCard,sizeof(OperateCard)) ) { ASSERT( FALSE ); return ; } return ; } //搜索听牌 bool CAndroidUserItemSink::SearchTingCard( tagTingCardResult &TingCardResult ) { //变量定义 ZeroMemory(&TingCardResult,sizeof(TingCardResult)); BYTE bAbandonCardCount=0; //构造扑克 WORD wMeChairId = m_pIAndroidUserItem->GetChairID(); BYTE cbCardIndexTemp[MAX_INDEX]; CopyMemory(cbCardIndexTemp,m_cbCardIndex[wMeChairId],sizeof(cbCardIndexTemp)); BYTE cbCardCount = m_GameLogic.GetCardCount(cbCardIndexTemp); if( (cbCardCount-2)%3 == 0 ) { //听牌分析 for (BYTE i=0;i 0 ) { TingCardResult.bRemainCount[n] = TingCardResult.bTingCardCount[n]*4; for( BYTE i = 0; i < TingCardResult.bTingCardCount[n]; i++ ) { BYTE bCardData = TingCardResult.bTingCard[n][i]; //减自己牌 if( cbCardIndexTemp[m_GameLogic.SwitchToCardIndex(bCardData)] > 0 ) { TingCardResult.bRemainCount[n] -= cbCardIndexTemp[m_GameLogic.SwitchToCardIndex(bCardData)]; ASSERT( TingCardResult.bRemainCount[n]>=0 ); } for( BYTE j = 0; j < GAME_PLAYER; j++ ) { //减组合牌 BYTE k = 0; for( ; k < m_cbWeaveCount[j]; k++ ) { if( m_WeaveItemArray[j][k].cbCenterCard == bCardData ) { TingCardResult.bRemainCount[n] -= m_WeaveItemArray[j][k].cbWeaveKind==WIK_GANG?4:3; ASSERT( TingCardResult.bRemainCount[n]>=0 ); } } //减丢弃牌 for( k = 0; k < m_cbDiscardCount[j]; k++ ) { if( bCardData == m_cbDiscardCard[j][k] ) { TingCardResult.bRemainCount[n]--; ASSERT( TingCardResult.bRemainCount[n]>=0 ); } } } } n++; } return true; } //搜索出牌 bool CAndroidUserItemSink::SearchOutCard( tagOutCardResult &OutCardResult ) { //初始化 ZeroMemory(&OutCardResult,sizeof(OutCardResult)); WORD wMeChairId = m_pIAndroidUserItem->GetChairID(); ASSERT( wMeChairId != INVALID_CHAIR ); if( wMeChairId == INVALID_CHAIR ) return false; //判断胡 if( (m_cbActionMask&WIK_CHI_HU) != WIK_NULL ) { OutCardResult.cbOperateCode = WIK_CHI_HU; OutCardResult.cbOperateCard = m_cbActionCard; return true; } //转换索引 BYTE byCard[MAX_COUNT],byCardCount = 0; for( BYTE i = 0; i < MAX_INDEX; i++ ) { for( BYTE j = 0; j < m_cbCardIndex[wMeChairId][i]; j++ ) { byCard[byCardCount++] = i; } } //判断听 if( WIK_LISTEN == m_GameLogic.AnalyseTingCard(m_cbCardIndex[wMeChairId],m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]) ) { tagTingCardResult TingCardResult; if( SearchTingCard(TingCardResult) ) { BYTE bMostIndex = 0; int nMostCount = -1; BYTE i = 0; while(true) { if( TingCardResult.bTingCardCount[i] == 0 ) break; if( TingCardResult.bRemainCount[i] > nMostCount ) { bMostIndex = i; nMostCount = TingCardResult.bRemainCount[i]; } i++; } //有牌可听 if( nMostCount > 0 ) { //放弃操作 if( wMeChairId != m_wCurrentUser ) return false; OutCardResult.cbOperateCode = WIK_NULL; OutCardResult.cbOperateCard = TingCardResult.bAbandonCard[bMostIndex]; return true; } //听死牌 else if( wMeChairId == m_wCurrentUser ) { //机器AI CAndroidAI AndroidAi; AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.Think(); //从组合中拆牌 BYTE byBadlyCard = 0xff; if( byCardCount <= 2 ) byBadlyCard = AndroidAi.GetBadlyCard(); else byBadlyCard = AndroidAi.GetBadlyIn2Card(); if( 0xff != byBadlyCard ) { OutCardResult.cbOperateCode = WIK_NULL; OutCardResult.cbOperateCard = m_GameLogic.SwitchToCardData(byBadlyCard); return true; } else { //从最佳三只组合中拆牌 byBadlyCard = AndroidAi.GetBadlyIn3Card(); if( 0xff != byBadlyCard ) { OutCardResult.cbOperateCode = WIK_NULL; OutCardResult.cbOperateCard = m_GameLogic.SwitchToCardData(byBadlyCard); return true; } } } } } BYTE cbActionCard = m_cbActionCard; //计算各种操作得分 BYTE cbOperateCode[] = { WIK_GANG,WIK_PENG,WIK_LEFT,WIK_CENTER,WIK_RIGHT,WIK_NULL }; int nOperateScore[] = { 0,0,0,0,0,0 }; //计算原始分 CAndroidAI AndroidAi; AndroidAi.SetEnjoinOutCard( NULL,0 ); AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.Think(); int nOrgScore = AndroidAi.GetMaxScore(); //判断杠 if( m_cbActionMask & WIK_GANG ) { if( m_wCurrentUser == wMeChairId ) { tagGangCardResult GangCardResult; m_GameLogic.AnalyseGangCard(m_cbCardIndex[wMeChairId],m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId],GangCardResult); //寻找最高分杠牌 BYTE cbGangCard = 0; int nMaxGangScore = -1; for( BYTE i = 0; i < GangCardResult.cbCardCount; i++ ) { ASSERT( m_cbCardIndex[wMeChairId][m_GameLogic.SwitchToCardIndex(GangCardResult.cbCardData[i])] > 0 ); if( m_cbCardIndex[wMeChairId][m_GameLogic.SwitchToCardIndex(GangCardResult.cbCardData[i])] == 0 ) throw 0; //计算杠后得分 AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.SetAction(WIK_GANG,m_GameLogic.SwitchToCardIndex(GangCardResult.cbCardData[i])); AndroidAi.Think(); int nScore = AndroidAi.GetMaxScore(); if( nScore > nMaxGangScore ) { nMaxGangScore = nScore; cbGangCard = GangCardResult.cbCardData[i]; } } ASSERT(nMaxGangScore!=-1&&cbGangCard!=0); cbActionCard = cbGangCard; nOperateScore[0] = nMaxGangScore-nOrgScore; } else { ASSERT( m_cbCardIndex[wMeChairId][m_GameLogic.SwitchToCardIndex(cbActionCard)] > 0 ); if( m_cbCardIndex[wMeChairId][m_GameLogic.SwitchToCardIndex(cbActionCard)] == 0 ) throw 0; //计算杠后得分 AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.SetAction(WIK_GANG,m_GameLogic.SwitchToCardIndex(cbActionCard)); AndroidAi.Think(); nOperateScore[0] = AndroidAi.GetMaxScore()-nOrgScore; } } //判断碰 if( m_cbActionMask & WIK_PENG ) { AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.SetAction(WIK_PENG,m_GameLogic.SwitchToCardIndex(cbActionCard)); AndroidAi.Think(); BYTE byBadlyIndex = AndroidAi.GetBadlyCard(); if( byBadlyIndex == 0xff ) { byBadlyIndex = AndroidAi.GetBadlyIn2Card(); if( byBadlyIndex == 0xff ) byBadlyIndex = AndroidAi.GetBadlyIn3Card(); } if( byBadlyIndex != 0xff ) { AndroidAi.RemoveCardData( byBadlyIndex ); AndroidAi.Think(); nOperateScore[1] = AndroidAi.GetMaxScore()-nOrgScore; } } //左吃 if( m_cbActionMask & WIK_LEFT ) { AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.SetAction(WIK_LEFT,m_GameLogic.SwitchToCardIndex(cbActionCard)); AndroidAi.Think(); BYTE byBadlyIndex = AndroidAi.GetBadlyCard(); if( byBadlyIndex == 0xff ) { byBadlyIndex = AndroidAi.GetBadlyIn2Card(); if( byBadlyIndex == 0xff ) byBadlyIndex = AndroidAi.GetBadlyIn3Card(); } if( byBadlyIndex != 0xff ) { AndroidAi.RemoveCardData( byBadlyIndex ); AndroidAi.Think(); nOperateScore[2] = AndroidAi.GetMaxScore()-nOrgScore; } } //中吃 if( m_cbActionMask & WIK_CENTER ) { AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.SetAction(WIK_CENTER,m_GameLogic.SwitchToCardIndex(cbActionCard)); AndroidAi.Think(); BYTE byBadlyIndex = AndroidAi.GetBadlyCard(); if( byBadlyIndex == 0xff ) { byBadlyIndex = AndroidAi.GetBadlyIn2Card(); if( byBadlyIndex == 0xff ) byBadlyIndex = AndroidAi.GetBadlyIn3Card(); } if( byBadlyIndex != 0xff ) { AndroidAi.RemoveCardData( byBadlyIndex ); AndroidAi.Think(); nOperateScore[3] = AndroidAi.GetMaxScore()-nOrgScore; } } //右吃 if( m_cbActionMask & WIK_RIGHT ) { AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.SetAction(WIK_RIGHT,m_GameLogic.SwitchToCardIndex(cbActionCard)); AndroidAi.Think(); BYTE byBadlyIndex = AndroidAi.GetBadlyCard(); if( byBadlyIndex == 0xff ) { byBadlyIndex = AndroidAi.GetBadlyIn2Card(); if( byBadlyIndex == 0xff ) byBadlyIndex = AndroidAi.GetBadlyIn3Card(); } if( byBadlyIndex != 0xff ) { AndroidAi.RemoveCardData( byBadlyIndex ); AndroidAi.Think(); nOperateScore[4] = AndroidAi.GetMaxScore()-nOrgScore; } } //搜索废牌 BYTE cbOutCardData = cbActionCard; if( m_wCurrentUser == wMeChairId ) { AndroidAi.SetCardData(byCard,byCardCount,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId]); AndroidAi.Think(); BYTE byBadlyIndex = AndroidAi.GetBadlyCard(); if( byBadlyIndex == 0xff ) { byBadlyIndex = AndroidAi.GetBadlyIn2Card(); if( byBadlyIndex == 0xff ) { byBadlyIndex = AndroidAi.GetBadlyIn3Card(); ASSERT( byBadlyIndex != 0xff ); if( byBadlyIndex == 0xff ) throw 0; } } AndroidAi.RemoveCardData( byBadlyIndex ); AndroidAi.Think(); nOperateScore[5] = AndroidAi.GetMaxScore()-nOrgScore; cbOutCardData = m_GameLogic.SwitchToCardData(byBadlyIndex); } //获取最高分操作 BYTE cbIndex = 0; for( BYTE i = 1; i < CountArray(nOperateScore); i++ ) { if( nOperateScore[cbIndex] < nOperateScore[i] ) cbIndex = i; } if( (cbOperateCode[cbIndex]&m_cbActionMask) && ( cbOperateCode[cbIndex]==WIK_GANG || nOperateScore[cbIndex] > 0 ) ) { OutCardResult.cbOperateCode = cbOperateCode[cbIndex]; OutCardResult.cbOperateCard = cbActionCard; return true; } else { if( m_wCurrentUser == wMeChairId ) { OutCardResult.cbOperateCard = cbOutCardData; return true; } else return false; } ASSERT( FALSE ); throw 0; } //////////////////////////////////////////////////////////////////////////