zoukankan      html  css  js  c++  java
  • 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不添加时间间隔,瞬间全消

  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/bfyx/p/4047601.html
Copyright © 2011-2022 走看看