利用电脑玩Android版“天天连萌”刷高分(二)——图像识别
上一篇只是提到了在PC端利用android sdk里面的工具进行截图,接下来这一篇将补充一点关于上一篇的内容,然后介绍一下程序的整个结构,以及如何进行《天天连萌》里面的图像识别和消除的搜索算法。
一、补充上篇的内容
首先补充一下上一篇忘了提及的内容。
在使用chimpchat时,需要添加几个jar包。这方面网上的资料很少,不过功夫不负有心人,嘿嘿。
需要添加的jar包如下:
chimpchat.jarcommon.jarddmlib.jarguava-13.0.1.jar
以上jar包都可以在android sdk里面的tools/lib目录中找到。
二、程序的设计
在这个程序里面我主要写了4个java文件:
Main.java 只有一个main方法,程序的入口。Robot.java,程序的核心部分,进行游戏截图、图像转换为数组,搜索消除等。里面包含一个LianlianKan的内部类,它是用于搜索可以消除的方块的工具类。Point.java,表示在数组中的坐标位置的对象。ImageHash.java,图像识别的算法类,采用汉明距离算法进行图片相似检测。
三、图像识别及转换。
首先先截一张游戏界面的图。游戏里的方块是分布在中心的一个10*5(方块大小)的区域中的。所以先截下图,通过工具取得它的4个边的边距。以我的手机为例,它是800*480的分辨率的,截的图是竖屏的,左边距为48,右边距为72,上边距及下边距为115。每个游戏方块为57*72。如下图所示:
所以在Robot.java需要定义以上相关常量,代码如下:
上面定义的常量当中还有CORNER_WIDTH及CORNER_HEIGHT,这是因为有时有些方块会有道具标示,或者是是“*2”的分数提示,所以截取小图进行图像识别的时候还要避开这一点。然后上面提到的数组行列数,这里的数组不是取得的图像的数组。而是为了便于比较计算,将每个图像对应一个int数字,bomb或为空时为0。它的行及列分别为12和7,而不是10和5,是因为考虑到连连看的规则而加上的外围边界。如下图所示:
然后还要定义两个成员变量,一个表示取得的方块矩阵,一个表示对应的数字矩阵,代码如下: