##起初是想使用按键精灵脚本程序控制,但还是选择熟悉的java。我这里使用了工具,造成延迟问题。也求教:java控制安卓的正确姿势,

参考了.NET玩跳一跳,思路都是一样的,只不过使用ADB控制安卓的方式更好,博主也贴出了adb命令,解决了我一大问题。

先看效果图:

设计思路:

  java识别小人和目标物,计算距离,计算时间,触发按键时长。

主要解决问题:

1、java操作安卓手机。

  ##本人对安卓不懂,只能使用工具了,手机连接电脑使用“手机控”软件把手机屏幕显示到电脑上,就能鼠标玩跳一跳,然后java识别小人和目标物,控制点击时长。

  使用ADB发送命令操作手机。ADB版本选择1.0.32以上,才能识别安卓5.0。ADB下载地址:http://www.cr173.com/soft/205142.html

  1、截图。2、上传电脑。3、退出

  可以把命令写成BAT文件。

  1. adb shell screencap -p /sdcard/1.png
  2. adb pull /sdcard/1.png E:/adb
  3. exit

2、如何识别目标。

  ##java截取手机屏幕部分,对图片进行像素点识别。通过像素点占百分比数,最多的为目标颜色,设计识别正方形像素点的算法。

  ##具体识别方法:小人颜色固定,去除背景色,识别小人位置以上像素点,去除小人底座颜色防止与目标颜色相同,计算百分比,得到目标颜色,通过目标颜色的最大最小xy坐标(颜色边界),计算出中心点,在计算出中心点与小人的距离,推算时间。使用Robot控制截图并鼠标点击.。

  并没有准确的找到目标物的中心点,而是找到目标物的顶点,通过小人最底部的颜色确定小人的位置,如果使用OpenCV会更好。

3、还存在的问题:

  1、小人和目标物的距离和按键时长的关系,好像是指数形式,并不是简单的直线

  2、不同手机的分辨率不同,需要调整按键时长系数和始扫描行。

   3、代码优化,方法全部放在了main里面了,摘出来发现有线程问题,未做优化。待解决也希望指正。

