JAVA实现跳一跳辅助程序之虎啸龙吟
前序:
今天有幸,看到2位博主的文章,在此表示感谢。自己也动手实现了一下。
实现原理 请参考博主 https://www.cnblogs.com/dongkuo/p/8285162.html
另感谢博主 http://www.cnblogs.com/litblank/p/8267526.html 提供的基础部分代码,免去了我自己再写一边的麻烦。
由于第一篇是python 实现,楼主是JAVA出生,想通过java实现,刚好在评论中看到了 第二位博主的java实现连接,但是自己用博主的代码,测试发现效果并不理想,获取的位置点不对。。。可能是打开方式不对~~~0.0
遂根据第一位博主的思路,重新实现了一下,亲测3张图,基本都是ok 的,下面就看看代码部分的实现。
代码实现:
package code; import java.awt.AWTException;
import java.awt.Graphics2D;
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.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import javax.imageio.ImageIO; public class Jump {
//存放图片的路径
static String file1 = "C:\\Users\\JJJ\\Desktop\\jump3.jpg";
//始 扫描行,针对不同的手机分辨率可能不一样,需要修改,此处建议手工测量下坐上角跳跃步数的数字位置,估算出起始行 楼主的手机是se 像素是 1156*640
static int start_y = 200;
static boolean istest = false;
static int background_x = 10; //定义默认的背景色,一定是不会出现其他物体的位置
static int background_y = 580; public static void main(String[] args) throws AWTException, InterruptedException, IOException {
istest = true; System.out.println("开始:计算" + file1);
if (istest) {
cmd_java("cmd /c start adb.bat ", "C:\\Users\\JJJ\\Downloads\\cofface_adb\\cofface_adb_windows_v5.1");//批处理文件
}
BufferedImage bi = (BufferedImage) ImageIO.read(new File(file1));
Map<Integer, Integer> treemap = new TreeMap<Integer, Integer>();
// 获取图像的宽度和高度
int width = bi.getWidth();
int height = bi.getHeight();
//小人中心点坐标
int poix = 0;
int poiy = 0;
//目标物体的最顶点X轴 和左边或右边的Y轴
int mubiaopoix1 = 0;
int mubiaopoiy2 = 0;
//目标中心点坐标
int mubiaopoix = 0;
int mubiaopoiy = 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 > 53 && red < 59) && (green > 57 && green < 61) && (blue > 59 && blue < 103))
{ // 获取小人坐标,从中取除Y值最大的一个
treemap.put(i, j);
}
}
}
}
//获取最后的小人底部坐标 ,此处使用treemap 直接排好序,循环获取Y轴值最大的一个
for (Entry<Integer, Integer> entry : treemap.entrySet())
{
poiy = entry.getKey();
poix = entry.getValue();
}
//开始扫描目标物体的最上和最左坐标 ,扫描的Y最大值为当前小人的Y值
treemap.clear(); //清除前面的记录,准备存放目标物体的坐标
RGB rgb = null;
boolean frist = true;
RGB rgb_0 = pixToRgb(bi, background_x, background_y); //默认的背景色
for (int y = start_y; y < poiy; y++) {
int x = 0;
if (poix < width /2) //此处特别说明下,如果小人的坐标在整个屏幕的左边,则目标物体一定在右边,遂起始x轴从小人之后开始加20开始循环,反之则不用
{
x = poix + 20;
}
else
{
x = 20;
}
for (; x < width - 20; x++) {// 行扫描
int dip = bi.getRGB(x, y);
int p = dip;
RGB rgb_1 = pixToRgb(bi, x, y);
if(frist && rgbCz(rgb_0,rgb_1,10)) //如果不相同则说明找到了第一个点
{
mubiaopoix1 = x;
rgb = rgb_1;
frist = false;
continue;
}
if (!frist && rgbBcz(rgb,rgb_1,10))
{
treemap.put(x, y); //存放所有当前台面的像素点坐标,然后从中选出X值最小的一个,
}
}
}
//获取目标物体的坐标,如果是在右半边,则获取最后一个值的Y轴,如果是在左边,则获取第一个
if (poix > width / 2)
{
for (Entry<Integer, Integer> entry : treemap.entrySet())
{
mubiaopoiy2 = entry.getValue();
break;
}
}
else
{
for (Entry<Integer, Integer> entry : treemap.entrySet())
{
mubiaopoiy2 = entry.getValue();
}
}
//通过获取的2个点坐标计算出中心点位置
mubiaopoix = mubiaopoix1;
mubiaopoiy = mubiaopoiy2;
//计算 小人与目标人物的距离
int total = (mubiaopoix - poix) * (mubiaopoix - poix) + (mubiaopoiy - poiy) * (mubiaopoiy - poiy);
double length = (double) Math.sqrt(total);
double time = length * 1.35; //时间系数
System.out.println("小人的坐标为:" + poix + "," + poiy);
System.out.println("目标物体的坐标为:" + mubiaopoix + "," + mubiaopoiy);
System.out.println("需要按压屏幕的时间为:" + time + "毫秒");
} 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) {
System.out.println(11);
}
input.close();
ir.close();
} /**
* 颜色的差值不在范围内
*/
public static boolean rgbCz(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 true;
}
return false;
} /**
* 颜色的差值在范围内
*/
public static boolean rgbBcz(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 true;
}
return false;
} public static RGB pixToRgb(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;
} }
由于楼主目前没有安卓设备,还无法带上adb实验,目前只是通过手动截取图片,和测量距离计算了3张,总体比较下来,还算是正确的。
第一张图片
计算结果如图:
第二张图片
计算结果如图:
第三张图片
计算结果如图:
后续再搞个安卓设备试试~
JAVA实现跳一跳辅助程序之虎啸龙吟的更多相关文章
- java写跳一跳辅助程序
##起初是想使用按键精灵脚本程序控制,但还是选择熟悉的java.我这里使用了工具,造成延迟问题.也求教:java控制安卓的正确姿势, 参考了.NET玩跳一跳,思路都是一样的,只不过使用ADB控制安卓的 ...
- .NET开发一个微信跳一跳辅助程序
昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来 ...
- 微信小程序跳一跳辅助程序(手动版)
最近,微信官方推出了demo小程序游戏<跳一跳>,这个游戏操作简单,容易上手,却又不容易获得高分,受到很多人的喜爱(emm...这游戏有毒).自己也尝试了玩了几次,作为一个手残+脑残的资深 ...
- 微信_跳一跳辅助程序_Python_(带GitHub项目地址)
1.安装Python(推荐3.6) https://www.python.org/downloads/ 2.在github上下载脚本 [github项目地址](https://github.com/w ...
- 用Java做一个跳一跳辅助
Java跳一跳辅助 首先..让大家看下效果: 由于是闲着没事写的.也懒得看OpenCV的API了. 要用到的工具如下: adb+jdk 把adb添加到环境变量里就行.很简单. 全部代码如下.就这么多. ...
- 37.微信跳一跳辅助开发(C语言+EasyX)
一.开发环境 开发环境 使用语言:C/C++ IDE:VS2010+ 其他三方库 EasyX(http://www.easyx.cn/downloads/) ADB(链接:https://pan.ba ...
- python跳一跳辅助学习
微信跳一跳辅助工具 准备工具 adb驱动 安卓手机 打开手机的调试模式 usb接好手机和电脑 PyCharm:全宇宙唯一一款专门用于Python开发IDE工具 实现原理: 获取手机的实时的截图 点击起 ...
- 微信跳一跳辅助JAVA 自动模拟点击
工具:ADB 原理: 开始游戏后,使用ADB工具让手机截屏发送到电脑 分析图像中小人与目标中心点间的距离,根据一定比例计算出需要触屏的时间 使用ADB进行模拟点击(触屏)相应的时间,完成精准跳跃 程序 ...
- 微信跳一跳辅助Demo
[原创] 前几天没事干看别人一直在玩微信上线的那一个跳一跳小游戏,玩着玩着老是掉下去,闲着没事呗 就想了想做一个辅助程序的呗.不过先做的手动版的.自动版的有点麻烦.就不发了.用的Java写的,也就一个 ...
随机推荐
- Bayan 2015 Contest Warm Up D题(GCD)
D. CGCDSSQ time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- 解决PL/SQL Developer 连接oracle 11g 64位中的问题
1.错误1:Initialization error could not initialize 电脑上原本就装有oracle 11g 64位,但是PL/SQL却怎么也连接不上,报出" Ini ...
- Oracle中主键、外键、索引、序列、唯一性约束的创建
1.主键的创建 方法一:直接在sql语句中声明字段主键约束 create table table_name (id type[length] constraint pk_name primary ke ...
- windows下wamp多域名的配置
前面的话 本文将详细介绍windows下wamp多域名的配置方法 修改hosts文件 hosts文件的位置:系统盘→“windows”→“System32”→“drivers”→“etc” 打开hos ...
- Angular专题系列之一:初识Anjularjs
Angular作为一个前端的主流框架,以其强大的特性正在被越来越多的程序员们所使用,那么,什么是anjular呢?angularjs是一个javascript framework,一个js的框架,可以 ...
- [转]压缩感知重构算法之分段正交匹配追踪(StOMP)
分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的 ...
- Uva 10550 Combination Lock
Sample Input0 30 0 305 35 5 350 20 0 207 27 7 270 10 0 109 19 9 190 0 0 0Sample Output13501350162016 ...
- SSM学习(一)搭建基础框架
不知不自觉,工作也两年多了,由于公司一直用的是ssh框架,所以所学也一直是ssh.直到有一天,服务器被攻击,tomcat目录下总有莫名其妙的一些文件,这些文件通过远程ftp下载了一些病毒和木马,服务器 ...
- 小强的Hadoop学习之路
本人一直在做NET开发,接触这行有6年了吧.毕业也快四年了(6年是因为大学就开始在一家小公司做门户网站,哈哈哈),之前一直秉承着学要精,就一直一门心思的在做NET(也是懒吧).最近的工作一直都和大数据 ...
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
内容简介 Paxos到Zookeeper分布式一致性原理与实践从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议. ...