利用电脑玩Android版“天天连萌”刷高分(四)——模拟按键及程序优化

这一系列文章,没想到从去年10月份以来,写了三篇我就忘了写了,现在才想起来,所以一不小心就成了跨年系列文章了。

第四篇主要是写一下如何进行模拟按键,以及对程序的一些优化以使到分数更容易达到更高的分。

时间一段时间了,毕竟是去年在写的文章,都忘了原来项目的代码了。

模拟发送按键消息到手机,一开始百度到的是使用monkeyrunner.jar包里的api,但是该相关的api,在貌似4.0版本之后就改动了,构造方法要传进两个我不知道要传什么的参数。所以在这里,我使用了sdk里面的另外的API,即chimpchat.jar包里的api。

进行模拟按键,需要获取一个IChimpDevice对象,获取的方法如下:

AdbBackend adbBack = new AdbBackend();

IChimpDevice mChimpDevice = adbBack.waitForConnection();

IChimpDevice有以下主要的API:

// 获取各层级的view以便查询view的状态。

HierarchyViewer getHierarchyViewer();

// 返回一个ChimpManager对象。

ChimpManager getManager();

// 获取设备的属性

String getProperty(String key);

// 获取所有我们能获取的设备属性

Collection getPropertyList();

// 获取系统的属性

String getSystemProperty(String key);

// 安装指定的程序

boolean installPackage(String path);

// 运行指定的程序。

Map instrument(String packageName, Map args);

// 删除指定的程序

boolean removePackage(String packageName);

// 执行shell命令

String shell(String cmd);

// 发送广播

void broadcastIntent(@Nullable String uri, @Nullable String action, @Nullable String data, @Nullable String mimeType, Collection categories, Map extras, @Nullable String component, int flags);

// 释放资源

void dispose();

// 拖动

void drag(int startx, int starty, int endx, int endy, int steps, long ms);

// 按下

void press(String keyName, TouchPressType type);

// 重启设备

void reboot(@Nullable String into);

// 启动一个Activity

void startActivity(@Nullable String uri, @Nullable String action, @Nullable String data, @Nullable String mimeType, Collection categories, Map extras, @Nullable String component, int flags);

// 截图

IChimpImage takeSnapshot();

// 触摸

void touch(int x, int y, TouchPressType type);

// 打字输入

void type(String string);

还有其他一些方法,在此不一一列举了。

庆幸的是,在天天连萌中,需要模拟的事件还是挺简单的,只是触摸,也就是用了其中的mChimpDevice.touch(int, int, ToushPressType)方法。

在前面的文章中,我们已经继续出需要触摸的元素在数组中的位置,再根据已经知道的边距,以及每个元素所占的宽高,我们可以继续出它在屏幕当中的位置。但是需要注意的是,前面截屏,获取到的图像是竖屏的,我们进行处理过程中,也一直都是用竖屏的。但是在该游戏里模拟按钮,使用的却是横屏下的坐标,所以对于传过来的元素的位置,我们还需要进行转换。代码如下:

/**

* 触摸

*

* @param p 在数组中的横、纵坐标位置。

* @throws InterruptedException

*/

public void touch(Point p) throws InterruptedException {

// 截图使用的是竖屏,这里触摸使用的是横屏

int x = PADDING_TOP + (p.x - 1) * IMAGE_HEIGHT + CORNER_HEIGHT;

int y = 480 - (PADDING_LEFT + (p.y - 1) * IMAGE_WIDTH + CORNER_WIDTH);

mChimpDevice.touch(x, y, TouchPressType.DOWN_AND_UP);

}

然后再在我们的Main.java中,进行整个游戏的过程。先写一个循环,在循环中先截图,然后设置数据,然后进行路径搜索,最后将搜索到的坐标传给模拟按键的方法进行模拟消除。main方法代码如下:

while (true) {

img = robot.snapshot();

robot.setNum(img);

robot.startSearch();

}

程序流程基本如上。接下来说一下如何优化。

实际上,电脑将图像转化为数组并进行路径搜索的过程是很快的,只需要几十毫秒。所以当截完一张图之后,电脑很快就计算完成并进行按键模拟。但是手机上接收按键信息并处理,游戏的方块消除及消除的动画的显示都需要时间和处理器。所以当电脑的整个过程太快时,会造成手机画面卡,反而影响下一次的截图。并且下一次的截图通常都是带着许多消除动画的,影响图像识别及转化。所以需要在触摸事件中加上延迟。在我的手机中,测试结果发现15毫秒到30毫秒比较合适(关掉手机中的声音播放,降低分辨率及帧数等都有利于使电脑上的按键延迟设置得更小)。具体设置多少看手机。

另外,这里使用的截图方法,截取一张图需要1200毫秒左右,这时间还包括了从手机传输截屏数据到电脑的时间。如果开启后台线程,不断地进行截图,便可以将平均截图时间减少。同样以我的手机为例,测试到以3个线程最为合适。另外,main方法中我也没再写做一个死循环,考虑到一次游戏结束之后,将不会再消除成功,所以当5秒没有任何消除时即认为游戏结束,退出循环。所以最后修改Main.java代码如下:

