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

被折叠的 条评论
为什么被折叠?



