• c#QQ连连看辅助


    近来无事,写个连连看辅助,下面先说下思路吧(口才不行,见谅哈)

    游戏辅助有三种方法,一种是读内存,这个不知道怎么分析,还有一种是获取封包,这个分析起来复杂,最后一种是图片识别再分析,这里采用最后一种 图片识别来做。

    设计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 }
    View Code
      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 }
    View Code

    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 }
    View Code

    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 }
    View Code

    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 }
    View Code

    游戏效果:如果ClickNode不添加时间间隔,瞬间全消

  • 相关阅读:
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
    [原]Unity3D深入浅出
  • 原文地址:https://www.cnblogs.com/bfyx/p/4047601.html
Copyright © 2020-2023  润新知