|
- #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;i<m_cbWeaveCount[wOperateUser];i++)
- {
- BYTE cbWeaveKind=m_WeaveItemArray[wOperateUser][i].cbWeaveKind;
- BYTE cbCenterCard=m_WeaveItemArray[wOperateUser][i].cbCenterCard;
- if ((cbCenterCard==cbOperateCard)&&(cbWeaveKind==WIK_PENG))
- {
- cbWeaveIndex=i;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbPublicCard=TRUE;
- m_WeaveItemArray[wOperateUser][cbWeaveIndex].cbWeaveKind=pOperateResult->cbOperateCode;
- 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<MAX_INDEX-ZI_PAI_COUNT;i++)
- {
- //空牌过滤
- if (cbCardIndexTemp[i]==0) continue;
-
- //听牌处理
- cbCardIndexTemp[i]--;
-
- //听牌判断
- bool bHuCard = false;
- bAbandonCardCount = TingCardResult.bAbandonCount;
- CChiHuRight chr;
- for (BYTE j=0;j<MAX_INDEX-ZI_PAI_COUNT;j++)
- {
- //胡牌分析
- BYTE cbCurrentCard=m_GameLogic.SwitchToCardData(j);
- BYTE cbHuCardKind=m_GameLogic.AnalyseChiHuCard(cbCardIndexTemp,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId],cbCurrentCard,chr);
-
- //结果判断
- if (cbHuCardKind!=WIK_NULL)
- {
- bHuCard = true;
- TingCardResult.bTingCard[bAbandonCardCount][TingCardResult.bTingCardCount[bAbandonCardCount]++] = cbCurrentCard;
- }
- }
- if( bHuCard == true )
- {
- TingCardResult.bAbandonCard[TingCardResult.bAbandonCount++] = m_GameLogic.SwitchToCardData(i);
- }
- //还原处理
- cbCardIndexTemp[i]++;
- }
- }
- else
- {
- //听牌判断
- bAbandonCardCount = TingCardResult.bAbandonCount;
- CChiHuRight chr;
- for (BYTE j=0;j<MAX_INDEX-ZI_PAI_COUNT;j++)
- {
- //胡牌分析
- BYTE cbCurrentCard=m_GameLogic.SwitchToCardData(j);
- BYTE cbHuCardKind=m_GameLogic.AnalyseChiHuCard(cbCardIndexTemp,m_WeaveItemArray[wMeChairId],m_cbWeaveCount[wMeChairId],cbCurrentCard,chr);
-
- //结果判断
- if (cbHuCardKind!=WIK_NULL)
- {
- TingCardResult.bTingCard[bAbandonCardCount][TingCardResult.bTingCardCount[bAbandonCardCount]++] = cbCurrentCard;
- }
- }
- }
-
- //计算剩余牌
- BYTE n = 0;
- while( TingCardResult.bTingCardCount[n] > 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;
- }
-
- //////////////////////////////////////////////////////////////////////////
|