帮豆包刷“天天爱消除”,“天天连萌”

自从微信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、天天爱消除中消除后的效果影响截图,对图像识别有影响,截图的次数多,实际情况较慢。


改进:

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


LT比较懒,很少写博客,10月后回归,多写东西锻炼写作能力。


Java程序员花两天做了个消消乐(天天爱消除 引言: 一直就想做一个消消乐,这次正好找到了素材,就自己琢磨写了一个,我觉得这个游戏难点就在消除后的下落。 效果图 实现思路 1.绘制窗口、按钮、边框等 2.实现Card类,用来代表每一个小图形。 3.创建二维数组9行8列 最后 加入积分、游戏结束、重新开始、音效等等就完成了 看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏,能【 关注 】一波就更好了。 想要代码的 加微信 或 私聊 我! 为了助更多小白从零进阶 Java 工程师,从CSDN官方那边搞来了一套 《Java 工程师学习成长知识图谱 阅读详情

相关推荐

天天爱消除 游戏Unity3D源码代码分享 绝对精品 .zip

天天爱消除 游戏Unity3D源码代码分享 绝对精品 .zip

2021.01.20【NOIP提高B组】总结

T1:天天爱跑步 没花什么时间打,就打了几个表,25分水到了 正解没听懂 T2:换教室 考试嫌题面太长,没有打 正解就小小DP,后悔考试不打 T3:蚯蚓 妙极了,考试时用了堆,结果55分T掉了 正解,三个单调队列 总结: 考的还是不理想,主要第二题,50分直接白给,我都没要。 T3还要练练思维,考试时没想到用单调队列 ...

zhy_Learn的博客 2120

精品源码 / 休闲游戏 / 天天爱消除

1、这是一款经典的天天爱消除游戏 2、用户通过移动相同物体进行消除,获取分数通关 3、收费只是想让你们知道资源得来不易

Java 消消乐游戏--去重

因此,[A-Za-z]+能够匹配由一个或多个大小写英文字母组成的字符串,但不能匹配其他类型的字符。如果输入的字符串不符合要求,程序将输出false。输入原始字符串 str,只能包含大小写因为字母,字母大小写敏感,str 长度不超过 100。游戏规则:输入一个只包含英文字母的字符串,字符串中的两个字母如果相邻且相同,就可以消除。在字符串上反复执行消除的动作,直到无法继续消除为止,此时游戏结束。输入中包含非大小写英文字母时,均为异常输入,直接返回 0。输出游戏结束后,最终得到的字符串长度。

liulan93的博客 960

JAVA指定区域内截图_Java+Selenium根据元素创建指定区域截图——Element快照

Java+Selenium根据元素创建指定区域截图——Element快照执行步骤获取全屏的截图File screen = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);BufferedImage image = ImageIO.read(screen);获取element的宽高以及坐标创建一个WebElement元素,并且获...

weixin_42400621的博客 840

Java编写一个休闲益智的小游戏:方块消消乐乐趣无穷!

在本篇文章中,我们将学习如何使用Java编写一个令人上瘾的小游戏——消除疯狂方块!这个游戏将测试你的反应速度和决策能力,让你全身心地沉浸其中。通过阅读本文并跟随代码示例,你将学会如何构建这个小游戏并增加一些特色功能。

xuewenyu_的博客 1629

豆包天天爱消除”,“天天连萌(附java代码)

通过计算机自动玩微信游戏天天爱消除”,“天天连萌”,主要目的是为助老婆分。 1、 用电脑程序实现手动模拟触屏; 2、 图像识别,捕获屏幕图像,把图像转换为对应的数组(数组中不同的值代表不同图案); 3、 搜索最优移动方案。

Lon 实验室 9028

2017-03-04 天天爱旅游

Description天天突发奇想, 要去 G 地, 于是他搞来了一张地图, 看怎么走才好。 地图上有很多城市, G 地也是一座城市。 每两座城市之间都可能有直达方法, 也有可能 两座城市之间并不能直接相通, 而要通过其他的城市转达。 对于两个城市之间的直达方法, 需要一定的时间, 当然, 如果从 A 城市到 B 城市的直达方法需要 T 时间, 那么从 B 城市到 A 城市的直达方法也是 T 时间

