woaidaima2016 发表于 2017-6-13 11:12:38

欢乐斗地主+机器人【源码】

http://img.woaidaima.com//upload/image/20170524/1495587329557025847.pnghttp://img.woaidaima.com//upload/image/20170524/1495587331407093840.png#include "Stdafx.h"
#include "AndroidUserItemSink.h"

//////////////////////////////////////////////////////////////////////////

//辅助时间
#define TIME_LESS                  1                                    //最少时间
#define TIME_DISPATCH                5                                    //发牌时间

//游戏时间
#define TIME_OUT_CARD                3                                    //出牌时间
#define TIME_START_GAME                8                                    //开始时间
#define TIME_CALL_SCORE                5                                    //叫分时间

//游戏时间
#define IDI_OUT_CARD                (0)            //出牌时间
#define IDI_START_GAME                (1)            //开始时间
#define IDI_CALL_SCORE                (2)            //叫分时间

//////////////////////////////////////////////////////////////////////////

//构造函数
CAndroidUserItemSink::CAndroidUserItemSink()
{
    //游戏变量
    m_wBankerUser=INVALID_CHAIR;
    m_cbCurrentLandScore = 255 ;                //已叫分数
    m_wOutCardUser = INVALID_CHAIR ;

    //扑克变量
    m_cbTurnCardCount=0;
    ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData));

    //手上扑克
    ZeroMemory(m_cbHandCardData,sizeof(m_cbHandCardData));
    ZeroMemory(m_cbHandCardCount,sizeof(m_cbHandCardCount));

    //接口变量
    m_pIAndroidUserItem=NULL;;

    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_cbTurnCardCount=0;
    ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData));

    //手上扑克
    ZeroMemory(m_cbHandCardData,sizeof(m_cbHandCardData));
    ZeroMemory(m_cbHandCardCount,sizeof(m_cbHandCardCount));

    return true;
}

