這幾天期末考,完全沒有考試的心情,又無聊到玩起連連看,可惜輸得太多,非常不爽,于是自己做個連連看外挂玩一下。網上有很多連連看的外挂可以下載下傳,不過自己做一個來用,感覺自然不一樣,畢竟還是學計算機的嘛~~這裡簡要記下做的過程,有興趣自己寫的朋友可以參考參考~~~
我是用MFC做的~開發環境:Xp sp2 、Visual Studio.NET 2003
一、QQ遊戲連連看玩法。

玩法非常簡單,用滑鼠點選兩個相同的格子,如果兩個格子可以用一條“線”連起來,則這兩個格子可以消去。關鍵是這條“線”最多隻能有兩個拐點!~
二、外挂的功能需求。
功能簡單:一個按鍵,讓遊戲自動消去一對格子········
三、外挂原理。
1.獲得遊戲資料:
首先,需要獲得遊戲的格子資料,才能進一步用算出哪兩個格子可以消去。對于QQ遊戲連連看,可以采用網上比較普遍的做法,讀取螢幕像素點,根據像素點判斷是什麼格子(紅球or藍球or黑桃or······)。
為了獲得遊戲的像素資料,必須先獲得遊戲視窗的指針,在程式中我注冊了幾個全局熱鍵,我的機制是使用者激活遊戲視窗,按下外挂注冊的全局熱鍵(例如我的是F1鍵)。這個時候利用一個API獲得視窗指針。
// CWnd* m_pGameWindow; //遊戲視窗
m_pGameWindow = GetForegroundWindow();//取出最“頂”的視窗
接着就可以讀取遊戲視窗的像素值了,基本思想就是寫一個循環
for(int i=0;i<11;i++)// 11行
{
for(int j=0;j<19;j++)//19列 全世界都知道QQ的連連看方格是11行19列
//具體讀取像素操作
}
具體代碼就不貼了~太多了。。最終的結果是将螢幕的格子資料儲存到一個11X19的二維數組中,數組的坐标(i,j)就代表在遊戲中第幾行,幾列。array[i][j]的值如果為0就代表該處為空沒有格子,1、2、3····就代表不同的格子。像上面那張圖檔編碼後應該就為:
1 0 0 2 3 0 0 4 5 0 0 6 7 0 0 8 3 0 0 第一行編碼的結果 。。其它行的就不再貼了。
2.計算可消去的一對格子:
我已經将遊戲資料儲存到了一個二維數組了。接下來就是如何計算一個哪兩個格子可以消去.我的做法是将這個二維數組看成一個圖,利用我針對連連看改進的寬度圖搜尋算法。
3.模拟滑鼠點選消去格子:
當算法算出兩個可消去的格子的數組坐标後,需要将其轉換到實際的螢幕坐标,再進行滑鼠模拟點選。
void CLLKCheatDlg::Imitate(int beginX,int beginY,int endX,int endY)
{
//相對于遊戲視窗的兩個坐标
CPoint begin = getPoint(beginX,beginY);
CPoint end = getPoint(endX,endY);
//轉換到螢幕坐标
m_pGameWindow->ClientToScreen(&begin);
m_pGameWindow->ClientToScreen(&end);
//移動滑鼠到第一個點
::SetCursorPos(begin.x,begin.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
::SetCursorPos(end.x,end.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
//getPoint是我自己寫的,用來計算邏輯坐标到遊戲視窗坐标的轉換。
四、測試
看看我使用該工具秒殺的截圖吧。提供了一個按鍵,全部消去的功能。