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

在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.未经允许,不得转载。
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HLS(High-Level Synthesis)是一种将高级语言(如C/C++)转换为硬件描述语言(如Verilog和VHDL)的技术,以方便进行FPGA设计。在HLS中实现F.conv2d(二维卷积运算)的方法如下: 1. 定义输入和输出数据类型:首先需要定义输入和输出数据类型。假设输入数据为3通道的图像,每个通道有16位的像素值,输出数据也是16位。则可以使用以下代码定义数据类型: ```c++ typedef short data_t; typedef struct { data_t data[3][H][W]; } input_t; typedef struct { data_t data[H][W]; } output_t; ``` 其中,H和W分别表示图像的高度和宽度。 2. 实现卷积核:卷积核是一个3维数组,用于对输入图像进行卷积运算。可以使用以下代码定义卷积核: ```c++ typedef struct { data_t data[K][K][C][F]; } weight_t; ``` 其中,K表示卷积核的大小,C表示输入图像的通道数,F表示输出图像的通道数。 3. 编写卷积函数:卷积函数的输入包括输入图像、卷积核和偏置项(可选),输出为卷积后的图像。可以使用以下代码实现卷积函数: ```c++ void conv2d(input_t input, weight_t weight, data_t bias, output_t output) { for (int i = 0; i < H-K+1; i++) { for (int j = 0; j < W-K+1; j++) { for (int f = 0; f < F; f++) { data_t sum = 0; for (int c = 0; c < C; c++) { for (int ii = 0; ii < K; ii++) { for (int jj = 0; jj < K; jj++) { sum += input.data[c][i+ii][j+jj] * weight.data[ii][jj][c][f]; } } } sum += bias; output.data[i][j][f] = sum; } } } } ``` 该函数使用4层循环,分别遍历输出图像的每个像素、每个通道和卷积核的每个参数。 4. 使用HLS编译器生成硬件描述语言:使用HLS编译器将C/C++代码转换为硬件描述语言(如Verilog或VHDL),并在FPGA上实现卷积运算。 以上是使用HLS实现F.conv2d的一般流程,具体实现可能因不同的HLS工具和FPGA平台而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vwei_96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值