//时间消息
bool CAndroidUserItemSink::OnEventTimer(UINT nTimerID)
{
    switch (nTimerID)
    {
    case IDI_START_GAME:    //开始游戏
      {
            //开始判断
            m_pIAndroidUserItem->SendUserReady(NULL,0);

            return true;
      }
    case IDI_CALL_SCORE:    //用户叫分
      {
            //构造变量
            CMD_C_CallScore CallScore;
            ZeroMemory(&CallScore,sizeof(CallScore));

            //设置变量
            CallScore.cbCallScore=m_GameLogic.LandScore(m_pIAndroidUserItem->GetChairID(), m_cbCurrentLandScore);

            //发送数据
            m_pIAndroidUserItem->SendSocketData(SUB_C_CALL_SCORE,&CallScore,sizeof(CallScore));

            return true;
      }
    case IDI_OUT_CARD:      //用户出牌
      {
            //扑克分析
            tagOutCardResult OutCardResult;
            try
            {
                WORD wMeChairID=m_pIAndroidUserItem->GetChairID();
               
                m_GameLogic.SearchOutCard(m_cbHandCardData,m_cbHandCardCount,m_cbTurnCardData,m_cbTurnCardCount, m_wOutCardUser, m_pIAndroidUserItem->GetChairID(), OutCardResult);
            }
            catch(...)
            {
                //这里的设置,使得进入下面的if处理
                ZeroMemory(OutCardResult.cbResultCard, sizeof(OutCardResult.cbResultCard)) ;
                OutCardResult.cbCardCount = 10 ;
            }
            //牌型合法判断
            if(OutCardResult.cbCardCount>0 && CT_ERROR==m_GameLogic.GetCardType(OutCardResult.cbResultCard, OutCardResult.cbCardCount))
            {
                ASSERT(false) ;
                ZeroMemory(&OutCardResult, sizeof(OutCardResult)) ;
            }

            //先出牌不能为空
            if(m_cbTurnCardCount==0)
            {
                ASSERT(OutCardResult.cbCardCount>0) ;
                if(OutCardResult.cbCardCount==0)
                {
                  WORD wMeChairID=m_pIAndroidUserItem->GetChairID();
                  //最小一张
                  OutCardResult.cbCardCount = 1 ;
                  OutCardResult.cbResultCard=m_cbHandCardData-1] ;
                }
            }
            else
            {
                if(!m_GameLogic.CompareCard(m_cbTurnCardData,OutCardResult.cbResultCard,m_cbTurnCardCount,OutCardResult.cbCardCount))
                {
                  //放弃出牌
                  m_pIAndroidUserItem->SendSocketData(SUB_C_PASS_CARD);
                  return true;
                }               
            }

            //结果判断
            if (OutCardResult.cbCardCount>0)
            {
                WORD wMeChairID=m_pIAndroidUserItem->GetChairID();
                //删除扑克
                m_cbHandCardCount-=OutCardResult.cbCardCount;
                m_GameLogic.RemoveCard(OutCardResult.cbResultCard,OutCardResult.cbCardCount,m_cbHandCardData,m_cbHandCardCount+OutCardResult.cbCardCount);

                //构造变量
                CMD_C_OutCard OutCard;
                ZeroMemory(&OutCard,sizeof(OutCard));

                //设置变量
                OutCard.cbCardCount=OutCardResult.cbCardCount;
                CopyMemory(OutCard.cbCardData,OutCardResult.cbResultCard,OutCardResult.cbCardCount*sizeof(BYTE));

                //发送数据
                WORD wHeadSize=sizeof(OutCard)-sizeof(OutCard.cbCardData);
                m_pIAndroidUserItem->SendSocketData(SUB_C_OUT_CARD,&OutCard,wHeadSize+OutCard.cbCardCount*sizeof(BYTE));
            }
            else
            {
                //放弃出牌
                m_pIAndroidUserItem->SendSocketData(SUB_C_PASS_CARD);
            }

            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_CALL_SCORE:    //用户叫分
      {
            return OnSubCallScore(pData,wDataSize);
      }
    case SUB_S_BANKER_INFO:    //庄家信息
      {
            return OnSubBankerInfo(pData,wDataSize);
      }
    case SUB_S_OUT_CARD:    //用户出牌
      {
            return OnSubOutCard(pData,wDataSize);
      }
    case SUB_S_PASS_CARD:    //用户放弃
      {
            return OnSubPassCard(pData,wDataSize);
      }
    case SUB_S_GAME_CONCLUDE:    //游戏结束
      {
            return OnSubGameEnd(pData,wDataSize);
      }
    }

    //错误断言
//    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_T_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_T_CALL:    //叫分状态
      {
            //效验数据
            if (wDataSize!=sizeof(CMD_S_StatusCall)) return false;
            CMD_S_StatusCall * pStatusCall=(CMD_S_StatusCall *)pData;

            //扑克数据
            for (WORD i=0;i<GAME_PLAYER;i++) m_cbHandCardCount=NORMAL_COUNT;
            CopyMemory(m_cbHandCardData,pStatusCall->cbHandCardData,sizeof(BYTE)*NORMAL_COUNT);

            //叫分设置
            if (m_pIAndroidUserItem->GetChairID()==pStatusCall->wCurrentUser)
            {
                UINT nElapse=rand()%TIME_CALL_SCORE+TIME_LESS;
                m_pIAndroidUserItem->SetGameTimer(IDI_CALL_SCORE,nElapse+TIME_DISPATCH);
            }

            return true;
      }
    case GS_T_PLAY:    //游戏状态
      {
            //效验数据
            if (wDataSize!=sizeof(CMD_S_StatusPlay)) return false;
            CMD_S_StatusPlay * pStatusPlay=(CMD_S_StatusPlay *)pData;

            //出牌变量
            m_cbTurnCardCount=pStatusPlay->cbTurnCardCount;
            CopyMemory(m_cbTurnCardData,pStatusPlay->cbTurnCardData,m_cbTurnCardCount*sizeof(BYTE));

            //扑克数据
            WORD wMeChairID=m_pIAndroidUserItem->GetChairID();
            CopyMemory(m_cbHandCardCount,pStatusPlay->cbHandCardCount,sizeof(m_cbHandCardCount));
            CopyMemory(m_cbHandCardData,pStatusPlay->cbHandCardData,sizeof(BYTE)*m_cbHandCardCount);

            //玩家设置
            if (pStatusPlay->wCurrentUser==m_pIAndroidUserItem->GetChairID())
            {
                UINT nElapse=rand()%TIME_OUT_CARD+TIME_LESS+TIME_LESS;
                m_pIAndroidUserItem->SetGameTimer(IDI_OUT_CARD,nElapse);
            }

            return true;
      }
    }

    //错误断言
    ASSERT(FALSE);

    return false;
}

