数据我们已经获取到了,接下来 没有什么能阻止我们实现外挂了~,现在小编就来说说关于qq连连看怎么设置图?下面内容希望能帮助到你,我们来一起看看吧!
qq连连看怎么设置图
数据我们已经获取到了,接下来 没有什么能阻止我们实现外挂了~
我们先在我们的游戏中,定义一个[11][19]的byte类型数组 用以存储数据
byte m_szGameData[11][19];
然后再写一个 ReadGameData() 函数 用以读取数据
bool CKyodaiPluginDlg::ReadGameData()
{
HWND hGameWnd = GetGameHwnd();
ZeroMemory(m_szGameData, 11 * 19);
if (!hGameWnd)
{
return FALSE;
}
DWORD dwPid = false;
GetWindowThreadProcessId(hGameWnd, &dwPid);
HANDLE hGameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
if (!hGameProcess)
{
MessageBox(L”打开进程失败”);
return false;
}
if (!ReadProcessMemory(hGameProcess, (LPVOID)0x00199F68, m_szGameData, sizeof(m_szGameData), NULL))
{
return false;
}
}
上面这段代码大家都很熟悉了,就不做讲解了(若想了解更多,请关注我的博客 http://www点dbgpro点com)
接下来就是要怎么消除的问题了,如下图,是否可以消除无非就是三种情况,两个在同一条线上,这也就一条线可以消除,要要门就是2条线段可以消除,最多只能有3条线
我们要判断x1,y1 x2,y能否消除 我们要先构建2个点x3y3,x4y4 如果 x1y1能到达x3y3(也就是说他们直接的数据都是0) 并且x3y3能到达x4y4 并且 x2y2能到达x4y4则 可以消除
//判断两个点之间是不是连通的
bool CLLK_WGDlg::LineIsNull(int nRow, int nCol, int nRow2, int nCol2)
{
if (nRow2 == nRow && nCol2 != nCol)
{
int nColMax = max(nCol2,nCol);
int nColMin = min(nCol2,nCol);
for (int y = nColMin; y <= nColMax;y )
{
if (m_szGameData[nRow][y] != 0)
{
return false;
}
}
return true;
}
else if (nCol == nCol2 && nRow != nRow2)
{
int nRowMin = min(nRow,nRow2);
int nRowMax = max(nRow,nRow2);
for (int x = nRowMin; x <= nRowMax;x )
{
if (m_szGameData[x][nCol] != 0)
{
return false;
}
}
return true;
}
else if (nRow2 == nRow && nCol2 == nCol) // 2点为同一点的情况
{
return true;
}
else
{
return false;
}
return true;
}
bool CLLK_WGDlg::IsClear(int nRow, int nCol, int nRow2, int nCol2)
{
//先把两个点的数据拿出来
byte data1 = m_szGameData[nRow][nCol];
byte data2 = m_szGameData[nRow2][nCol2];
//把两个点的数据置0 是为了两个贴在一起的能消除
m_szGameData[nRow][nCol] = 0;
m_szGameData[nRow2][nCol2] = 0;
int nTmpRow1 = nRow;
int nTmpRow2 = nRow2;
for (int nTmpCol = 0; nTmpCol < 19;nTmpCol )
{
if (LineIsNull(nTmpRow1, nTmpCol, nTmpRow2, nTmpCol) && LineIsNull(nTmpRow1, nTmpCol, nRow, nCol) && LineIsNull(nTmpRow2, nTmpCol, nRow2, nCol2))
{
m_szGameData[nRow][nCol] = data1;
m_szGameData[nRow2][nCol2] = data2;
return true;
}
}
int nTmpCol1 = nCol;
int nTmpCol2 = nCol2;
for (int nTmpRow = 0; nTmpRow < 11;nTmpRow )
{
if (LineIsNull(nTmpRow, nTmpCol1,nTmpRow, nTmpCol2) && LineIsNull(nTmpRow,nTmpCol1,nRow, nCol) && LineIsNull(nTmpRow,nTmpCol2, nRow2, nCol2))
{
m_szGameData[nRow][nCol] = data1;
m_szGameData[nRow2][nCol2] = data2;
return true;
}
}
m_szGameData[nRow][nCol] = data1;
m_szGameData[nRow2][nCol2] = data2;
return false;
}
我们再添加一个函数 ClearOne 用于消除一对
void CKyodaiPluginDlg::ClearOne()
{
ReadGameData();
for (int nRow = 0; nRow < 11; nRow )
{
for (int nCol = 0; nCol < 19; nCol )
{
if (m_szGameData[nRow][nCol] == 0)
{
continue;
}
for (int nRow2 = 0; nRow2 < 11; nRow2 )
{
for (int nCol2 = 0; nCol2 < 19; nCol2 )
{
if ((nRow2 != nRow || nCol2 != nCol) && m_szGameData[nRow][nCol] == m_szGameData[nRow2][nCol2] && IsClear(nRow, nCol, nRow2, nCol2))
{
SelectChess(nRow, nCol);
SelectChess(nRow2, nCol2);
return;
}
}
}
}
}
}
clearOne中 如果判断可以消除 则调用SelectChess
可以消的算法有了,我们双击单消按钮,然后添加代码如下
void CKyodaiPluginDlg::SelectChess(int nRow, int nCol)
{
HWND hGameWnd = GetGameHwnd();
if (hGameWnd)
{
int nPosXBase = 5;
int nPosYBase = 165;
int xPos = (nCol 1) * 30 nPosXBase;
int yPos = (nRow 1) * 35 nPosYBase;
::PostMessage(hGameWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(xPos, yPos));
::PostMessage(hGameWnd, WM_LBUTTONUP, 0, MAKELPARAM(xPos, yPos));
}
}
上面代码中5,165是第一个图片的位置,30,35是每一格图片的大小
接着,我们在按钮消除一对的响应函数中 增加如下调用一下 ClearOne
//消除一对
void CKyodaiPluginDlg::OnBnClickedBtnremove()
{
ClearOne();
}
接着我们运行游戏 测试一下....本篇文章到此结束(若想了解更多,请关注我的博客 http://www点dbgpro点com)...QQ连连看写辅助系列未完待续...
QQ连连看写辅助系列每篇都有源代码,若想获取源代码请私信我。