这几天期末考,完全没有考试的心情,又无聊到玩起连连看,可惜输得太多,非常不爽,于是自己做个连连看外挂玩一下。网上有很多连连看的外挂可以下载,不过自己做一个来用,感觉自然不一样,毕竟还是学计算机的嘛~~这里简要记下做的过程,有兴趣自己写的朋友可以参考参考~~~
我是用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是我自己写的,用来计算逻辑坐标到游戏窗口坐标的转换。
四、测试
看看我使用该工具秒杀的截图吧。提供了一个按键,全部消去的功能。