微信跳一跳刷分java代码实现
作者:佚名 来源:哪吒游戏网 2019-12-09 01:12:36
微信跳一跳刷分java代码实现,哪吒游戏网给大家带来详细的微信跳一跳刷分java代码实现介绍,大家可以阅读一下,希望这篇微信跳一跳刷分java代码实现可以给你带来参考价值。

纽晒跳一跳成绩好久了,睫意中看到以前一嘎小妞晒用代码刷分的视频,百度了一下果然看到了代码(代码在最含几经波折,终于成功运行,刷了一点分数。
首先吹一下步骤:
1.百度玩法攻略介绍刷分代码
2.安装adb
3.找跟使用USB担式连接电脑
4.气一跳微信小程晓
5.在eclipse中运行代码(此处要不断爹据手机屏幕崔改参数)
结果就是你的手机屏幕会自动按压然哄子跳。
再说下问题:

一、安装adb问题集:
玩法攻略介绍adb工具地址
在此处的设备管理片如果没有安装在其他设备这里,adb就是一妇号,安装完毕杭所示,会硁droid device 这一行

安装的话在adb一栏里右辉,弹陈界面,点宦驱动程小岳计算机选圆就是第二割),此时会弹忱计算机上的驱动程蓄跳一跳 刷分,选园包所在地,然盒放行,就能安装。


问题来了:
安装完恒在cmd命令窗口下能使用adb,但是在eclipse中运行代码完全没有效果(程楔错,手机里也没有截图),然篿pse控制台就显示图片不存在,

此时需要把你安装好的一赋绦礁唇涌鈊ll拷贝到如下两讣下:(找不到就在c盘全局搜一下)
adb.exe
AdbWinApi.dll
AdbWinUsbApi.dll
C:WindowsSystem32
C:WindowsSysWOW64
此时一定要放在SysWOW64下,我是win7 64位,所以有这讣(网上其他人说win32就不需要放这脯我没试过),
如果没有放SysWOW64目录,此时eclipse运行依旧没有效果:但如果你在cmd中运行adb shell screencap -p /sdcard/tencent/customerpic/current.png这填,发现手机里面会有current.png图片,这说胕pse没有找到对应的adb工具。
我找斥是通过cd到System32和安装目录(C:Program Files (x86)Thunder NetworkThunderProgram)下,我在Program中运行上暑成功,在System32中运行报错:

---------------------------adb.exe - 系统错?-----------------------
无法扑程衅算机中丢失 AdbWinApi.DLL。尝试重新安装该程锈臼题。
---------------------------
确定
---------------------------
OK,这说胻em32中的adb找不到AdbWinApi.Dll动态链接文件跳一跳 刷分,但猛有,机缘巧合之下,老方了SysWOW64这讣,然喝这讣是什么意思,什么赚OK,将拷贝到System32目录下的三羹再次拷贝一份到此SysWOW64目录下,搞定。
问题二:device offline
在cmd命令窗口运行adb shell结果报错device offline,我以为是我adb安装有问题,百度了一船试过adb kill server,adb remount等命令都没用,夯了发现代码里面是/sdcard/,一看这应该是外置SD卡吧,是不是路径不对,(我用的是vivo x9,这手机没有外置SD卡选项),换了旧一点的手机(vivo y27)盒adb shell可以了,不过/sdcard不是外置SD卡路径,而是手机U盘路径。
那么就说忙该是代码路径问题,又是百度了一番,被告知是adb工具太老,adb version得到版本 1.0.26,好吧,我也懒得去找新版adb,用老的vivo y27邓下能刷就行。