直接复制以下代码即可运行,另外需要写好的批处理文件:

  1. package com.cyd.util;
  2.  
  3. import java.awt.AWTException;
  4. import java.awt.Graphics2D;
  5. import java.awt.MouseInfo;
  6. import java.awt.Point;
  7. import java.awt.Robot;
  8. import java.awt.Transparency;
  9. import java.awt.image.BufferedImage;
  10. import java.io.File;
  11. import java.io.IOException;
  12. import java.io.InputStreamReader;
  13. import java.io.LineNumberReader;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. import java.util.Map.Entry;
  17.  
  18. import javax.imageio.ImageIO;
  19.  
  20. public class RobotT1T_2 {
  21.  
  22. static String file1 = "E:\\adb\\1.png";
  23. static String file2 = "E:\\adb\\2.png";
  24.  
  25. //始 扫描行,针对不同的手机分辨率可能不一样,需要修改
  26. static int start_y = 300;
  27.  
  28. //按键时长系数,针对不同的手机按键时长可能不一样,需要680.6258244648354的值
  29. static final double time_out = (680.6258244648354 / 563.8129122324177);
  30.  
  31. static boolean istest = false;
  32. static boolean is_qz = false;
  33. static boolean is_qz_1 = false;
  34. static boolean is_qz_2 = false;
  35.  
  36. public static void main(String[] args) throws AWTException, InterruptedException, IOException {
  37. istest = true;
  38.  
  39. // is_qz=true;
  40. // is_qz_1 = true;
  41. is_qz_2 = true;
  42. while (true) {
  43. System.out.println("+++++++++++++");
  44. if (istest) {
  45. cmd_java("cmd /c start adb.bat ", "E:\\adb\\cofface_adb\\cofface_adb_windows_v5.1");//批处理文件
  46. }
  47. BufferedImage bi = (BufferedImage) ImageIO.read(new File(file1));
  48. Map<String, String> map = new HashMap<String, String>();
  49.  
  50. // 获取图像的宽度和高度
  51. int width = bi.getWidth();
  52. int height = bi.getHeight();
  53.  
  54. int poix = 0;
  55. int poiy = 0;
  56.  
  57. BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  58. Graphics2D g2d = img.createGraphics();
  59. // 设置画布为透明
  60. img = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
  61. // 扫描图片
  62. for (int i = start_y; i < height; i++) {
  63. for (int j = 0; j < width; j++) {// 行扫描
  64. int dip = bi.getRGB(j, i);
  65. int p = dip;
  66. int red = 0xff & (p >> 16);
  67. int green = 0xff & (p >> 8);
  68. int blue = 0xff & p;
  69. // 目标人图形
  70. if (i < (height / 1.5)) {
  71. if ((red > 30 && red < 70) && (green > 40 && green < 70) && (blue > 60 && blue < 110)) {// 获取小人颜色
  72. int cyd = 6;
  73. RGB rgb_1 = dipToRgb(bi, j + cyd, i + cyd);
  74. RGB rgb_2 = dipToRgb(bi, j - cyd, i - cyd);
  75. RGB rgb_3 = dipToRgb(bi, j - cyd, i + cyd);
  76. RGB rgb_4 = dipToRgb(bi, j + cyd, i - cyd);
  77. if (istrueren(rgb_1) && istrueren(rgb_2) && istrueren(rgb_3) && istrueren(rgb_4)) {
  78. img.setRGB(j, i, dip);
  79. if (poiy < i) {
  80. if (red == 54 && green == 60 && blue == 102) {
  81. if (bi.getRGB(j + 1, i) == dip) {
  82. poix = j;
  83. poiy = i;
  84. }
  85. }
  86.  
  87. }
  88.  
  89. }
  90. }
  91. }
  92.  
  93. }
  94. }
  95.  
  96. for (int rgb_ox = 0; rgb_ox < 10; rgb_ox++) {
  97. for (int rgb_ox_y = 0; rgb_ox_y < 10; rgb_ox_y++) {
  98. try {
  99. img.setRGB(poix + rgb_ox, poiy + rgb_ox_y, -2559242);
  100. } catch (Exception e) {
  101. }
  102. }
  103. }
  104.  
  105. int fd_rgb = 10;// 颜色差
  106. int qs_rgb_x = 0;
  107. int qs_rgb_y = 0;
  108. int qs_index = 0;
  109. int rgb_oxrgb = -13091994;
  110. boolean is_mbh = false;
  111. System.out.println();
  112. for (int y = start_y; y < poiy; y++) {// 行扫描
  113. RGB rgb_0 = dipToRgb(bi, 0, y);
  114. for (int x = 1; x < width; x++) {
  115. /***** 去掉目标人颜色 */
  116.  
  117. int dip = bi.getRGB(x, y);
  118. int p = dip;
  119. int red = 0xff & (p >> 16);
  120. int green = 0xff & (p >> 8);
  121. int blue = 0xff & p;
  122. // 目标人图形
  123. if (y < (height / 1.5)) {
  124. if ((red > 30 && red < 70) && (green > 40 && green < 70) && (blue > 60 && blue < 110)) {// 获取小人颜色
  125. int cyd = 6;
  126. RGB rgb_1 = dipToRgb(bi, x + cyd, y + cyd);
  127. RGB rgb_2 = dipToRgb(bi, x - cyd, y - cyd);
  128. RGB rgb_3 = dipToRgb(bi, x - cyd, y + cyd);
  129. RGB rgb_4 = dipToRgb(bi, x + cyd, y - cyd);
  130. if (istrueren(rgb_1) && istrueren(rgb_2) && istrueren(rgb_3) && istrueren(rgb_4)) {
  131. //img.setRGB(x, y, dip);
  132. continue;
  133. }
  134. }
  135. }
  136. if (x < (poix + 55) && x > (poix - 55) && y > (poiy - 240))
  137. continue;
  138. /***** 去掉目标人颜色 */
  139.  
  140. RGB rgb_1 = dipToRgb(bi, x, y);
  141. img.setRGB(x, y, bi.getRGB(x, y));
  142. if (rgb_cz(rgb_0, rgb_1, fd_rgb)) {// 同一种颜色
  143. continue;
  144. } else {
  145. qs_rgb_y = y;
  146. if (!is_mbh) {
  147. qs_rgb_x = x;
  148. }
  149.  
  150. qs_index++;
  151. is_mbh = true;
  152.  
  153. for (int rgb_ox = 0; rgb_ox < 10; rgb_ox++) {
  154. for (int rgb_ox_y = 0; rgb_ox_y < 10; rgb_ox_y++) {
  155. try {
  156. img.setRGB(x + rgb_ox, y + rgb_ox_y, rgb_oxrgb);
  157. } catch (Exception e) {
  158. }
  159. }
  160. }
  161. }
  162.  
  163. }
  164. if (is_mbh) {
  165. break;
  166. }
  167. }
  168. qs_rgb_x = qs_rgb_x + (qs_index / 2);
  169. // System.out.println("目标物坐标:"+qs_rgb_x+" "+qs_rgb_y);
  170. int ox_x = qs_rgb_x;
  171. int ox_y = qs_rgb_y + 40;
  172. poiy -= 10;
  173. // System.out.println("目标人:" + poix + "\t" + poiy);
  174. // System.out.println("中心点:" + ox_x + "\t" + ox_y);
  175.  
  176. for (int rgb_ox = 0; rgb_ox < 10; rgb_ox++) {
  177. for (int rgb_ox_y = 0; rgb_ox_y < 10; rgb_ox_y++) {
  178. img.setRGB(ox_x + rgb_ox, ox_y + rgb_ox_y, rgb_oxrgb);
  179. }
  180. }
  181. int z_i = (poix - ox_x) * (poix - ox_x) + (ox_y - poiy) * (ox_y - poiy);
  182. double math_i = (double) Math.sqrt(z_i);
  183. System.out.println("最终距离:" + math_i);
  184. ImageIO.write(img, "png", new File(file2));
  185. double end_time_out = (math_i * time_out);
  186. if (math_i < 250) {
  187. end_time_out += 13;
  188. }
  189. System.out.println("按键时长:" + end_time_out);
  190. if (istest) {
  191. cmd_java("cmd /c start adb shell input swipe " + 500 + " " + 1650 + " " + 510 + " " + 1650 + " "
  192. + (int) end_time_out);
  193. }
  194. Thread.sleep(1000);
  195. }
  196. }
  197.  
  198. /**
  199. * 判断小人颜色
  200. *
  201. * @param rgb
  202. * @return
  203. */
  204. public static boolean istrueren(RGB rgb) {
  205. if (rgb == null) {
  206. return true;
  207. }
  208. int red = rgb.getRed();
  209. int green = rgb.getGreen();
  210. int blue = rgb.getBlue();
  211. if ((red > 30 && red < 70) && (green > 40 && green < 70) && (blue > 60 && blue < 110)) {// 获取小人颜色
  212. return true;
  213. }
  214. return false;
  215. }
  216.  
  217. static InputStreamReader ir = null;
  218. static LineNumberReader input = null;
  219.  
  220. public static void cmd_java(String cmd) throws IOException {
  221. Process process = Runtime.getRuntime().exec(cmd, null, new File("C:\\Users\\chenyd\\adb"));
  222. ir = new InputStreamReader(process.getInputStream());
  223. input = new LineNumberReader(ir);
  224. while (input.readLine() != null) {
  225. }
  226. input.close();
  227. ir.close();
  228. }
  229.  
  230. public static void cmd_java(String cmd, String url) throws IOException {
  231. Process process = Runtime.getRuntime().exec(cmd, null, new File(url));
  232. ir = new InputStreamReader(process.getInputStream());
  233. input = new LineNumberReader(ir);
  234. while (input.readLine() != null) {
  235. }
  236. input.close();
  237. ir.close();
  238. }
  239.  
  240. /**
  241. * 颜色的差值
  242. */
  243. public static boolean rgb_cz(RGB rgb_1, RGB rgb_2, int fd_rgb) {
  244. if (Math.abs(rgb_1.getRed() - rgb_2.getRed()) > fd_rgb || Math.abs(rgb_1.getGreen() - rgb_2.getGreen()) > fd_rgb
  245. || Math.abs(rgb_1.getBlue() - rgb_2.getBlue()) > fd_rgb) {
  246. return false;
  247. }
  248. return true;
  249. }
  250.  
  251. public static RGB dipToRgb(BufferedImage bi, int j, int i) {
  252. try {
  253. int dip = bi.getRGB(j, i);
  254. int p = dip;
  255. int red = 0xff & (p >> 16);
  256. int green = 0xff & (p >> 8);
  257. int blue = 0xff & p;
  258. return new RGB(j, i, red, green, blue);
  259. } catch (Exception e) {
  260.  
  261. }
  262. return null;
  263. }
  264.  
  265. }
  266.  
  267. class RGB {
  268.  
  269. public RGB() {
  270. }
  271.  
  272. public RGB(int x, int y, int red, int green, int blue) {
  273. super();
  274. X = x;
  275. Y = y;
  276. this.red = red;
  277. this.green = green;
  278. this.blue = blue;
  279. }
  280.  
  281. public int X;
  282. public int Y;
  283. public int red;
  284. public int green;
  285. public int blue;
  286.  
  287. public int getRed() {
  288. return red;
  289. }
  290.  
  291. public void setRed(int red) {
  292. this.red = red;
  293. }
  294.  
  295. public int getGreen() {
  296. return green;
  297. }
  298.  
  299. public void setGreen(int green) {
  300. this.green = green;
  301. }
  302.  
  303. public int getBlue() {
  304. return blue;
  305. }
  306.  
  307. public void setBlue(int blue) {
  308. this.blue = blue;
  309. }
  310.  
  311. public int getX() {
  312. return X;
  313. }
  314.  
  315. public void setX(int x) {
  316. X = x;
  317. }
  318.  
  319. public int getY() {
  320. return Y;
  321. }
  322.  
  323. public void setY(int y) {
  324. Y = y;
  325. }
  326.  
  327. }

