近来无事,写个连连看辅助,下面先说下思路吧(口才不行,见谅哈)
游戏辅助有三种方法,一种是读内存,这个不知道怎么分析,还有一种是获取封包,这个分析起来复杂,最后一种是图片识别再分析,这里采用最后一种 图片识别来做。
设计UI如下
连连看开始》启动辅助》得到游戏窗口信息(位置,大小)》将游戏窗口置顶(其实就是激活状态),并恢复默认状态》截取整个屏幕保存起来》得到游戏区域的坐标信息》分割游戏区域将每一块的大小,位置,并在其上面取9个点的颜色值,存入到List<List<T>>中(同时判断是不是背景色,背景判断是求9个点的颜色平均值,如果每个点和平均值相差5以内就认定是背景)》循环List<List<T>>开始识别
下面说下识别时候的思路
先给个图片
我们都知道连连看最多只可以拐2次
假设红色方块是开始位置,先向左一个方格,得到方格,如果是背景或者是已经消除了的,则检测上方,如果是没有消除的,则判定是不是一样的,
然后向下取一个方格,这时候已经拐了1次了,然后判断这个方格的左侧,然后右侧,然后下侧
按照图上的解释下
得到1是背景则向上,不是背景,判断和目标方块不一样,则向下得到3,是背景,则查看3的左侧,是背景,再左侧,是背景,再....查看到尽头是背景(这个地方为什么不看上下了呢?因为这个时候已经拐了2次了),然后看右侧,得到5,是背景,再右侧...到尽头是背景,然后还是继续向下得到6,是背景,然后看6的左右,依次类推,如果1的下方都没有找到 ,那么继续向左找,得到7,看7的上下,依次类推
本来我是打算使用大漠插件做的 ,但是遇到2个问题:1、采集图片信息太慢,每个方块9个点,采集19*11个方块竟然用了40多S(也可能是我没有找到合适的方法),2、识别后点击的时候快速移动并点击多次会报错
所以我准备自己调用user32.dll的方法来实现
另外,你需要开启连连看游戏,截屏一个图片,然后创建一个解决方案将这个图片放到窗体上,模拟一个游戏窗口,你总不能编写的时候 一会启动一下游戏吧,测试可以用你这个窗口来,等写好后最后测试再用QQ游戏测试下效果
新建一个winform方案,再这个方案想再添加一个专案,就是上面提到的那个测试窗体,就是拉一个picbox放图片,窗体样式设为none效果如下图,
这里你还要得到一个数据,就是窗口左上角到上图红点位置的xy坐标值
我使用根据进程获取句柄,后来发现连连看进程名字会改变,所以需要在config.txt里面配置下 或者修改根据窗口名字获得句柄
然后下面介绍下各个类的作用
Form1 主窗体
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8 using System.Threading;
9 using System.Diagnostics;
10 using System.IO;
11
12 namespace LianLianHelp
13 {
14 public partial class Form1 : Form
15 {
16 public static int SleepTime = 10;
17 private bool isstop = true;
18 private bool isstart = false;
19 string gamename = "KYODAI~1";
20 public Form1()
21 {
22 InitializeComponent();
23 // dm.SetPath(Application.StartupPath + "\\aa");
24 }
25 Point gamePoint1 = new Point();
26 private void button1_Click(object sender, EventArgs e)
27 {
28
29 this.button1.Enabled = false;
30 // Start();
31 Thread th = new Thread(Start);
32 th.IsBackground = true;
33 th.Start();
34 }
35
36 private void Start()
37 {
38 isstart = true;
39 isstop = false;
40 LianLianHelp.LianLelp.ClearList();
41 GetGamePanel();
42 GetNodes();
43 try
44 {
45 StarCheckNode();
46 }
47 catch
48 { }
49 isstart = false;
50 isstop = true;
51 this.button1.BeginInvoke(new MethodInvoker(delegate()
52 {
53 button1.Enabled = true;
54 }));
55 }
56
57 /// <summary>
58 /// 得到游戏信息
59 /// </summary>
60 private void GetGamePanel()
61 {
62 //YodaoDict LianLianDemo
63 // Process[] ps = Process.GetProcessesByName("KYODAI~1");
64 Process[] ps = Process.GetProcessesByName(gamename);
65 IntPtr lianlian_hwnd = ps[0].MainWindowHandle;
66 // int lianlian_hwnd = dm.FindWindow("", "QQ游戏 - 连连看角色版");
67
68 Point mousepoint = LianLianHelp.GetMousePoint();
69 LianLianHelp.ShowWindow(lianlian_hwnd, 1);
70 LianLianHelp.SetForegroundWindow(lianlian_hwnd);
71 // dm.GetCursorPos(ref x, ref y);
72 //dm.SetWindowState(lianlian_hwnd, 1);
73 // dm.MoveTo(0, 0);
74 LianLianHelp.MoveMouse(0, 0);
75 //LianLianHelp.SetWindowSize();
76 LianLianHelp.LianLelp.PrintScreen(Application.StartupPath + "\\screen.jpg");
77 // dm.CaptureJpg(0, 0, dm.GetScreenWidth(), dm.GetScreenHeight(), "screen.jpg", 100);
78 LianLianHelp.MoveMouse(mousepoint.X, mousepoint.Y);
79 // dm.MoveTo((int)x, (int)y);
80 //得到窗口大小
81 int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
82 LianLianHelp.GetWindowRects(lianlian_hwnd, ref x1, ref y1, ref x2, ref y2);
83 gamePoint1 = new Point((int)x1 + HelpSource.game_offset.X, (int)y1 + HelpSource.game_offset.Y);
84 }
85
86 /// <summary>
87 /// 得到游戏图片方块
88 /// </summary>
89 private void GetNodes()
90 {
91 int x = gamePoint1.X;
92 int y = gamePoint1.Y;
93
94 Bitmap bitmap = new Bitmap(Application.StartupPath + "\\screen.jpg");
95 for (int j = 0; j < 19; j++)
96 {
97 int _x = x + HelpSource.pieceSize.Width * j;
98
99 List<LianLianClass> lclist = new List<LianLianClass>();
100 for (int i = 0; i < 11; i++)
101 {
102 int _y = y + HelpSource.pieceSize.Height * i;
103 LianLianClass lc = new LianLianClass();
104
105 int xindex = _x + 10;
106 int[] _corlrs = new int[9];
107 int cindex = 0;
108 for (int m = 0; m < 3; m++)
109 {
110 int yindex = _y + 10;
111 for (int n = 0; n < 3; n++)
112 {
113 Color color = bitmap.GetPixel(xindex, yindex);
114
115 int r = Convert.ToInt32(color.R);
116 int g = Convert.ToInt32(color.G);
117 int b = Convert.ToInt32(color.B);
118 //string colorstr = dm.GetColor(xindex, yindex);
119 //int _colorcount = Getcolor(colorstr);
120 _corlrs[cindex] = r + g + b;
121 yindex += 5;
122 cindex++;
123 }
124 xindex += 5;
125 }
126 int colorcount = 0;
127 lc.IsBackgrpund = CheckValue(_corlrs, ref colorcount);
128 lc.ThisPoint = new Point(_x + 15, _y + 15);
129 lc.ListPoint = new Point(j, i);
130 lc.ColorNumCount = _corlrs;
131 lclist.Add(lc);
132 }
133 LianLianHelp.LianLelp.LianList.Add(lclist);
134 }
135 bitmap.Dispose();
136 }
137
138 private void StarCheckNode()
139 {
140 List<List<LianLianClass>> lianList = LianLianHelp.LianLelp.LianList;
141 while (true)
142 {
143 for (int x = 0; x < 19; x++)
144 {
145 for (int y = 0; y < 11; y++)
146 {
147 if (lianList[x][y].IsBackgrpund || lianList[x][y].Ismove)
148 continue;
149 thisllc = lianList[x][y];
150
151 // thisllc.ListPoint = new Point(x, y);
152 if (!CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.LEFT))
153 if (!CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.UP))
154 if (!CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.RIGHT))
155 CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.DOWN);
156 }
157 }
158 if (LianLianHelp.LianLelp.CheckISOK())
159 {
160 break;
161 }
162 }
163 }
164 LianLianClass thisllc = null;
165 LianLianClass checkllc = null;
166 /// <summary>
167 ///
168 /// </summary>
169 /// <param name="lc">当前位置方块</param>
170 /// <param name="checkindex">第几个转弯,</param>
171 /// <param name="nodeType">lc类型</param>
172 /// <param name="toDirection">方向</param>
173 private bool CheckNode(LianLianClass lc, int checkindex, NODETYPE nodeType, TODIRECTION toDirection)
174 {
175 if (isstop)
176 {
177 throw new Exception();
178 }
179 if (checkindex > 2)
180 return false;
181 if (toDirection == TODIRECTION.LEFT)
182 {
183 #region left
184 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);
185 if (_lc == null)
186 return false;
187 if (_lc.ListPoint == thisllc.ListPoint)
188 return false;
189 if (_lc.IsBackgrpund || _lc.Ismove)
190 {
191 int _c = checkindex + 1;
192 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.UP))
193 {
194 return true;
195 }
196 _c = checkindex + 1;
197 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.DOWN))
198 {
199 return true;
200 }
201 else
202 {
203 _c = checkindex;
204 return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.LEFT);
205 }
206 }
207 else
208 {
209 if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))
210 {
211 ClickNode(_lc, thisllc);
212 return true;
213 }
214 else
215 return false;
216 }
217 #endregion
218 }
219 else if (toDirection == TODIRECTION.RIGHT)
220 {
221 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);
222 if (_lc == null)
223 return false;
224 if (_lc.ListPoint == thisllc.ListPoint)
225 return false;
226 if (_lc.IsBackgrpund || _lc.Ismove)
227 {
228 int _c = checkindex + 1;
229 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.UP))
230 {
231 return true;
232 }
233 _c = checkindex + 1;
234 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.DOWN))
235 {
236 return true;
237 }
238 else
239 {
240 _c = checkindex;
241 return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.RIGHT);
242 }
243 }
244 else
245 {
246 if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))
247 {
248 ClickNode(_lc, thisllc);
249 return true;
250 }
251 else
252 return false;
253 }
254 }
255 else if (toDirection == TODIRECTION.UP)
256 {
257 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);
258 if (_lc == null)
259 return false;
260 if (_lc.ListPoint == thisllc.ListPoint)
261 return false;
262 if (_lc.IsBackgrpund || _lc.Ismove)
263 {
264 int _c = checkindex + 1;
265 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.LEFT))
266 {
267 return true;
268 }
269 _c = checkindex + 1;
270 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.RIGHT))
271 {
272 return true;
273 }
274 else
275 {
276 _c = checkindex;
277 return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.UP);
278 }
279 }
280 else
281 {
282 if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))
283 {
284 ClickNode(_lc, thisllc);
285 return true;
286 }
287 else
288 return false;
289 }
290 }
291 else
292 {
293 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);
294 if (_lc == null)
295 return false;
296 if (_lc.ListPoint == thisllc.ListPoint)
297 return false;
298 if (_lc.IsBackgrpund || _lc.Ismove)
299 {
300 int _c = checkindex + 1;
301 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.LEFT))
302 {
303 return true;
304 }
305 _c = checkindex + 1;
306 if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.RIGHT))
307 {
308 return true;
309 }
310 else
311 {
312 _c = checkindex;
313 return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.DOWN);
314 }
315 }
316 else
317 {
318 if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))
319 {
320 ClickNode(_lc, thisllc);
321 return true;
322 }
323 else
324 return false;
325 }
326 }
327
328 }
329
330 private bool CheckValue(int[] values, ref int count)
331 {
332 foreach (int i in values)
333 {
334 count += i;
335 }
336 int _index = count / values.Length;
337 foreach (int i in values)
338 {
339 if (Math.Abs(i - _index) >= 5)
340 {
341 return false;
342 }
343 }
344 return true;
345 }
346
347 private void ClickNode(LianLianClass lc1, LianLianClass lc2)
348 {
349 lc1.Ismove = true;
350 lc2.Ismove = true;
351 LianLianHelp.MoveMouse(lc1.ThisPoint.X, lc1.ThisPoint.Y);
352 Thread.Sleep(100);
353 LianLianHelp.LeftClick(lc1.ThisPoint.X, lc1.ThisPoint.Y);
354 Thread.Sleep(100);
355 LianLianHelp.MoveMouse(lc2.ThisPoint.X, lc2.ThisPoint.Y);
356 Thread.Sleep(100);
357 LianLianHelp.LeftClick(lc2.ThisPoint.X, lc2.ThisPoint.Y);
358 Thread.Sleep(SleepTime);
359 Console.WriteLine("Click(" + lc1.ListPoint.X + "," + lc1.ListPoint.Y + ") and (" + lc2.ListPoint.X + "," + lc2.ListPoint.Y + ")");
360 }
361
362 private void button2_Click(object sender, EventArgs e)
363 {
364 Application.Exit();
365 }
366
367 private void radioButton2_Click(object sender, EventArgs e)
368 {
369 RadioButton rdo = sender as RadioButton;
370 int index = int.Parse(rdo.Tag.ToString());
371 Random r = new Random();
372 switch (index)
373 {
374 case 0:
375 SleepTime = 10;
376 break;
377 case 1: SleepTime = r.Next(500, 2000); break;
378 case 2: SleepTime = r.Next(500, 4000); break;
379 case 3: SleepTime = r.Next(500, 8000); break;
380 }
381 button1.Enabled = true;
382 }
383
384 private void Form1_Load(object sender, EventArgs e)
385 {
386 using (StreamReader reader = new StreamReader(Application.StartupPath + "\\config.txt"))
387 {
388 string _name = reader.ReadToEnd().Trim();
389 if (_name.Length > 0)
390 gamename = reader.ReadToEnd();
391 }
392 LianLianHelp.RegisterHotKey(this.Handle, 800, 0, Keys.F10);
393 LianLianHelp.RegisterHotKey(this.Handle, 801, 0, Keys.F11);
394 LianLianHelp.RegisterHotKey(this.Handle, 802, 0, Keys.F6);
395 LianLianHelp.RegisterHotKey(this.Handle, 803, 0, Keys.F7);
396 }
397
398 protected override void WndProc(ref Message m)
399 {
400 switch (m.Msg)
401 {
402 case 0x0312: //这个是window消息定义的注册的热键消息
403 if (m.WParam.ToString().Equals("800"))
404 {
405 if (!isstart)
406 {
407 isstart = true;
408 this.button1.Enabled = false;
409 // Start();
410 Thread th = new Thread(Start);
411 th.IsBackground = true;
412 th.Start();
413 }
414 }
415 else if (m.WParam.ToString().Equals("801"))
416 {
417 isstop = true;
418 }
419 else if (m.WParam.ToString().Equals("802"))
420 {
421 this.Hide();
422 }
423 else if (m.WParam.ToString().Equals("803"))
424 {
425 this.Show();
426 }
427
428 break;
429 }
430 base.WndProc(ref m);
431 }
432
433 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
434 {
435 LianLianHelp.UnregisterHotKey(this.Handle, 800);
436 LianLianHelp.UnregisterHotKey(this.Handle, 801);
437 LianLianHelp.UnregisterHotKey(this.Handle, 802);
438 LianLianHelp.UnregisterHotKey(this.Handle, 803);
439 }
440 }
441
442 }
1 namespace LianLianHelp
2 {
3 partial class Form1
4 {
5 /// <summary>
6 /// 設計工具所需的變數。
7 /// </summary>
8 private System.ComponentModel.IContainer components = null;
9
10 /// <summary>
11 /// 清除任何使用中的資源。
12 /// </summary>
13 /// <param name="disposing">如果應該處置 Managed 資源則為 true,否則為 false。</param>
14 protected override void Dispose(bool disposing)
15 {
16 if (disposing && (components != null))
17 {
18 components.Dispose();
19 }
20 base.Dispose(disposing);
21 }
22
23 #region Windows Form 設計工具產生的程式碼
24
25 /// <summary>
26 /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器
27 /// 修改這個方法的內容。
28 /// </summary>
29 private void InitializeComponent()
30 {
31 this.button1 = new System.Windows.Forms.Button();
32 this.radioButton1 = new System.Windows.Forms.RadioButton();
33 this.radioButton2 = new System.Windows.Forms.RadioButton();
34 this.radioButton3 = new System.Windows.Forms.RadioButton();
35 this.radioButton4 = new System.Windows.Forms.RadioButton();
36 this.button2 = new System.Windows.Forms.Button();
37 this.groupBox1 = new System.Windows.Forms.GroupBox();
38 this.groupBox2 = new System.Windows.Forms.GroupBox();
39 this.label4 = new System.Windows.Forms.Label();
40 this.label3 = new System.Windows.Forms.Label();
41 this.label2 = new System.Windows.Forms.Label();
42 this.label1 = new System.Windows.Forms.Label();
43 this.groupBox1.SuspendLayout();
44 this.groupBox2.SuspendLayout();
45 this.SuspendLayout();
46 //
47 // button1
48 //
49 this.button1.Enabled = false;
50 this.button1.Location = new System.Drawing.Point(42, 136);
51 this.button1.Name = "button1";
52 this.button1.Size = new System.Drawing.Size(75, 23);
53 this.button1.TabIndex = 0;
54 this.button1.Text = "开始";
55 this.button1.UseVisualStyleBackColor = true;
56 this.button1.Click += new System.EventHandler(this.button1_Click);
57 //
58 // radioButton1
59 //
60 this.radioButton1.AutoSize = true;
61 this.radioButton1.Location = new System.Drawing.Point(9, 20);
62 this.radioButton1.Name = "radioButton1";
63 this.radioButton1.Size = new System.Drawing.Size(47, 16);
64 this.radioButton1.TabIndex = 1;
65 this.radioButton1.Tag = "0";
66 this.radioButton1.Text = "闪电";
67 this.radioButton1.UseVisualStyleBackColor = true;
68 this.radioButton1.Click += new System.EventHandler(this.radioButton2_Click);
69 //
70 // radioButton2
71 //
72 this.radioButton2.AutoSize = true;
73 this.radioButton2.Checked = true;
74 this.radioButton2.Location = new System.Drawing.Point(72, 20);
75 this.radioButton2.Name = "radioButton2";
76 this.radioButton2.Size = new System.Drawing.Size(47, 16);
77 this.radioButton2.TabIndex = 2;
78 this.radioButton2.TabStop = true;
79 this.radioButton2.Tag = "1";
80 this.radioButton2.Text = "烈马";
81 this.radioButton2.UseVisualStyleBackColor = true;
82 this.radioButton2.Click += new System.EventHandler(this.radioButton2_Click);
83 //
84 // radioButton3
85 //
86 this.radioButton3.AutoSize = true;
87 this.radioButton3.Location = new System.Drawing.Point(135, 20);
88 this.radioButton3.Name = "radioButton3";
89 this.radioButton3.Size = new System.Drawing.Size(47, 16);
90 this.radioButton3.TabIndex = 3;
91 this.radioButton3.Tag = "2";
92 this.radioButton3.Text = "脱兔";
93 this.radioButton3.UseVisualStyleBackColor = true;
94 this.radioButton3.Click += new System.EventHandler(this.radioButton2_Click);
95 //
96 // radioButton4
97 //
98 this.radioButton4.AutoSize = true;
99 this.radioButton4.Location = new System.Drawing.Point(198, 21);
100 this.radioButton4.Name = "radioButton4";
101 this.radioButton4.Size = new System.Drawing.Size(47, 16);
102 this.radioButton4.TabIndex = 4;
103 this.radioButton4.Tag = "3";
104 this.radioButton4.Text = "蜗牛";
105 this.radioButton4.UseVisualStyleBackColor = true;
106 this.radioButton4.Click += new System.EventHandler(this.radioButton2_Click);
107 //
108 // button2
109 //
110 this.button2.Location = new System.Drawing.Point(153, 136);
111 this.button2.Name = "button2";
112 this.button2.Size = new System.Drawing.Size(75, 23);
113 this.button2.TabIndex = 5;
114 this.button2.Text = "退出";
115 this.button2.UseVisualStyleBackColor = true;
116 this.button2.Click += new System.EventHandler(this.button2_Click);
117 //
118 // groupBox1
119 //
120 this.groupBox1.Controls.Add(this.radioButton4);
121 this.groupBox1.Controls.Add(this.radioButton1);
122 this.groupBox1.Controls.Add(this.radioButton2);
123 this.groupBox1.Controls.Add(this.radioButton3);
124 this.groupBox1.Location = new System.Drawing.Point(7, 6);
125 this.groupBox1.Name = "groupBox1";
126 this.groupBox1.Size = new System.Drawing.Size(260, 45);
127 this.groupBox1.TabIndex = 6;
128 this.groupBox1.TabStop = false;
129 this.groupBox1.Text = "速度";
130 //
131 // groupBox2
132 //
133 this.groupBox2.Controls.Add(this.label4);
134 this.groupBox2.Controls.Add(this.label3);
135 this.groupBox2.Controls.Add(this.label2);
136 this.groupBox2.Controls.Add(this.label1);
137 this.groupBox2.Location = new System.Drawing.Point(5, 58);
138 this.groupBox2.Name = "groupBox2";
139 this.groupBox2.Size = new System.Drawing.Size(260, 72);
140 this.groupBox2.TabIndex = 7;
141 this.groupBox2.TabStop = false;
142 this.groupBox2.Text = "热键";
143 //
144 // label4
145 //
146 this.label4.AutoSize = true;
147 this.label4.Location = new System.Drawing.Point(135, 45);
148 this.label4.Name = "label4";
149 this.label4.Size = new System.Drawing.Size(59, 12);
150 this.label4.TabIndex = 3;
151 this.label4.Text = "停止:F11";
152 //
153 // label3
154 //
155 this.label3.AutoSize = true;
156 this.label3.Location = new System.Drawing.Point(13, 45);
157 this.label3.Name = "label3";
158 this.label3.Size = new System.Drawing.Size(59, 12);
159 this.label3.TabIndex = 2;
160 this.label3.Text = "开始:F10";
161 //
162 // label2
163 //
164 this.label2.AutoSize = true;
165 this.label2.Location = new System.Drawing.Point(135, 22);
166 this.label2.Name = "label2";
167 this.label2.Size = new System.Drawing.Size(53, 12);
168 this.label2.TabIndex = 1;
169 this.label2.Text = "呼出:F7";
170 //
171 // label1
172 //
173 this.label1.AutoSize = true;
174 this.label1.Location = new System.Drawing.Point(11, 22);
175 this.label1.Name = "label1";
176 this.label1.Size = new System.Drawing.Size(53, 12);
177 this.label1.TabIndex = 0;
178 this.label1.Text = "隐藏:F6";
179 //
180 // Form1
181 //
182 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
183 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
184 this.ClientSize = new System.Drawing.Size(271, 171);
185 this.Controls.Add(this.groupBox2);
186 this.Controls.Add(this.groupBox1);
187 this.Controls.Add(this.button2);
188 this.Controls.Add(this.button1);
189 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
190 this.Name = "Form1";
191 this.Text = "QQ连连看游戏辅助";
192 this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
193 this.Load += new System.EventHandler(this.Form1_Load);
194 this.groupBox1.ResumeLayout(false);
195 this.groupBox1.PerformLayout();
196 this.groupBox2.ResumeLayout(false);
197 this.groupBox2.PerformLayout();
198 this.ResumeLayout(false);
199
200 }
201
202 #endregion
203
204 private System.Windows.Forms.Button button1;
205 private System.Windows.Forms.RadioButton radioButton1;
206 private System.Windows.Forms.RadioButton radioButton2;
207 private System.Windows.Forms.RadioButton radioButton3;
208 private System.Windows.Forms.RadioButton radioButton4;
209 private System.Windows.Forms.Button button2;
210 private System.Windows.Forms.GroupBox groupBox1;
211 private System.Windows.Forms.GroupBox groupBox2;
212 private System.Windows.Forms.Label label4;
213 private System.Windows.Forms.Label label3;
214 private System.Windows.Forms.Label label2;
215 private System.Windows.Forms.Label label1;
216 }
217 }
HelpSource 保存一些数据
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Drawing;
5
6 namespace LianLianHelp
7 {
8 class HelpSource
9 {
10 /// <summary>
11 /// 游戏区域相对于窗口偏移
12 /// </summary>
13 public static Point game_offset = new Point(15, 182);
14 /// <summary>
15 /// 游戏区域大小
16 /// </summary>
17 public static Size gameSize = new Size(589, 385);
18 /// <summary>
19 /// 每个方块大小
20 /// </summary>
21 public static Size pieceSize = new Size(31, 35);
22 }
23 }
LianLianClass 游戏小方格类
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Drawing;
5
6 namespace LianLianHelp
7 {
8 class LianLianClass
9 {
10 private int[] colorNumCount=new int[9];
11 /// <summary>
12 /// 颜色值
13 /// </summary>
14 public int[] ColorNumCount
15 {
16 get { return colorNumCount; }
17 set { colorNumCount = value; }
18 }
19
20 private bool isBackgrpund = false;
21 /// <summary>
22 /// 是否是背景
23 /// </summary>
24 public bool IsBackgrpund
25 {
26 get { return isBackgrpund; }
27 set { isBackgrpund = value; }
28 }
29
30 private Point thisPoint;
31 /// <summary>
32 /// 方块位置
33 /// </summary>
34 public Point ThisPoint
35 {
36 get { return thisPoint; }
37 set { thisPoint = value; }
38 }
39
40 private Point listPoint;
41 /// <summary>
42 /// 数组中的位置
43 /// </summary>
44 public Point ListPoint
45 {
46 get { return listPoint; }
47 set { listPoint = value; }
48 }private bool ismove = false;
49 /// <summary>
50 /// 是否移除了
51 /// </summary>
52 public bool Ismove
53 {
54 get { return ismove; }
55 set { ismove = value; }
56 }
57
58 private TODIRECTION toDirection = TODIRECTION.RIGHT;
59
60 internal TODIRECTION ToDirection
61 {
62 get { return toDirection; }
63 set { toDirection = value; }
64 }
65 }
66 }
LianLianHelp 游戏辅助类
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Drawing;
5 using System.Windows.Forms;
6 using System.Runtime.InteropServices;
7 using System.Diagnostics;
8
9 namespace LianLianHelp
10 {
11 enum TODIRECTION
12 {
13 LEFT,
14 RIGHT,
15 UP,
16 DOWN
17 }
18
19 enum NODETYPE
20 {
21 SOURCENODE,
22 OTHERNODE
23 }
24
25 class LianLianHelp
26 {
27 private static LianLianHelp lianLelp;
28
29 public static LianLianHelp LianLelp
30 {
31 get
32 {
33 if (lianLelp == null)
34 {
35 lianLelp = new LianLianHelp();
36 }
37 return LianLianHelp.lianLelp;
38 }
39 }
40
41 private LianLianHelp()
42 {
43
44 }
45
46 public void ClearList()
47 {
48 LianList.Clear();
49 }
50
51 List<List<LianLianClass>> lianList = new List<List<LianLianClass>>();
52 /// <summary>
53 /// 方块列表
54 /// </summary>
55 public List<List<LianLianClass>> LianList
56 {
57 get { return lianList; }
58 set { lianList = value; }
59 }
60
61
62 public bool Isalike(LianLianClass c1, LianLianClass c2)
63 {
64
65 for (int i = 0; i < 9; i++)
66 {
67 if (Math.Abs(c1.ColorNumCount[i] - c2.ColorNumCount[i]) > 20)
68 return false;
69 }
70 return true;
71 }
72
73 public LianLianClass GetLLC(int thisx, int thisy, TODIRECTION toDirection)
74 {
75 LianLianClass lc = GetNextLLC(thisx, thisy, toDirection);
76 if (lc.Ismove == true || lc.IsBackgrpund == true)
77 lc = GetLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);
78 return lc;
79 }
80
81 public LianLianClass GetNextLLC(int thisx, int thisy, TODIRECTION toDirection)
82 {
83 LianLianClass lc = null;
84 switch (toDirection)
85 {
86 case TODIRECTION.LEFT:
87 if (thisx == 0)
88 return null;
89 else
90 {
91 lc = LianList[thisx - 1][thisy];
92 }
93 break;
94 case TODIRECTION.RIGHT:
95 if (thisx == 18)
96 return null;
97 else
98 {
99 lc = LianList[thisx + 1][thisy];
100 }
101 break;
102 case TODIRECTION.UP:
103 if (thisy == 0)
104 return null;
105 else
106 {
107 lc = LianList[thisx][thisy - 1];
108
109 }
110 break;
111 case TODIRECTION.DOWN:
112 if (thisy == 10)
113 return null;
114 else
115 {
116 lc = LianList[thisx][thisy + 1];
117 }
118 break;
119 }
120 return lc;
121 }
122
123 public bool CheckISOK()
124 {
125 for (int x = 0; x < 19; x++)
126 {
127 for (int y = 0; y < 11; y++)
128 {
129 LianLianClass llc = LianList[x][y];
130 if (llc.IsBackgrpund)
131 {
132 continue;
133 }
134 if (!llc.Ismove)
135 {
136 return false;
137 }
138 }
139 }
140 return true;
141 }
142
143
144 public void PrintScreen(string file)
145 {
146 Bitmap bit = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
147 Graphics g = Graphics.FromImage(bit);
148 g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bit.Size);
149 bit.Save(file);
150 g.Dispose();
151 bit.Dispose();
152 }
153
154 #region 鼠标
155 const int MOUSEEVENTF_MOVE = 0x0001; // 移动鼠标
156 const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下
157 const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起
158 const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下
159 const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起
160 const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;// 模拟鼠标中键按下
161 const int MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起
162 const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标
163
164 [DllImport("user32.dll", EntryPoint = "GetCursorPos")]//获取鼠标坐标
165 private static extern int GetCursorPos(
166 ref POINTAPI lpPoint
167 );
168
169 [System.Runtime.InteropServices.DllImport("user32")]
170 private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
171
172 public static void LeftClick(int x, int y)
173 {
174 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x * 65535 / Screen.PrimaryScreen.Bounds.Width, y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0);//点击
175 mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, x * 65535 / Screen.PrimaryScreen.Bounds.Width, y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0);//抬起
176 }
177
178 public static void MoveMouse(int x, int y)
179 {
180 mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x * 65535 / Screen.PrimaryScreen.Bounds.Width, y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0);
181 }
182
183 [StructLayout(LayoutKind.Sequential)]//定义与API相兼容结构体,实际上是一种内存转换
184 private struct POINTAPI
185 {
186 public int X;
187 public int Y;
188 }
189
190 public static Point GetMousePoint()
191 {
192 LianLianHelp.POINTAPI pointapi = new LianLianHelp.POINTAPI();
193 LianLianHelp.GetCursorPos(ref pointapi);
194 return new Point(pointapi.X, pointapi.Y);
195 }
196 #endregion
197
198 #region 窗体
199 public const int SW_HIDE = 0;
200 public const int SW_SHOWNORMAL = 1;
201 public const int SW_SHOWMINIMIZED = 2;
202 public const int SW_SHOWMAXIMIZED = 3;
203 public const int SW_MAXIMIZE = 3;
204 public const int SW_SHOWNOACTIVATE = 4;
205 public const int SW_SHOW = 5;
206 public const int SW_MINIMIZE = 6;
207 public const int SW_SHOWMINNOACTIVE = 7;
208 public const int SW_SHOWNA = 8;
209 public const int SW_RESTORE = 9;
210
211 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
212 public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
213 [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
214 public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体
215 [DllImport("user32.dll")]
216 [return: MarshalAs(UnmanagedType.Bool)]
217 private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
218
219 [StructLayout(LayoutKind.Sequential)]
220 private struct RECT
221 {
222 public int Left; //最左坐标
223 public int Top; //最上坐标
224 public int Right; //最右坐标
225 public int Bottom; //最下坐标
226 }
227
228 [DllImport("user32.dll", CharSet = CharSet.Auto)]
229 public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);
230
231 public static int SetWindowSize(IntPtr hWnd, int x, int y, int width, int height)
232 {
233 return MoveWindow(hWnd, x, y, width, height, false);
234 }
235
236 public static int GetWindowHandle(string name)
237 {
238 Process[] ps = Process.GetProcessesByName(name);
239 return ps[0].MainWindowHandle.ToInt32();
240 }
241
242 public static void GetWindowRects(IntPtr hWnd, ref int x1, ref int y1, ref int x2, ref int y2)
243 {
244 RECT rect = new RECT();
245 GetWindowRect(hWnd, ref rect);
246 x1 = rect.Left;
247 y1 = rect.Top;
248 x2 = rect.Right;
249 y2 = rect.Bottom;
250 }
251
252
253 #endregion
254
255 #region 热键
256 //注册热键的api
257 [DllImport("user32.dll")]
258 public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);
259 [DllImport("user32.dll")]
260 public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
261
262
263 #endregion
264 }
265 }
游戏效果:如果ClickNode不添加时间间隔,瞬间全消