mn

本文介绍了一种检测斗地主游戏中玩家手牌状态的方法,包括读取游戏内存中的牌信息,并判断游戏是否处于发牌阶段。通过对游戏进程内存的操作,实现对底牌和游戏状态的获取。

void DDZ::GetCoverPoker(HANDLE hGame)
{
    BYTE buf[20];
    ReadProcessMemory(hGame,(LPCVOID)COVER_ADDR, buf, 18 , NULL);
    for(int i= 0; i<3;i++)
    {
        m_CoverPoker[i].number = buf[i*8];
        m_CoverPoker[i].type = buf[i*8+1];
    }
}
//通过底牌是否有值判断,(也可通过三家剩余数)
int DDZ::GetGameState(HANDLE hGame)
{
    BYTE game_state=0;
    ReadProcessMemory(hGame,(LPCVOID)(COVER_ADDR+1),&game_state,1,NULL);
    if(game_state == 0)
        return WAITING;
    else
        return RUNNING;
}

int DDZ::Run()
{
    int nReturn = FAIL;

    if(!IsDDZ())
    {
        InitPoker();  //初始化一下剩余牌
        if(m_hGame)
        {
            CloseHandle(m_hGame); //hGame 没释放则释放
            m_hGame = NULL;
        }           
        return FAIL;
    }

    if(!m_hGame)          //若ddz进程句柄释放了,则重新获得之
    {
        m_hGame = GetProcessHandle(_T("ddzrpg.exe"));
        if(m_hGame == (HANDLE)-1)
            return -1;  //初始化失败! (几乎不可能出现)
    }

   
    if(WAITING == GetGameState(m_hGame))
    {
        bInitCard = false;

        return FAIL;
    }   
    if(RUNNING == GetGameState(m_hGame))
    {
        if(false == bInitCard)
        {
            InitPoker();
            bInitCard = true;
        }
    }

    if( SUCCESS == CollectPostedPoker((LPCVOID)FIRST_CUR_COUNT,(LPCVOID)FIRST_POST_CARD_ADDR,m_FirstPoker))
        nReturn = SUCCESS;
    if( SUCCESS == CollectPostedPoker((LPCVOID)MID_CUR_COUNT,(LPCVOID)MID_POST_CARD_ADDR,m_MiddlePoker))
        nReturn = SUCCESS;
    if( SUCCESS == CollectPostedPoker((LPCVOID)LAST_CUR_COUNT,(LPCVOID)LAST_POST_CARD_ADDR,m_LastPoker))
        nReturn = SUCCESS;




    return nReturn;
}

 

#define FIRST_CUR_COUNT            0X004D0D68
#define FIRST_REMAIN_COUNT        0x004d0ac0
#define FIRST_POST_CARD_ADDR    0x004d0ad4

#define LAST_CUR_COUNT            0X004D0C24
#define LAST_REMAIN_COUNT       0x004D1B10
#define LAST_POST_CARD_ADDR     0x004d1b24   

#define MID_CUR_COUNT            0X004D1DB8
#define MID_REMAIN_COUNT        0x004D12e8
#define MID_POST_CARD_ADDR      0x004d1bfc

#define COVER_ADDR              0x004DAC2C

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值