java写跳一跳辅助程序的更多相关文章

  1. JAVA实现跳一跳辅助程序之虎啸龙吟

    前序: 今天有幸,看到2位博主的文章,在此表示感谢.自己也动手实现了一下. 实现原理 请参考博主 https://www.cnblogs.com/dongkuo/p/8285162.html 另感谢博 ...

  2. 微信小程序跳一跳辅助程序(手动版)

    最近,微信官方推出了demo小程序游戏<跳一跳>,这个游戏操作简单,容易上手,却又不容易获得高分,受到很多人的喜爱(emm...这游戏有毒).自己也尝试了玩了几次,作为一个手残+脑残的资深 ...

  3. .NET开发一个微信跳一跳辅助程序

    昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来 ...

  4. 微信_跳一跳辅助程序_Python_(带GitHub项目地址)

    1.安装Python(推荐3.6) https://www.python.org/downloads/ 2.在github上下载脚本 [github项目地址](https://github.com/w ...

  5. 用Java做一个跳一跳辅助

    Java跳一跳辅助 首先..让大家看下效果: 由于是闲着没事写的.也懒得看OpenCV的API了. 要用到的工具如下: adb+jdk 把adb添加到环境变量里就行.很简单. 全部代码如下.就这么多. ...

  6. 37.微信跳一跳辅助开发(C语言+EasyX)

    一.开发环境 开发环境 使用语言:C/C++ IDE:VS2010+ 其他三方库 EasyX(http://www.easyx.cn/downloads/) ADB(链接:https://pan.ba ...

  7. python跳一跳辅助学习

    微信跳一跳辅助工具 准备工具 adb驱动 安卓手机 打开手机的调试模式 usb接好手机和电脑 PyCharm:全宇宙唯一一款专门用于Python开发IDE工具 实现原理: 获取手机的实时的截图 点击起 ...

  8. 微信跳一跳辅助JAVA 自动模拟点击

    工具:ADB 原理: 开始游戏后,使用ADB工具让手机截屏发送到电脑 分析图像中小人与目标中心点间的距离,根据一定比例计算出需要触屏的时间 使用ADB进行模拟点击(触屏)相应的时间,完成精准跳跃 程序 ...

  9. 微信跳一跳辅助Demo

    [原创] 前几天没事干看别人一直在玩微信上线的那一个跳一跳小游戏,玩着玩着老是掉下去,闲着没事呗 就想了想做一个辅助程序的呗.不过先做的手动版的.自动版的有点麻烦.就不发了.用的Java写的,也就一个 ...

随机推荐

  1. ZOJ3209 Treasure Map —— Danc Links 精确覆盖

    题目链接:https://vjudge.net/problem/ZOJ-3209 Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 ...

  2. SpringBoot发送简单文本邮件

    1.pom.xml添加 spring-boot-starter-mail 依赖 <dependency> <groupId>org.springframework.boot&l ...

  3. 关闭ext4文件系统的日志功能

    最近在帮一个研究生弄一个虚拟化环境下的基于Innodb的日志文件的读写优化的实验,实验的具体详细内容就不说了,其中有一个步骤需要将MySQL的日志文件放置在一块单独的硬盘里面,这块硬盘要么是ext2, ...

  4. oracle自动统计信息

    在11g中,默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时),   select a.window_name, a.repeat_interval,a ...

  5. classname.this 和 this的使用场景

    今天在写代码时,发现在写了一个内部类,而在内部类中需要调用外部类的实例方法,直接使用this调用发现调用的不是外部类而是内部类,于是查找资料原来需要使用外部类的classname.this这样的调用, ...

  6. bzoj 1894 游戏

    题目大意: $n$个装备,每个装备有两个值,可以攻击该值对应的怪兽.每个装备最多用一次 每个怪兽被打一次之后就会死,每个怪兽可以被打当且仅当前面的都死了,求最多打多少个 思路: 很明显的二分图匹配,如 ...

  7. 【旧文章搬运】Windows内核常见数据结构(线程相关)

    原文发表于百度空间,2008-7-24========================================================================== 线程是进程的 ...

  8. 6-12 SVM小结

    介绍了SVM的概念以及如何利用SVM进行一个身高体重的训练和预测.如果类别比较简单的话,那么在二维空间上它有可能就是一条直线.如果类别比较复杂,那么投影到高维空间上它就是一个超平面.所以SVM的本质它 ...

  9. 【WEB基础】HTML & CSS 基础入门(4)列表及其样式

    前面 网页中漂亮的导航.整齐规范的文章标题列表和图片列表等等.这些都是离不开HTML里一个重要的元素----列表,在HTML中有无序列表.有序列表和定义列表三种类型.其中,无序列表应用最为广泛,下面, ...

  10. Node学习图文教程之express重写留言本案例

    写在前面 小伙伴们大家好,我是你们的pubdreamcc,接着前面的学习,这篇博文出至于我的GitHub仓库:Node学习教程资料,如果你觉得对你有帮助,欢迎star,你们的点赞是我持续更新的动力,谢 ...