tro_Oops 33万+

你简单,世界就是童话;心复杂,世界就是迷宫。

  2、最怕我们的爱最终会输给时间,败给距离。   3、应该让别人的生活因为有了你的生存而更加美好。   4、把拳头收回来是为了更有力地还击。

qq_38513184的博客 1930

Activiti生成流程图异常解决(java.awt.image.RasterFromatException)

Activiti生成流程图代码:   ProcessDefinitionEntity p = (ProcessDefinitionEntity)repositoryService .createProcessDefinitionQuery() .processDefinitionId("test:2:13708") .singleResult(); InputS...

cooperay的专栏 1591

java编写天天爱消除_天天爱消除脚本,150W轻松,源代码!

[Java] 纯文本查看 复制代码--下面填写你的设备local Shebei = "i5"local fbif Shebei == "i4" thenfb = "640x960"elseif Shebei == "i5" thenfb = "640x1136"elseif Shebei == "ipad4" thenfb = "1536x2048"endSCREE...

weixin_29323049的博客 996

消消乐_初级代码(Java)

⼀个5*5的棋盘,铺满了5种类型的棋⼦,界⾯上分别⽤A~E这五个字⺟表示。欢迎评论,给出更优代码。

2401_84974736的博客 905

java -新手笔记(Swing类)-开始制作消消乐(静态页面)

Swing是一个用于创建图形用户界面(GUI)的框架,类似弹窗口。代码(这边只是遍历该数组,看一下显示的情况)1.自制类似羊了羊游戏 (胡桃消消乐)这边事先创建了一个目录文件(装取图片)设置背景 这边 是用方法调用。

qq_61549190的博客 1007

JavaScript山寨腾讯手机游戏天天爱消除》开发过程详细

前言 貌似最近腾讯手机游戏天天爱消除挺火的,我也是粉丝之一,最近对javascript一直比较感兴趣然后想用js仿造一个,应该不是太难,本文系边写代码别写博客,详细叙述开放过程,如果最后开发成功就发表,如果最后失败了就删除草稿。废话不多说开始: 写完后重新声明以下均为本人边写边记录思路开发过程,中途走了很多大弯路小弯路。如不想被误导可直接研究最后的源代码 了解需求 消除类游戏很多平台都有,...

haierboos 343

如何应对关卡资源冗余?《天天爱消除》服务器性能优化详解

https://www.fgba.net/sitemap.xml

ludongguoa的博客 515

消消乐java_java消消乐

packagegame消消乐;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.MouseAdapter;im...

weixin_35971306的博客 2273

Java代码实现消消乐游戏中的消除功能

有n行m列矩阵,每个位置的元素取值(1~9),同一行或者同一列中如果有三个以及三个以上的数字相同时,将改相同的数字全部消除(即改为0) **注意:**同一个数字可能同时在某一行和某一列被消除。 解题思路:先将行中满足条件的数字消除(在新数组中消除,不改变原数组的数据。),然后将列中满足条件的数字消除(同样是在新数组中消除),最后在合并经过行消除和列消除得到的两个数组。 /**消除行中满足条件的数字*/ public static int[][] TD(int[][] sourceArray) { /

weixin_52779958的博客 3339

AI漫剧分镜衔接连续性检测:基于光流的镜头运动一致性实践

本文提出基于光流法的AI漫剧分镜衔接一致性检测方案,通过分析相邻分镜间运动方向与速度变化,自动识别方向冲突、速度突变等连贯性问题。采用OpenCV的Farneback算法实现高效光流计算,结合可视化与批量检测流程,单集检测仅需约0.6秒,可嵌入生成流水线。对自建系统有技术指导,也推荐使用知漫剧(hy.jiaxunai.cn)一体化平台快速验证,支持国内直访,现提供免费体验额度。

2601_96218592的博客 191
上一篇: snprintf与printf
下一篇: <一>初探js特效魅力之div显示隐藏变色02
qq_33974741
博客等级 码龄11年 58粉丝 407原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值