##起初是想使用按键精灵脚本程序控制,但还是选择熟悉的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文件。

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

2、如何识别目标。

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

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

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

3、还存在的问题:

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

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

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

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

package com.cyd.util;

import java.awt.AWTException;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; import javax.imageio.ImageIO; public class RobotT1T_2 { static String file1 = "E:\\adb\\1.png";
static String file2 = "E:\\adb\\2.png"; //始 扫描行,针对不同的手机分辨率可能不一样,需要修改
static int start_y = 300; //按键时长系数,针对不同的手机按键时长可能不一样,需要680.6258244648354的值
static final double time_out = (680.6258244648354 / 563.8129122324177); static boolean istest = false;
static boolean is_qz = false;
static boolean is_qz_1 = false;
static boolean is_qz_2 = false; public static void main(String[] args) throws AWTException, InterruptedException, IOException {
istest = true; // is_qz=true;
// is_qz_1 = true;
is_qz_2 = true;
while (true) {
System.out.println("+++++++++++++");
if (istest) {
cmd_java("cmd /c start adb.bat ", "E:\\adb\\cofface_adb\\cofface_adb_windows_v5.1");//批处理文件
}
BufferedImage bi = (BufferedImage) ImageIO.read(new File(file1));
Map<String, String> map = new HashMap<String, String>(); // 获取图像的宽度和高度
int width = bi.getWidth();
int height = bi.getHeight(); int poix = 0;
int poiy = 0; BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
// 设置画布为透明
img = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
// 扫描图片
for (int i = start_y; i < height; i++) {
for (int j = 0; j < width; j++) {// 行扫描
int dip = bi.getRGB(j, i);
int p = dip;
int red = 0xff & (p >> 16);
int green = 0xff & (p >> 8);
int blue = 0xff & p;
// 目标人图形
if (i < (height / 1.5)) {
if ((red > 30 && red < 70) && (green > 40 && green < 70) && (blue > 60 && blue < 110)) {// 获取小人颜色
int cyd = 6;
RGB rgb_1 = dipToRgb(bi, j + cyd, i + cyd);
RGB rgb_2 = dipToRgb(bi, j - cyd, i - cyd);
RGB rgb_3 = dipToRgb(bi, j - cyd, i + cyd);
RGB rgb_4 = dipToRgb(bi, j + cyd, i - cyd);
if (istrueren(rgb_1) && istrueren(rgb_2) && istrueren(rgb_3) && istrueren(rgb_4)) {
img.setRGB(j, i, dip);
if (poiy < i) {
if (red == 54 && green == 60 && blue == 102) {
if (bi.getRGB(j + 1, i) == dip) {
poix = j;
poiy = i;
}
} } }
}
} }
} for (int rgb_ox = 0; rgb_ox < 10; rgb_ox++) {
for (int rgb_ox_y = 0; rgb_ox_y < 10; rgb_ox_y++) {
try {
img.setRGB(poix + rgb_ox, poiy + rgb_ox_y, -2559242);
} catch (Exception e) {
}
}
} int fd_rgb = 10;// 颜色差
int qs_rgb_x = 0;
int qs_rgb_y = 0;
int qs_index = 0;
int rgb_oxrgb = -13091994;
boolean is_mbh = false;
System.out.println();
for (int y = start_y; y < poiy; y++) {// 行扫描
RGB rgb_0 = dipToRgb(bi, 0, y);
for (int x = 1; x < width; x++) {
/***** 去掉目标人颜色 */ int dip = bi.getRGB(x, y);
int p = dip;
int red = 0xff & (p >> 16);
int green = 0xff & (p >> 8);
int blue = 0xff & p;
// 目标人图形
if (y < (height / 1.5)) {
if ((red > 30 && red < 70) && (green > 40 && green < 70) && (blue > 60 && blue < 110)) {// 获取小人颜色
int cyd = 6;
RGB rgb_1 = dipToRgb(bi, x + cyd, y + cyd);
RGB rgb_2 = dipToRgb(bi, x - cyd, y - cyd);
RGB rgb_3 = dipToRgb(bi, x - cyd, y + cyd);
RGB rgb_4 = dipToRgb(bi, x + cyd, y - cyd);
if (istrueren(rgb_1) && istrueren(rgb_2) && istrueren(rgb_3) && istrueren(rgb_4)) {
//img.setRGB(x, y, dip);
continue;
}
}
}
if (x < (poix + 55) && x > (poix - 55) && y > (poiy - 240))
continue;
/***** 去掉目标人颜色 */ RGB rgb_1 = dipToRgb(bi, x, y);
img.setRGB(x, y, bi.getRGB(x, y));
if (rgb_cz(rgb_0, rgb_1, fd_rgb)) {// 同一种颜色
continue;
} else {
qs_rgb_y = y;
if (!is_mbh) {
qs_rgb_x = x;
} qs_index++;
is_mbh = true; for (int rgb_ox = 0; rgb_ox < 10; rgb_ox++) {
for (int rgb_ox_y = 0; rgb_ox_y < 10; rgb_ox_y++) {
try {
img.setRGB(x + rgb_ox, y + rgb_ox_y, rgb_oxrgb);
} catch (Exception e) {
}
}
}
} }
if (is_mbh) {
break;
}
}
qs_rgb_x = qs_rgb_x + (qs_index / 2);
// System.out.println("目标物坐标:"+qs_rgb_x+" "+qs_rgb_y);
int ox_x = qs_rgb_x;
int ox_y = qs_rgb_y + 40;
poiy -= 10;
// System.out.println("目标人:" + poix + "\t" + poiy);
// System.out.println("中心点:" + ox_x + "\t" + ox_y); for (int rgb_ox = 0; rgb_ox < 10; rgb_ox++) {
for (int rgb_ox_y = 0; rgb_ox_y < 10; rgb_ox_y++) {
img.setRGB(ox_x + rgb_ox, ox_y + rgb_ox_y, rgb_oxrgb);
}
}
int z_i = (poix - ox_x) * (poix - ox_x) + (ox_y - poiy) * (ox_y - poiy);
double math_i = (double) Math.sqrt(z_i);
System.out.println("最终距离:" + math_i);
ImageIO.write(img, "png", new File(file2));
double end_time_out = (math_i * time_out);
if (math_i < 250) {
end_time_out += 13;
}
System.out.println("按键时长:" + end_time_out);
if (istest) {
cmd_java("cmd /c start adb shell input swipe " + 500 + " " + 1650 + " " + 510 + " " + 1650 + " "
+ (int) end_time_out);
}
Thread.sleep(1000);
}
} /**
* 判断小人颜色
*
* @param rgb
* @return
*/
public static boolean istrueren(RGB rgb) {
if (rgb == null) {
return true;
}
int red = rgb.getRed();
int green = rgb.getGreen();
int blue = rgb.getBlue();
if ((red > 30 && red < 70) && (green > 40 && green < 70) && (blue > 60 && blue < 110)) {// 获取小人颜色
return true;
}
return false;
} static InputStreamReader ir = null;
static LineNumberReader input = null; public static void cmd_java(String cmd) throws IOException {
Process process = Runtime.getRuntime().exec(cmd, null, new File("C:\\Users\\chenyd\\adb"));
ir = new InputStreamReader(process.getInputStream());
input = new LineNumberReader(ir);
while (input.readLine() != null) {
}
input.close();
ir.close();
} public static void cmd_java(String cmd, String url) throws IOException {
Process process = Runtime.getRuntime().exec(cmd, null, new File(url));
ir = new InputStreamReader(process.getInputStream());
input = new LineNumberReader(ir);
while (input.readLine() != null) {
}
input.close();
ir.close();
} /**
* 颜色的差值
*/
public static boolean rgb_cz(RGB rgb_1, RGB rgb_2, int fd_rgb) {
if (Math.abs(rgb_1.getRed() - rgb_2.getRed()) > fd_rgb || Math.abs(rgb_1.getGreen() - rgb_2.getGreen()) > fd_rgb
|| Math.abs(rgb_1.getBlue() - rgb_2.getBlue()) > fd_rgb) {
return false;
}
return true;
} public static RGB dipToRgb(BufferedImage bi, int j, int i) {
try {
int dip = bi.getRGB(j, i);
int p = dip;
int red = 0xff & (p >> 16);
int green = 0xff & (p >> 8);
int blue = 0xff & p;
return new RGB(j, i, red, green, blue);
} catch (Exception e) { }
return null;
} } class RGB { public RGB() {
} public RGB(int x, int y, int red, int green, int blue) {
super();
X = x;
Y = y;
this.red = red;
this.green = green;
this.blue = blue;
} public int X;
public int Y;
public int red;
public int green;
public int blue; public int getRed() {
return red;
} public void setRed(int red) {
this.red = red;
} public int getGreen() {
return green;
} public void setGreen(int green) {
this.green = green;
} public int getBlue() {
return blue;
} public void setBlue(int blue) {
this.blue = blue;
} public int getX() {
return X;
} public void setX(int x) {
X = x;
} public int getY() {
return Y;
} public void setY(int y) {
Y = y;
} }

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. Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])

    最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的来回转换,现在分享出来 如果想要请教Socket的问题请留言,我会随时回答的 1. int类型转16进制hexstring ...

  2. 小K的农场(差分约束)

    题目大意 n个点 m条描述 农场 a 比农场 b 至少多种植了 c 个单位的作物. 农场 a 比农场 b 至多多种植了 c 个单位的作物. 农场 a 与农场 b 种植的作物数一样多. 题解 差分约束裸 ...

  3. Code-NFine:NFine介绍

    ylbtech-Code-NFine:NFine介绍 1. NFine平台介绍返回顶部 1. 使用时请务必保留来源,请勿用于违反我国法律的web平台.如诈骗等非法平台网站.版权最终解释权归<NF ...

  4. C - Woodcutters

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Little ...

  5. DB Link 去除域名

    1.查看global_name的设置 SQL> show parameters global_name; NAME                                 TYPE    ...

  6. liteos内存(三)

    1. 概述 1.1 基本概念 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一.主要包括内存的初始化.分配以及释放. 在系统运行过程中,内存管理模块通过对内存的申请/释放操作,来管理用户和O ...

  7. ACM-ICPC 中可能会使用到的库

    sort(v.first(),v.end(),cmp())unique(v.first(),v.end(),cmp()) 第三个参数可以传入一个bool型,用来判断是不是相等,返回unique后的超尾 ...

  8. HDU 6092:Rikka with Subset(dp)

    分析 很多个较小的数字可以随机组合成较大的数字,所以B数组从小到大开始遍历,除了空集,最小的那个存在的个数对应的数字必然是a数组中的数字. 每求出这一部分之后,更新后续的B序列. 分析完后,主要的难点 ...

  9. HDU5213(容斥定理+莫队算法)

    传送门 题意 给出n个数和幸运数k,m次询问,每次询问[l1,r1]和[l2,r2]有多少对数满足x+y=k,x∈[l1,r1],y∈[l2,r2] 分析 看到m只有3e4,可以考虑\(m\sqrt{ ...

  10. 7天学完Java基础之3/7

    API概述 什么叫做API? API(Application Programming lnterface),应用程序编程接口. 所谓API就是值好多的类,好多的方法,JDK给我们提供了很多现成的类,我 ...