public class Main {

private static BufferedImage img = null;

private static Executor executors = Executors.newCachedThreadPool();

private static boolean isOver = false;

public static void main(String[] args) throws IOException, InterruptedException {

final Robot robot = new Robot();

final long startTime = System.currentTimeMillis();

new Thread() {

public void run() {

try {

while (!isOver) {

executors.execute(new Runnable() {

@Override

public void run() {

img = robot.snapshot();

}

});

Thread.sleep(350);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

};

}.start();

BufferedImage preImage = null;

long lastClearTime = System.currentTimeMillis();

while (System.currentTimeMillis() - lastClearTime < 5000

|| System.currentTimeMillis() - startTime < 60000) {

long snapTime = System.currentTimeMillis();

while (img == null || img == preImage) {

Thread.sleep(50);

}

preImage = img;

System.out.println("snapTime:" + (System.currentTimeMillis() - snapTime));

robot.setNum(img);

if (robot.startSearch()) {

lastClearTime = System.currentTimeMillis();

}

System.out.println("playTime:" + (System.currentTimeMillis() - snapTime));

}

System.out.println("is over");

isOver = true;

System.exit(0);

}

}

利用电脑玩android版天天连萌刷高分 二,利用计算机玩Android版“天天连萌”刷高分(四)——模拟按键及程序优化...相关推荐

  1. Android 10.0 PackageManagerService(二)权限扫描-[Android取经之路]

    摘要:PackageManagerService在systemReady()后,进行了/system/etc/permissions中的各种xml进行扫描,进行相应的权限存储,供以后使用 阅读本文大约 ...

  2. 利用电脑玩android版天天连萌刷高分 二,利用计算机玩Android版“天天连萌”刷高分(一)——截图...

    利用电脑玩Android版"天天连萌"刷高分(一)--截图 这几周微信游戏"天天连萌"由于第一名总是被一个同学所占据(没办法,我等级不够高游戏细胞又没他好),总 ...

  3. 利用电脑玩android版天天连萌刷高分 二,利用电脑玩Android版“天天连萌”刷高分(四)——模拟按键及程序优化...

    这一系列文章,没想到从去年10月份以来,写了三篇我就忘了写了,现在才想起来,所以一不小心就成了跨年系列文章了. 第四篇主要是写一下如何进行模拟按键,以及对程序的一些优化以使到分数更容易达到更高的分. ...

  4. 计算机基础2008版第四次作业,《计算机基础(2008版)》第4次作业

    <计算机基础(2008版)>第4次作业 A型题: 请从备选答案中选取一个最佳答案 A型题: 请从备选答案中选取一个最佳答案 1. 公式"=AVERAGE(C3:C5)" ...

  5. 计算机基础2008版第四次作业,《计算机基础(2008版)》第5次作业_满分

    <计算机基础(2008版)>第5次作业_满分 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 <计算机基础(20 ...

  6. 利用电脑玩android版天天连萌刷高分 二,利用电脑玩Android版“天天连萌”刷高分(三)...

    /** * 搜索,返回最优点. * * @return */ public Point search(int x, int y) { return LianlianKan.twoCornerSearc ...

  7. 小学二年级计算机考试,人教版二年级语文下学期期中考试试卷

    人教版二年级语文下学期期中考试试卷 引导语:科学是为了那些勤奋好学的人,考试是为了让人得到提升,以下是百分网小编分享给大家的人教版二年级语文下学期期中考试试卷,欢迎阅读! 一.我会看拼音,写词语.(8 ...

  8. 计算机基础2008版第7次作业,中医药大学-计算机基础2008版-1-7次作业.doc

    1. 计算机中用来保存程序和数据,以及运算的中间结果和最后结果的装置是 B.内存和外存 2. 计算机显示器画面的清晰度决定于显示器的 C.分辨率 3. 所谓的信息是指 D.处理后的数据 4. 用来表示 ...

  9. Android libyuv应用系列(二)libyuv在Android中的使用

    请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接: http://blog.csdn.net/zxccxzzxz/article/details/53982849 上篇文章Andro ...

最新文章

  1. Exchange2010之典型安装
  2. 学计算机与学英语作文,初二英语作文(关于计算机与学习)
  3. pr基本图形模板无法使用_PR模板21个时尚排版竖屏封面图形标题动画【资源分享1218】...
  4. 现代软件工程讲义 个人项目和结对项目练习 四则运算
  5. php dbutils 使用,dbutilsapi
  6. 服务器安装系统教程进光盘界面,iso光盘系统怎么安装系统教程
  7. java字符串不可变_Java字符串真的是不可变的吗?
  8. Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  9. hdu 动态规划46题
  10. MySQL int类型的显示
  11. visual studio插件开发dll类库免加全局缓存处理办法
  12. Jenkins清空当前Clean Workspace
  13. 数学建模:层次分析法实例以及代码
  14. 计算机程序设计实验报告总结,c语言实验总结(大一c语言实验报告总结)
  15. H3CIE(WLAN)学习笔记(4)——PHY层协议
  16. RxJava2+retrofit实现网络封装
  17. shell脚本清理网宿cdn缓存
  18. efi模式装linux双系统,超详细!Win10(UEFI启动模式)安装Ubuntu18.04双系统
  19. Matlab nargin
  20. Tex插入各种希腊字母

热门文章

  1. MySql根据时间查询数据
  2. 如何启用计算机双通道内存的方法,内存条怎么插 组建内存双通道正确插法教程...
  3. Excel VS Python 第三期——重复值处理
  4. burp+逍遥模拟器 app抓包 (导入证书到系统的解决方案)
  5. ubuntu绑定usb设备以及摄像头端口地址(编号)
  6. Prometheus - Blackbox Exporter
  7. Java:Java有多流行,有哪些主要应用程序?
  8. Mac安装软件提示文件损坏
  9. 「喜迎华诞」手把手教你用微信小程序给头像带上小旗帜
  10. Linux中文朗读软件--espeak