注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

姑射道人的博客

博客新地址:nixuchen.com

 
 
 

日志

 
 

【转帖】帮老婆刷分 “天天爱消除”“天天连萌”  

2013-10-14 10:17:30|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
自从微信5.0发布以后,新增的功能除了游戏之外,其他的并没有更多的体验,像银行卡绑定,手机支付这些,我想我是一直不会使用的,无论它做得再好,一句话,“不安全,丢了手机还丢钱包”。
闲话少说,国庆前媳妇豆包和周围朋友都一直在疯狂的玩微信的小游戏“天天爱消除”,“天天联萌”,有一天跟朋友说,弄个刷分的工具,刷刷分吧,朋友顿时各种搜索,找了些刷分的程序,大致功能是修改游戏里存储积分的字段,存储金币的字段等,保证在提交的结果时候会有一个高分,结果没过几天就被腾讯清号了,游戏的金币等级全被将为0。作为一个极端主义的IT男,肯定是会思考各种办法去解决,下面进入正题。

背景
通过计算机自动玩微信游戏“天天爱消除”,“天天连萌”,主要目的是为帮助老婆刷分。

难点
1、  用电脑程序实现手动模拟触屏;
2、  图像识别,捕获屏幕图像,把图像转换为对应的数组(数组中不同的值代表不同图案);
3、  搜索最优移动方案。

核心算法
首先写了一个用电脑操作手机的类: Robot.java(主要操作类) , Point.java(定义手机坐标类)
主要接口如下:


public void Snapshot();                            //获取手机截图  
  
public void Drag(Point p1,Point p2) ;  //模拟触屏,从点p1移动到p2  
  
public void Touch(Point p)  ;                 //模拟触屏,点击p点  
  
public void SetNum();                          //通过获取的截图设置num数组,对于不同的游戏,实现不一样  
  
public Point Search();                         //搜索,返回最优点,同上,对于不同的游戏,实现不一样。  
  
........  



天天爱消除--- 图像的识别算法:
由于只有7中颜色,而且颜色的区分度比较明显,因此取图像指定范围的RGB像素值,定义一个精度,计算是否满足即可,获取颜色代码如下:



    public int GetColor(BufferedImage bufferedImage,int startx,int starty,int width,int height)  
    {  
           int R = 0;  
           int G = 0;  
           int B = 0;  
           for(int rx = startx;rx<startx+width;rx++)  
           {  
               for(int ry = starty;ry<starty+height;ry++)  
               {  
                   int RGB = bufferedImage.getRGB(rx, ry);  
                   R += (RGB & 0xff0000 ) >> 16 ;  
                   G += (RGB & 0xff00 ) >> 8 ;  
                   B += (RGB & 0xff );   
               }  
           }   
           R = R/(width*height);  
           G = G/(width*height);  
           B = B/(width*height);  
           Double[] temp = new Double[7];  
           double jingdu = 50;  
           //红色  
           int i = 254;  
           int j = 82;  
           int k = 105;  
           temp[0] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           //白色   
           i=234;j=233;k=233;  
           temp[1] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           //绿色  
           i=186;j=240;k=91;  
           temp[2] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           //黄色  
           i=253;j=228;k=85;  
           temp[3] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           //棕色  
           i=234;j=151;k=86;  
           temp[4] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           //紫色  
           i=160;j=127;k=200;  
           temp[5] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           //蓝色  
            i=83;j=179;k=233;  
           temp[6] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));  
           if(temp[0]<jingdu)  
               return 1;//System.out.print("红色");  
           else if(temp[1]<jingdu)  
               return 2;// System.out.print("白色");  
           else if(temp[2]<jingdu)  
               return 3;// System.out.print("绿色");  
           else if(temp[3]<jingdu)  
               return 4; // System.out.print("黄色");  
           else if(temp[4]<jingdu)  
               return 5;// System.out.print("棕色");  
           else if(temp[5]<jingdu)  
               return 6;// System.out.print("紫色");  
           else if(temp[6]<jingdu)  
               return 7;//  System.out.print("蓝色");   
           else  
              return random.nextInt(1000)+8; //  System.out.print("未匹配");      
    }


天天爱消除的---搜索算法:
        计算最优解。由于当消去4个或5个以及特殊道具会有额外加分及消除功能,暂不考虑,只需要消去3个,4个,5个相同颜色时的权重即可。
        定义f(3)=350,f(4)=1200,f(5)=5000,即单次消除的分值(玩游戏时估计出一个值)
        每次移动,发生的消去只能在移动点和被移动点之间产生,因此只需要分别计算以该两点为中心,上下左右最大相同匹配的长度和次数。


