0.首先还是先展示一下运行效果

1.做外挂的起因

  玩过几次QQ对对碰游戏,感觉挺好玩。玩着玩着实然心血来潮,打算做一个外挂出现。简单想了一下,感觉可以实现:)。然后就决定把它做出来。带着兴趣带着好奇心带着求知欲,让我们一起出发吧。

2.简单分析一下这个游戏的操作流程

     a.登录QQ游戏大厅,b.打开对对碰游戏,c.选桌位,d.点击开始,e.等待其它玩家,f.正式开始游戏,g.寻找合适的图标进行交换、h.游戏结束,重复d,e,f,g的动作。

     我们这个外挂主要要完成什么的任务呢,应该是g这一步吧。当然最好也可以实现d,e,f.那样外挂用起来就更方便了。

3.寻找解决问题的办法

  经过简单分析我们已经明确了我们这个外挂的目标了,那应该如何实现呢?对于一个从来没有做过外挂的没有一点经验的,我们应该从何入手呢?先说说d的这步操作吧,“点击开始”,如果我们自己做过程序的话,我们肯定会想着要是可以动态的去调用一下这个游戏窗口的这个按钮的单击事件就好了。但是感觉好难是吧,但是我相信是可行的。但是我没有研究这种方法,这种方法可能在VC编程中使用的多。我是用程序模拟鼠标点击“开始”按钮,实现了这个自动开始的功能。

模拟鼠标单击的代码如下:

模拟鼠标单击
[DllImport("user32.dll")]
public static extern bool SetCursorPos(int X, int Y);
[DllImport(
"user32.dll")]
public static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
[Flags]
public enum MouseEventFlag : uint
{
Move
= 0x0001,
LeftDown
= 0x0002,
LeftUp
= 0x0004,
RightDown
= 0x0008,
RightUp
= 0x0010,
MiddleDown
= 0x0020,
MiddleUp
= 0x0040,
XDown
= 0x0080,
XUp
= 0x0100,
Wheel
= 0x0800,
VirtualDesk
= 0x4000,
Absolute
= 0x8000
}

 模拟鼠标单击就可以实现了,那是不是在对对碰的过程中也可以使用这种方法来进行操作呢?答案是肯定的。但是有一个难点,就是我们要确定到底应该是哪两个图标进行交换。把这个问题具体话就是一个8*8的数组中找出相邻的两个交换后可以组成三个或者三个以上相连的说明这两个就是可以交换的。具体应该怎么找请看以下代码:

View Code
1 //交换后,检查x,y位置的行和列 是否可以连成三个或者三个以上,如果是返回就是true
2 public Boolean CanChange(int x,int y, int[,] arr)
3 {
4 int v = arr[x, y];
5 int count = 1;
6 int oldx=x;
7 int oldy=y;
8 //x--
9 while(x > 0)
10 {
11 x--;
12 if (arr[x, y] == v)
13 {
14 count++;
15 }
16 else
17 {
18 break;
19 }
20 }
21 if (count >= 3) return true;
22 else
23 {
24 x = oldx;
25 //x++
26 while (x < 7)
27 {
28 x++;
29 if (arr[x, y] == v)
30 {
31 count++;
32 }
33 else
34 {
35 break;
36 }
37 }
38 if (count >= 3) return true;
39 }
40
41 count = 1;
42 x = oldx;
43 //y--
44 while (y > 0)
45 {
46 y--;
47 if (arr[x, y] == v)
48 {
49 count++;
50 }
51 else
52 {
53 break;
54 }
55 }
56 if (count >= 3) return true;
57 else
58 {
59 y = oldy;
60 //y++
61 while (y < 7)
62 {
63 y++;
64 if (arr[x, y] == v)
65 {
66 count++;
67 }
68 else
69 {
70 break;
71 }
72 }
73 if (count >= 3) return true;
74 }
75 return false;
76 }

其实在这个过程还有一个问题我们没有解决,就是如何把图标转成等价的数组的呢?不知道你有没有做过截图这样的程序,就是用程序把当前屏幕捕获下来。如果你做过,你肯定会想到把游戏界面取出来,然后进行分析。分析也是要方法的,如果你对每种图标的所有像素都要做个对照那就惨了,速度肯定很P。这里因为图标是有限的,是规则的,那么我们完全可以读取每个图标的一个特征像素点来区分出他们可是什么.这特征像素点应该选择在哪呢?当图标有道具的时候你发现道具会显示在图标的右下角,很显然这个特征点是不能选择到右下角的,那我们就选择右上角的一个点。。经过多次测试,得到了一个比较合适的相对点,相对图标右上角的位置为(15,30),对不同的图标有着不同的值。然后我就可以根据得到每个图标的这个点的值得到一个适合解决问题的数组了。

   《----未完---》

作者: 与您分享我的快乐 ---笨笨 发表于 2011-04-10 02:16 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架