在python 冒出微信跳一跳的辅助程序后,跳一跳的分数分分钟上个一千几百不成问题。本人在校大学生一名,对于python语言尚未熟悉,,C/C++还是学得半桶水的样子,更不用说有多了解python如此丰富的库。为此,我利用简单的OpenCV和驱动ADB进行实现。
主要工具:ADB驱动,OpenCV库,visual studio
一,ADB驱动
该驱动可以实现手机触摸手机屏幕,截图,移动文件等等强大的功能,这个是PC端操作控制安卓端的主要工具。
二,OpenCV
OpenCV是一个跨平台计算机视觉库,功能相当强大;但本程序仅仅是使用到它的获取RGB值的功能。
三,工具的使用
1,利用ADB驱动在PC端对安卓端进行截图,移动文件到PC硬盘,模拟手指按压屏幕;
2,利用OpenCV对截图进行遍历,识别出相关的RGB值,进而判断棋子和板子的位置,以便于计算距离
四,本程序的下载和相关代码:
本程序可以通过百度云进行下载:
链接: https://pan.baidu.com/s/1XVroP6feRjq2MAybdCPrDg 密码: p5qp
本程序代码如下:
//# include "stdafx.h"
# include "stdlib.h"
# include "windows.h"
# include "iostream"
# include <opencv2\opencv.hpp>
# include "string.h"
# include "math.h"
# include "windows.h"
# include "iostream"
# include <opencv2\opencv.hpp>
# include "string.h"
# include "math.h"
using namespace std;
using namespace cv;
using namespace cv;
int hamX = 0;
int hamCount = 0;
int hamY = 0;
int hamCount = 0;
int hamY = 0;
int hamHeight_1 = 10;//用于调节
int boardX_1 = 736;//第一个板子的x坐标
int boardY_1 = 1081;//第一个板子的y坐标
int boardX_2 = 409;//第二个板子的x坐标
int boardY_2 = 869;//第二个板子的y坐标
int hamWidth = 36;//棋子宽度的一半
double special = 1.35;//按压系数,该系数乘于距离就是按压时间
//以上变量只适合 1920x1080 分辨率的手机
int boardY_1 = 1081;//第一个板子的y坐标
int boardX_2 = 409;//第二个板子的x坐标
int boardY_2 = 869;//第二个板子的y坐标
int hamWidth = 36;//棋子宽度的一半
double special = 1.35;//按压系数,该系数乘于距离就是按压时间
//以上变量只适合 1920x1080 分辨率的手机
void dojump(int time)
{
char char_time[20] = { 0 };
sprintf_s(char_time, "%d", time);
char bp[256] = "adb shell input swipe 550 1000 550 1000 ";
strcat_s(bp, char_time);
system(bp);
}
int findBoardX()
{
int bVal_1 = 0, gVal_1 = 0, rVal_1 = 0;
int bVal_2 = 0, gVal_2 = 0, rVal_2 = 0;
int boardX = 0;
int boardY = 0;
int boardCount = 0;
int flag = 0;
IplImage *img = cvLoadImage("d:/newfile/current.png", 1);
for (int y = 500; y < img->height; y++)
{
CvScalar s_1 = cvGet2D(img, y, 1);
bVal_1 = s_1.val[0];
gVal_1 = s_1.val[1];
rVal_1 = s_1.val[2];
{
int bVal_1 = 0, gVal_1 = 0, rVal_1 = 0;
int bVal_2 = 0, gVal_2 = 0, rVal_2 = 0;
int boardX = 0;
int boardY = 0;
int boardCount = 0;
int flag = 0;
IplImage *img = cvLoadImage("d:/newfile/current.png", 1);
for (int y = 500; y < img->height; y++)
{
CvScalar s_1 = cvGet2D(img, y, 1);
bVal_1 = s_1.val[0];
gVal_1 = s_1.val[1];
rVal_1 = s_1.val[2];
for (int x = 0; x < img->width; x++)
{
{
if (abs(x - hamWidth)<74)
{
{
continue;
}
}
CvScalar s_2 = cvGet2D(img, y, x);
bVal_2 = s_2.val[0];
gVal_2 = s_2.val[1];
rVal_2 = s_2.val[2];
bVal_2 = s_2.val[0];
gVal_2 = s_2.val[1];
rVal_2 = s_2.val[2];
if ((abs(bVal_1 - bVal_2) + abs(gVal_1 - gVal_2) + abs(rVal_1 - rVal_2)) > 20)
{
//cout << bVal_2 << endl;
//cout << gVal_2 << endl;
//cout << rVal_2 << endl;
flag = 1;
boardX += x;
boardCount++;
}
{
//cout << bVal_2 << endl;
//cout << gVal_2 << endl;
//cout << rVal_2 << endl;
flag = 1;
boardX += x;
boardCount++;
}
}
if (flag == 1)
{
if (flag == 1)
{
break;
}
}
boardX = boardX / boardCount;
return boardX;
}
}
}
boardX = boardX / boardCount;
return boardX;
}
int findBoardY(int xham, int yham, int xboard)
{
int y = yham + (int)(abs(xham - xboard)*abs(boardY_1 - boardY_2) / abs(boardX_1 - boardX_2));
int y = yham + (int)(abs(xham - xboard)*abs(boardY_1 - boardY_2) / abs(boardX_1 - boardX_2));
return y;
}
double cdistance(int x_1, int y_1, int x_2, int y_2)
{
}
double cdistance(int x_1, int y_1, int x_2, int y_2)
{
double result = 0.0;
result = sqrt(pow(x_1 - x_2, 2) + pow(y_1 - y_2, 2));
//cout << result << endl;
return result;
}
result = sqrt(pow(x_1 - x_2, 2) + pow(y_1 - y_2, 2));
//cout << result << endl;
return result;
}
int main()
{
while (1)
{
Sleep(1500);
system("adb shell screencap -p /sdcard/current.png");
system("adb pull /sdcard/current.png d:/newfile");
//截图并且移动图片
IplImage *img = cvLoadImage("d:/newfile/current.png", 1);
int bValue = 0;
int gValue = 0;
int rValue = 0;
{
while (1)
{
Sleep(1500);
system("adb shell screencap -p /sdcard/current.png");
system("adb pull /sdcard/current.png d:/newfile");
//截图并且移动图片
IplImage *img = cvLoadImage("d:/newfile/current.png", 1);
int bValue = 0;
int gValue = 0;
int rValue = 0;
for (int y = 400; y < img->height; y++)
{
for (int x = 0; x < img->width; x++)
{
CvScalar s = cvGet2D(img, y, x);
bValue = s.val[0];
gValue = s.val[1];
rValue = s.val[2];
if (rValue > 50 && rValue < 60 && gValue > 53 && gValue < 63 && bValue > 95 && bValue < 110)
{
hamX += x;
hamCount++;
hamY = y > hamY ? y : hamY;
{
for (int x = 0; x < img->width; x++)
{
CvScalar s = cvGet2D(img, y, x);
bValue = s.val[0];
gValue = s.val[1];
rValue = s.val[2];
if (rValue > 50 && rValue < 60 && gValue > 53 && gValue < 63 && bValue > 95 && bValue < 110)
{
hamX += x;
hamCount++;
hamY = y > hamY ? y : hamY;
}
}
}
hamX = hamX / hamCount;
hamY -= hamHeight_1;
int boardX = findBoardX();
int boardY = findBoardY(hamX, hamY, boardX);
int time = (int)(special*cdistance(hamX, hamY, boardX, boardY));
time = time > 200 ? time : 200;
dojump(time);
hamX = 0;
boardX = 0;
boardY = 0;
hamY = 0;
hamCount = 0;
//初始化变量
}
return 0;
}
}
}
hamX = hamX / hamCount;
hamY -= hamHeight_1;
int boardX = findBoardX();
int boardY = findBoardY(hamX, hamY, boardX);
int time = (int)(special*cdistance(hamX, hamY, boardX, boardY));
time = time > 200 ? time : 200;
dojump(time);
hamX = 0;
boardX = 0;
boardY = 0;
hamY = 0;
hamCount = 0;
//初始化变量
}
return 0;
}
本人在校大学生菜鸡一名,欢迎各位dalao指点
注意:1.本程序针对分辨率为1920x1080的安卓手机设计,对于其他分辨率的手机可能会有跳不准的情况,有需要可以扣我进行数据修正Q:1226103307
2.未经允许,不得转载。