C/C++实现微信跳一跳辅助(学习纪录)
2018-03-12 00:00
686 查看
在python 冒出微信跳一跳的辅助程序后,跳一跳的分数分分钟上个一千几百不成问题。本人在校大学生一名,对于python语言尚未熟悉,,C/C++还是学得半桶水的样子,更不用说有多了解python如此丰富的库。为此,我利用简单的OpenCV和驱动ADB进行实现。主要工具:ADB驱动,OpenCV库,visual studio
2,利用OpenCV对截图进行遍历,识别出相关的RGB值,进而判断棋子和板子的位置,以便于计算距离
//# include "stdafx.h"# include "stdlib.h"
# include "windows.h"
# include "iostream"
# include <opencv2\opencv.hpp>
# include "string.h"
# include "math.h"using namespace std;
using namespace cv;int hamX = 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 分辨率的手机
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]; 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]; 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++;
} }
if (flag == 1)
{ break;
}
}
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)); return y;
}
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;
}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; 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; }
}
}
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.未经允许,不得转载。
一,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"using namespace std;
using namespace cv;int hamX = 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 分辨率的手机
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]; 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]; 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++;
} }
if (flag == 1)
{ break;
}
}
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)); return y;
}
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;
}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; 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; }
}
}
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.未经允许,不得转载。
相关文章推荐
- PYTHON 实现的微信跳一跳【辅助工具】仅作学习
- JAVA实现微信跳一跳辅助
- 分享一种简单实现微信跳一跳辅助的方法
- 关于微信跳一跳辅助脚本的代码学习
- 微信跳一跳辅助之JAVA版(最容易理解的算法)实现原理分析
- Java实现微信跳一跳辅助
- C++实现微信跳一跳辅助程序
- C++调用matlab函数实现微信自动跳一跳
- 微信“跳一跳”辅助教程python实现
- 《面向对象基础:C++实现》学习笔记之六
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(4)二分搜索算法
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(6)高效率的幂运算
- C/C++中strlen(),strcpy(),strcat()以及strcmp()的代码实现--学习笔记
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- 《数据结构与算法分析--C++描述》(第三版)学习笔记系列一:BST的实现
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(1) f(x) = 2f(x-1) + x^2
- C++学习 - 快速排序,更加优化的实现
- C++ 学习练手 - 数组型队列的模板实现