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連連看寫輔助系列每篇都有源代碼,若想獲取源代碼請私信我。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!