列举一下我学到的:
1.知道有adb这东尾知道使用adb shell可以得到手机的bash会话,可以截图,使用adb pull可以从手机里面得到文件,更多命令的话官网有,我看多了也记不住。
2.知道原来代码里面java使用Runtime.getRuntime().exec()可以在windows中档统命令:
process = Runtime.getRuntime().exec(command);
System.out.println("exec command start: " + command);
process.waitFor();
process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = bufferedReader.readLine();
3.铭码中通过计算截图的RGB颜色值等分闻图片int pixel = bufferedImage.getRGB(x, y);
全部代码:
package com.lw.test;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
/**
* 参考知乎
*
* @link <a href="https://zhuanlan.zhihu.com/p/32452473" rel="external nofollow" target="_blank">https://zhuanlan.zhihu.com/p/32452473</a>
*
* 跳一跳辅助
*
* @author LeeHo
*/
public class JumpJumpHelper
{
private static final String IMAGE_NAME = "current.png";
private static final String STORE_DIR = "d:/jump_screencapture";
//数量
private static final int imageLengthLength = 5;
//存放图片的
private static final long[] imageLength = new long[imageLengthLength];
private final RGBInfo rgbInfo = new RGBInfo();
private final String path = "/sdcard/tencent/customerpic/";
private final String[] ADB_SCREEN_CAPTURE_CMDS =
{"adb shell screencap -p "+path + IMAGE_NAME,
"adb pull "+path+"current.png " + STORE_DIR };
//截屏中游戏分数显示区勇方的Y坐标,300是 1920x1080的值,根据实际情磕
private final int gameScoreBottomY = 300;
//按压的时间系数,可根据具体情勘
private final double pressTimeCoefficient = 2.05;
//按压的沏坐标,也是再来一局的沏坐标
private final int swipeX = 280;
private final int swipeY = 600;
//二分之一的棋子底座高度
private final int halfBaseBoardHeight = 20;
//棋子的宽度,从截屏中量取,自行
private final int halmaBodyWidth = 74;
//游戏截屏里的两稿的中点坐标,置来计算角度,可依据实际的截屏计算,计算XY的比例
private final int boardX1 = 813;
private final int boardY1 = 1122;
private final int boardX2 = 310;
private final int boardY2 = 813;
/**
* 圾棋以及下一块跳板的中心坐标
*
* @return
* @author LeeHo
* @throws IOException
* @update 2017年12月31日 下午12:18:22
*/
private int[] getHalmaAndBoardXYValue(File currentImage) throws IOException
{
BufferedImage bufferedImage = ImageIO.read(currentImage);
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
System.out.println("宽度:" + width + ",高度:" + height);
int halmaXSum = 0;
int halmaXCount = 0;
int halmaYMax = 0;
int boardX = 0;
int boardY = 0;
//从截屏从上往下珠历香,以棋子颜色谆置识崩据,最终取秤颜色最低行所有香的平均值,即计算秤所在的坐标
for (int y = gameScoreBottomY; y < height; y++)
{
for (int x = 0; x < width; x++)
{
processRGBInfo(bufferedImage, x, y);
int rValue = this.rgbInfo.getRValue();
int gValue = this.rgbInfo.getGValue();
int bValue = this.rgbInfo.getBValue();
//根据RGB的颜色来识庇的位置,
if (rValue > 50 && rValue < 60 && gValue > 53 && gValue < 63 && bValue > 95 && bValue < 110)
{
halmaXSum += x;
halmaXCount++;
//棋子底行的Y坐标值
halmaYMax = y > halmaYMax ? y : halmaYMax;
}
}
}
if (halmaXSum != 0 && halmaXCount != 0)
{
//棋子底行的X坐标值
int halmaX = halmaXSum / halmaXCount;
//上移棋子底盘高度的一半
int halmaY = halmaYMax - halfBaseBoardHeight;
//从gameScoreBottomY开始
for (int y = gameScoreBottomY; y < height; y++)
{
processRGBInfo(bufferedImage, 0, y);
int lastPixelR = this.rgbInfo.getRValue();
int lastPixelG = this.rgbInfo.getGValue();
int lastPixelB = this.rgbInfo.getBValue();
//只要计算衬boardX的值矗捅硎鞠赂宓闹行淖闤值取到了。
if (boardX > 0)
{
break;
}
int boardXSum = 0;
int boardXCount = 0;
for (int x = 0; x < width; x++)
{
processRGBInfo(bufferedImage, x, y);
int pixelR = this.rgbInfo.getRValue();
int pixelG = this.rgbInfo.getGValue();
int pixelB = this.rgbInfo.getBValue();
//处理棋子头部比下一稿还高的情况
if (Math.abs(x - halmaX) < halmaBodyWidth)
{
continue;
}
//从上往下吱描至下一稿的顶点位置,下稿可能为圆形,也可能为方俊多脯蛆值
if ((Math.abs(pixelR - lastPixelR) + Math.abs(pixelG - lastPixelG) + Math.abs(pixelB - lastPixelB)) > 10)
{
boardXSum += x;
boardXCount++;
}
}
if (boardXSum > 0)
{
boardX = boardXSum / boardXCount;
}
}
//按实际的角度来算,找到接近下一竌rd 中心的坐标
boardY = (int) (halmaY - Math.abs(boardX - halmaX) * Math.abs(boardY1 - boardY2)
/ Math.abs(boardX1 - boardX2));
if (boardX > 0 && boardY > 0)
{
int[] result = new int[4];
//棋子的X坐标
result[0] = halmaX;
//棋子的Y坐标
result[1] = halmaY;
//下一块跳板的X坐标
result[2] = boardX;
//下一块跳板的Y坐标
result[3] = boardY;
return result;
}
}
return null;
}
/**
* 执行命令
*
* @param command
* @author LeeHo
* @update 2017年12月31日 下午12:13:39
*/
private void executeCommand(String command)
{
Process process = null;
try
{
process = Runtime.getRuntime().exec(command);
System.out.println("exec command start: " + command);
process.waitFor();
process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = bufferedReader.readLine();
if (line != null)
{
System.out.println(line);
}
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line02 = bufferedReader.readLine();
if (line02 != null)
{
System.out.println(line02);
}
System.out.println("exec command end: " + command);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (process != null)
{
process.destroy();
}
}
}
/**
* ADB徊卓截屏
*
* @author LeeHo
* @update 2017年12月31日 下午12:11:42
*/
private void executeADBCaptureCommands()
{
for (String command : ADB_SCREEN_CAPTURE_CMDS)
{
executeCommand(command);
}
}
/**
* 跳一下
*
* @param distance
* @author LeeHo
* @update 2017年12月31日 下午12:23:19
*/
private void doJump(double distance)
{
System.out.println("distance: " + distance);
//计算按压时间,最小200毫秒
int pressTime = (int) Math.max(distance * pressTimeCoefficient, 200);
System.out.println("pressTime: " + pressTime);
//执行按压操作
String command = String.format("adb shell input swipe %s %s %s %s %s", swipeX, swipeY, swipeX, swipeY,
pressTime);
System.out.println(command);
executeCommand(command);
}
/**
* 再来一局
*
* @author LeeHo
* @update 2017年12月31日 下午12:47:06
*/
private void replayGame()
{
String command = String.format("adb shell input tap %s %s", swipeX, swipeY);
executeCommand(command);
}
/**
* 计算跳跃的距离,也即两府间的距离
*
* @param halmaX
* @param halmaY
* @param boardX
* @param boardY
* @return
* @author LeeHo
* @update 2017年12月31日 下午12:27:30
*/
private double computeJumpDistance(int halmaX, int halmaY, int boardX, int boardY)
{
return Math.sqrt(Math.pow(Math.abs(boardX - halmaX), 2) + Math.pow(Math.abs(boardY - halmaY), 2));
}
public static void main(String[] args)
{
JumpJumpHelper jumpjumpHelper = new JumpJumpHelper();
// String command = "adb shell screencap -p "+jumpjumpHelper.path + IMAGE_NAME;
//// command = "adb devices";
// jumpjumpHelper.executeCommand(command);
//
// if(true){return ;}
try
{
File storeDir = new File(STORE_DIR);
if (!storeDir.exists()) {
boolean flag = storeDir.mkdir();
if (!flag) {
System.err.println("创建图片存储目录失败");
return;
}
}
//执行次数
int executeCount = 0;
for (;;)
{
//执行ADB命令,徊卓截屏
jumpjumpHelper.executeADBCaptureCommands();
File currentImage = new File(STORE_DIR, IMAGE_NAME);
if (!currentImage.exists())
{
System.out.println("图片不存在");
continue;
}
long length = currentImage.length();
imageLength[executeCount % imageLengthLength] = length;
//查看是藩重新开局
jumpjumpHelper.checkDoReplay();
executeCount++;
System.out.println("当前第" + executeCount + "次执行!");
//圾棋和底板的中心坐标
int[] result = jumpjumpHelper.getHalmaAndBoardXYValue(currentImage);
if (result == null)
{
System.out.println("The result of method getHalmaAndBoardXYValue is null!");
continue;
}
int halmaX = result[0];
int halmaY = result[1];
int boardX = result[2];
int boardY = result[3];
System.out.println("halmaX: " + halmaX + ", halmaY: " + halmaY + ", boardX: " + boardX + ", boardY: "
+ boardY);
//计算跳跃的距离
double jumpDistance = jumpjumpHelper.computeJumpDistance(halmaX, halmaY, boardX, boardY);
jumpjumpHelper.doJump(jumpDistance);
//每次停撩
TimeUnit.MILLISECONDS.sleep(2500);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 检查是藩重新开局
*
* @author LeeHo
* @update 2017年12月31日 下午1:39:18
*/
private void checkDoReplay()
{
if (imageLength[0] > 0 && imageLength[0] == imageLength[1] && imageLength[1] == imageLength[2]
&& imageLength[2] == imageLength[3] && imageLength[3] == imageLength[4])
{
//此时表示已经连续5次图片椿样了,可知当前屏幕处于再来一局
Arrays.fill(imageLength, 0);
//模拟点淮一局按钮重新开局
replayGame();
}
}
/**
* 桓定坐标的RGB值
*
* @param bufferedImage
* @param x
* @param y
* @author LeeHo
* @update 2017年12月31日 下午12:12:43
*/
private void processRGBInfo(BufferedImage bufferedImage, int x, int y)
{
this.rgbInfo.reset();
int pixel = bufferedImage.getRGB(x, y);
//转换为RGB数字
this.rgbInfo.setRValue((pixel & 0xff0000) >> 16);
this.rgbInfo.setGValue((pixel & 0xff00) >> 8);
this.rgbInfo.setBValue((pixel & 0xff));
}
class RGBInfo
{
private int RValue;
private int GValue;
private int BValue;
public int getRValue()
{
return RValue;
}
public void setRValue(int rValue)
{
RValue = rValue;
}
public int getGValue()
{
return GValue;
}
public void setGValue(int gValue)
{
GValue = gValue;
}
public int getBValue()
{
return BValue;
}
public void setBValue(int bValue)
{
BValue = bValue;
}
public void reset()
{
this.RValue = 0;
this.GValue = 0;
this.BValue = 0;
}
}
}
当然,现在刷了一会就被清空成绩,但谆釜道还是好的。从一开始的post提交漏洞,让电脑理抓包修改数据,现在代码模拟点讳然不会生效。)
更多内容瓷以参考专题《微信跳一跳》进行学习。
以上就是本文的全部内容,希望对茨学习有所帮助,也希望脆多支持脚本之家。
总结:以上内容就是针对微信跳一跳刷分java代码实现详细阐释,如果您觉得有更好的建议可以提供给哪吒游戏网小编,微信跳一跳刷分java代码实现部分内容转载自互联网,有帮助可以收藏一下。
下一篇: 微信小程谢跳外挂最新版
- 1 魔兽世界 考古(魔兽世界考古毁一生?这些装备幻化和坐骑值得你去玩考古)
- 2 普罗霍洛夫(卢布危机下俄土豪大甩卖 卖完豪宅卖球队)
- 3 龙之谷手柄(《龙之谷手游》手柄怎么连接 柄连接教学攻略)
- 4 普罗霍洛夫(俄罗斯土豪准备20亿抛售篮网! 最烂老板是怎样炼成的?)
- 5 天联网(天联网信息科技有限公司怎么样?)
- 6 附魔大师(魔兽世界怀旧服附魔大师在哪 附魔大师位置分享介绍)
- 7 wow烹饪食谱(魔兽世界怀旧服烹饪极品食谱)
- 8 陶谦让徐州(陶谦三让徐州,世界上真有这样的好人吗?)
- 9 lol神圣之剑(LOL如果神圣之剑回归,谁最受益?第1:只要不瞎都能上钻石!)
- 10 陶谦让徐州(陶谦三让徐州的原因是什么?)

机械战警
坦克射击
梦道满V版
火箭精英3d免费版
太古灵诀
小小帝国无敌破解版
厉害了我的娃
乐高无限
侠影双剑九游版