//用户进入
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(VOID * pData, WORD wDataSize)
{
    //效验参数
    ASSERT(wDataSize==sizeof(CMD_S_AndroidCard));
    if (wDataSize!=sizeof(CMD_S_AndroidCard)) return false;

    //变量定义
    CMD_S_AndroidCard * pAndroidCard=(CMD_S_AndroidCard *)pData;

    //设置状态
    m_pIAndroidUserItem->SetGameStatus(GS_T_CALL);
    m_cbCurrentLandScore = 255 ;

    //扑克变量
    m_cbTurnCardCount=0;
    ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData));

    //手上扑克
    WORD wMeChairID=m_pIAndroidUserItem->GetChairID();
    for (WORD i=0;i<GAME_PLAYER;i++) m_cbHandCardCount=NORMAL_COUNT;

    for(WORD wChairID=0; wChairID<GAME_PLAYER; ++wChairID)
    {
      if(wChairID==wMeChairID)
            CopyMemory(m_cbHandCardData,pAndroidCard->cbHandCard,sizeof(BYTE)*NORMAL_COUNT);

      m_GameLogic.SetUserCard(wChairID, pAndroidCard->cbHandCard, NORMAL_COUNT) ;
    }

    //叫牌扑克
    BYTE cbLandScoreCardData ;
    CopyMemory(cbLandScoreCardData, m_cbHandCardData,m_cbHandCardCount) ;
    CopyMemory(cbLandScoreCardData+NORMAL_COUNT, pAndroidCard->cbHandCard+51, 3) ;
    m_GameLogic.SetLandScoreCardData(cbLandScoreCardData, sizeof(cbLandScoreCardData)) ;

    //排列扑克
    m_GameLogic.SortCardList(m_cbHandCardData,m_cbHandCardCount,ST_ORDER);

    //玩家处理
    if (m_pIAndroidUserItem->GetChairID()==pAndroidCard->wCurrentUser)
    {
      UINT nElapse=rand()%TIME_CALL_SCORE+TIME_LESS;
      m_pIAndroidUserItem->SetGameTimer(IDI_CALL_SCORE,nElapse+TIME_DISPATCH);
    }

    return true;
}

//用户叫分
bool CAndroidUserItemSink::OnSubCallScore(VOID * pData, WORD wDataSize)
{
    //效验参数
    ASSERT(wDataSize==sizeof(CMD_S_CallScore));
    if (wDataSize!=sizeof(CMD_S_CallScore)) return false;

    //变量定义
    CMD_S_CallScore * pCallScore=(CMD_S_CallScore *)pData;
    m_cbCurrentLandScore = pCallScore->cbCurrentScore ;

    //用户处理
    if (m_pIAndroidUserItem->GetChairID()==pCallScore->wCurrentUser)
    {
      UINT nElapse=rand()%TIME_CALL_SCORE+TIME_LESS;
      m_pIAndroidUserItem->SetGameTimer(IDI_CALL_SCORE,nElapse);
    }

    return true;
}

//庄家信息
bool CAndroidUserItemSink::OnSubBankerInfo(VOID * pData, WORD wDataSize)
{
    //效验参数
    ASSERT(wDataSize==sizeof(CMD_S_BankerInfo));
    if (wDataSize!=sizeof(CMD_S_BankerInfo)) return false;

    //变量定义
    CMD_S_BankerInfo * pBankerInfo=(CMD_S_BankerInfo *)pData;

    //设置状态
    m_pIAndroidUserItem->SetGameStatus(GS_T_PLAY);

    //设置变量
    m_wBankerUser=pBankerInfo->wBankerUser;
    m_cbHandCardCount+=CountArray(pBankerInfo->cbBankerCard);

    //设置扑克
    if (pBankerInfo->wBankerUser==m_pIAndroidUserItem->GetChairID())
    {
      //设置扑克
      CopyMemory(&m_cbHandCardData,pBankerInfo->cbBankerCard,sizeof(pBankerInfo->cbBankerCard));

      //排列扑克
      WORD wMeChairID=m_pIAndroidUserItem->GetChairID();
      m_GameLogic.SortCardList(m_cbHandCardData,m_cbHandCardCount,ST_ORDER);
    }
    //设置底牌
    m_GameLogic.SetBackCard(pBankerInfo->wBankerUser, pBankerInfo->cbBankerCard, 3) ;

    //玩家设置
    if (pBankerInfo->wCurrentUser==m_pIAndroidUserItem->GetChairID())
    {
      UINT nElapse=rand()%TIME_OUT_CARD+TIME_LESS+TIME_LESS;
      m_pIAndroidUserItem->SetGameTimer(IDI_OUT_CARD,nElapse);
    }
    m_GameLogic.SetBanker(pBankerInfo->wBankerUser) ;

    return true;
}