【转帖】帮老婆刷分 “天天爱消除”“天天连萌” - 姑射道人 - 姑射道人的博客


上图最优移动方案为 swap(1,4,2,4) , [1][4] 与 [2][4]交换,可同时消去两对,生成的M=700。


本帖隐藏的内容


       public int Get_Value(int x,int y)  
        {   
            int temp = num[x][y];  
            int value = 0;  
            int row_con = 1;  
            int col_con = 1;  
            int a = x-1;  
            int b = y;  
            while(a>=0 && temp==num[a--][ b ])  
                col_con++;  
            a = x+1;  
            while(a<N && temp==num[a++][ b ])  
                col_con++;  
            a = x;  
            b = y-1;  
            while(b>=0 && temp==num[a][b--])  
                row_con++;  
            b = y+1;  
            while(b<N && temp==num[a][b++])  
                row_con++;   
            value += Calculate(row_con);  
            value += Calculate(col_con);         
            return value;  
        }  
  
        private int Calculate(int x)  
        {   
            switch(x)  
            {  
                case 3:  
                    return 350;         
                case 4:  
                    return 800;   
                case 5:  
                    return 1700;   
                default:   
            }   
            return 0;  
        }  




天天连萌---图像识别算法:
       由于天天连萌图像比较多,而且相似的颜色图案也比较多,因此不能采用计算区域平均颜色来定义每个图案。在实际识别的时候,为了丰富知识,采用了汉明距离计算图像相似度的算法(具体可参考链接:http://www.open-open.com/lib/view/open1358901340114.html),但是存在的问题就是需要提前把每种图案进行存储,用手机截屏加PS,会很快实现,为了达到相似的计算,建议去中间75*65范围图像,这样避免了有时候会出现道具,加分等符号的影响,最后识别的效果感觉非常不错。每种图像定义一种值,大约有30种不同的图案吧,没有图案则置为0。每获取一种图,就进行搜索是否存在,存在置相应的数,否则为0,如发现炸弹的图案,同样置0。(炸弹实际上不阻挡消去路径,保留的话可以到游戏结束增加积分。)

天天连萌---搜索算法: 
       由图像转换得到的一个数组,定义为5*10,加上外围边界,实际上是7*12的数组,范围对于计算机来说是非常小了。因此直接采用深度优先,控制方向,控制转弯次数即可达到搜索目的。



本帖隐藏的内容


   public void Start_Search() throws InterruptedException  
        {   
            while(!Is_empty())  
            {   
                for(int i = 1;i<=Width;i++)  
                    for(int j = 1;j<=Height;j++)   
                          if( num[ i ][j]!=0 && Search(i,j,num[ i ][j]))  
                                   Touch_hengping(i, j);   
                              
            }   
        }  
  
      private  boolean Search(int x,int y,int target)  
       {  
           int con = 2;  
           if(Search_path(x-1,y,1,2,target)||Search_path(x+1,y,2,2,target)||Search_path(x,y-1,3,2,target)||Search_path(x,y+1,4,2,target))  
           {  
               num[x][y]=0;  
               return true;  
           }   
           return false;  
       }     
  
      private  boolean Search_path(int x,int y , int dir,int con,int target)  
      {  ... }




Search_path就是深度求解的过程,x,y表示起点坐标,dir表示方向,con表示可拐弯次数,target表示目标数值。

效果:
虽然不能达到很高的分数,但是也可以保持在游戏排名靠前的位置,免得被腾讯发现又分数又清零了。事实上通过模拟按键的方式刷分,应该很难检测出来的。

【转帖】帮老婆刷分 “天天爱消除”“天天连萌” - 姑射道人 - 姑射道人的博客

目前最高刷到27关,平均2s可闯一关,但是由于每次截图耗时,所以连击较少,分数并不高。

【转帖】帮老婆刷分 “天天爱消除”“天天连萌” - 姑射道人 - 姑射道人的博客

在图像处理上还需要优化。

缺点:
1、通过计算机发送指令到手机上捕获图片再回传到计算机上,测试需要耗时1.5秒,太费时间;
2、在天天连萌中进行图像识别时候,均涉及到文件的访问,所以在截图后再匹配图片的时候也需要一段时间,也很费时;
3、天天爱消除中消除后的效果影响截图,对图像识别有影响,截图的次数多,实际情况较慢。


改进:
将程序移植到手机上,利用手机进行计算,省去了图像在手机与计算机之间的传输,但可惜的是对手机移动应用开发并不擅长,因此还需要时间才能完成。


【本帖为转帖,看到好贴忍不住和小伙伴分享,原帖出自csdn博客 Lon's 实验室】
  评论这张
 
阅读(429)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017