您的位置:首页 > 编程语言 > C语言/C++

C/C++实现微信跳一跳辅助(学习纪录)

2018-03-12 00:00 686 查看
在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"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.未经允许,不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