//用户出牌
bool CAndroidUserItemSink::OnSubOutCard(VOID * pData, WORD wDataSize)
{
    //变量定义
    CMD_S_OutCard * pOutCard=(CMD_S_OutCard *)pData;
    WORD wHeadSize=sizeof(CMD_S_OutCard)-sizeof(pOutCard->cbCardData);

    //效验数据
    ASSERT((wDataSize>=wHeadSize)&&(wDataSize==(wHeadSize+pOutCard->cbCardCount*sizeof(BYTE))));
    if ((wDataSizecbCardCount*sizeof(BYTE)))) return false;

    //出牌变量
    if (pOutCard->wCurrentUser==pOutCard->wOutCardUser)
    {
      m_cbTurnCardCount=0;
      ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData));
    }
    else
    {
      m_cbTurnCardCount=pOutCard->cbCardCount;
      CopyMemory(m_cbTurnCardData,pOutCard->cbCardData,pOutCard->cbCardCount*sizeof(BYTE));
      m_wOutCardUser = pOutCard->wOutCardUser ;
    }

    //扑克数目
    if (pOutCard->wOutCardUser!=m_pIAndroidUserItem->GetChairID())
    {
      m_cbHandCardCount-=pOutCard->cbCardCount;
    }

    //玩家设置
    if (m_pIAndroidUserItem->GetChairID()==pOutCard->wCurrentUser)
    {
      UINT nElapse=rand()%TIME_OUT_CARD+TIME_LESS+TIME_LESS;
      m_pIAndroidUserItem->SetGameTimer(IDI_OUT_CARD,nElapse);
    }

    //设置变量
    m_GameLogic.RemoveUserCardData(pOutCard->wOutCardUser, pOutCard->cbCardData, pOutCard->cbCardCount) ;

    return true;
}

//用户放弃
bool CAndroidUserItemSink::OnSubPassCard(VOID * pData, WORD wDataSize)
{
    //效验数据
    ASSERT(wDataSize==sizeof(CMD_S_PassCard));
    if (wDataSize!=sizeof(CMD_S_PassCard)) return false;

    //变量定义
    CMD_S_PassCard * pPassCard=(CMD_S_PassCard *)pData;

    //一轮判断
    if (pPassCard->cbTurnOver==TRUE)
    {
      m_cbTurnCardCount=0;
      ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData));
    }

    //玩家设置
    if (m_pIAndroidUserItem->GetChairID()==pPassCard->wCurrentUser)
    {
      UINT nElapse=rand()%TIME_OUT_CARD+TIME_LESS+TIME_LESS;
      m_pIAndroidUserItem->SetGameTimer(IDI_OUT_CARD,nElapse);
    }

    return true;
}

//游戏结束
bool CAndroidUserItemSink::OnSubGameEnd(VOID * pData, WORD wDataSize)
{
    //效验数据
    ASSERT(wDataSize==sizeof(CMD_S_GameConclude));
    if (wDataSize!=sizeof(CMD_S_GameConclude)) return false;

    //变量定义
    CMD_S_GameConclude * pGameEnd=(CMD_S_GameConclude *)pData;

    //设置状态
    m_pIAndroidUserItem->SetGameStatus(GS_T_FREE);

    //设置变量
    m_cbTurnCardCount=0;
    ZeroMemory(m_cbTurnCardData,sizeof(m_cbTurnCardData));
    ZeroMemory(m_cbHandCardData,sizeof(m_cbHandCardData));
    ZeroMemory(m_cbHandCardCount,sizeof(m_cbHandCardCount));

    //删除时间
    m_pIAndroidUserItem->KillGameTimer(IDI_OUT_CARD);
    m_pIAndroidUserItem->KillGameTimer(IDI_CALL_SCORE);

    //开始设置
    UINT nElapse=rand()%TIME_START_GAME+TIME_LESS;
    m_pIAndroidUserItem->SetGameTimer(IDI_START_GAME,nElapse);

    return true;
}

//////////////////////////////////////////////////////////////////////////

页: [1]
查看完整版本: 欢乐斗地主+机器人【源码】