C#实现微信跳一跳小游戏的自动跳跃助手开发实战

一、前言:

前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“打飞机”游戏,这游戏玩法简单,但加上了积分排名功能后,却成了“装逼”的地方,于是很多人花钱花时间的刷积分抢排名。后来越来越多的聪明的“程序哥们”弄出了不同方式不同花样的跳一跳助手(外挂?),有用JS实现的、有JAVA实现的、有Python实现的,有直接物理模式的、有机械化的、有量尺子的等等,简直是百花齐放啊……

赶一下潮流,刚好有点时间,于是花了一个下午时间,我也弄了一个C#版本的简单实现。

二、实现:

简单的实现流程: 连接手机 -> 获取跳一跳游戏界面 -> 获取位置(棋子位置和要跳跃的落脚点位置) -> 点击棋子跳跃

1、连接手机

电脑要连接并操作安卓手机,一般是通过ADB协议连接手机并进行操作。连接手机前要求手机已开启USB调试模式,可通过USB线或者TCP方式连接手机。正常只要电脑安装了adb sdk tools之类的工具包,就会自带有adb命令,所以C#要能操作手机,简单实现就是直接利用现成的adb命令。

手机通过USB线接入电脑后,在CMD窗口输入以下adb devices命令,如果显示有device列表则表示手机已连接成功可以对手机进行操作了。

C:\Users\k>adb devices
List of devices attached
e832acb device

2、获取游戏界面

获取手机界面的截图可通过以下adb命令获取:

adb shell screencap -p [filename]

参数 :

- p 表示截图保存格式为PNG图像格式。

filename: 截图保存的路径地址(手机路径),如果不输入则将截图数据直接输出到当前控制台会话,否则会将截图保存到相关路径地址(必须有写权限)

为避免文件保存到手机后还要再执行adb pull(拉文件到本地电脑)的操作,所以选择不带filename参数的命令。在C#代码里通过Process这个类进行adb命令的调用执行,实现代码如下:

var startInfo = new ProcessStartInfo("adb", "shell screencap -p");
startInfo.CreateNoWindow = true;
startInfo.ErrorDialog = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
var process = Process.Start(startInfo);
process.Start();
var memoStream = new MemoryStream();
process.StandardOutput.BaseStream.CopyTo(memoStream);

但由于adb client的原因,在它输出的截图数据流中会对'\n'(0A)这个字符替换为''\r\n'(0D0A)这两个字符,并且在测试中还发现不同的手机替换次数还不相同的,有可能替换一次,也有可能替换二次!所以为解决这个问题,先计算在最开始的10字节里的数据出现了多少次'\r'(0D)字符后再出现‘\n'(0A)字符,因为正常的PNG文件,在文件头的第4,第5个字节位置里会有'\r\n'(0D0A)标志,所以检查出来的出现次数就表示'\n'(0A)被adb client替换了多少次,之后再对整个接收到的数据流进行'\n'(0A)还原(删除无用的'\r'(0D)字符)。

>>统计'\n'被替换了次

 private static int Find0DCount(MemoryStream stream)
 {
  int count = 0;
  stream.Position = 0;
  while(stream.Position < 10 && stream.Position < stream.Length)
  {
  int b = stream.ReadByte();
  if(b == '\r')
  {
   count++;
  }
  else if(b == '\n')
  {
   return count;
  }else if(count > 0)
  {
   count = 0;
  }
  }
  return 0;
 }

>>对接受到的截图数据流进行'\n'字符还原

 var count = Find0DCount(memoStream);
  var newStream = new MemoryStream();
  memoStream.Position = 0;
  while (memoStream.Position != memoStream.Length)
  {
   var b = memoStream.ReadByte();
   if (b == '\r')
   {
   int c = 1;
   var b1 = memoStream.ReadByte();
   while(b1 == '\r' && memoStream.Position != memoStream.Length)
   {
    c++;
    b1 = memoStream.ReadByte();
   }
   if(b1 == '\n')
   {
    if(c == count)
    {
    newStream.WriteByte((byte)'\r');
    }
    newStream.WriteByte((byte)b1);
   }
   else
   {
    for(int i=0; i<c; i++) newStream.WriteByte((byte)'\r');
    newStream.WriteByte((byte)b1);
   }
   }
   else {
   newStream.WriteByte((byte)b);
   }
  }
  return new Bitmap(newStream);

3、获取棋子与跳跃落脚点位置

将获取到的手机界面截图显示到软件窗体上的PictureBox控件上,可用鼠标的左右键分别点击图片位置标示棋子位置和需要跳的落脚点位置,鼠标点击的坐标位置即表示手机界面的坐标位置。由于手机界面截图在PictureBox控件显示时为了能一屏全图显示,对图片做了缩放处理,且图片缩放后如果图片的宽度小于PictureBox控件的宽度,PictureBox会将图片居中后显示。所以鼠标点击的坐标位置还需要进行坐标转换才可以映射为手机界面里的绝对坐标位置。

转换计算方法:先计算PictureBox控件的图片缩放值和图片显示的左边距,然后再对鼠标点击坐标进行缩放计算。代码如下:

private Point CalPoint(Point p)
 {
  if (this.cbZoom.Checked && this.pictureBox1.Image != null)
  {
  var zoom = (double)this.pictureBox1.Height / this.pictureBox1.Image.Height;
  var width = (int)(this.pictureBox1.Image.Width * zoom);
  var left = this.pictureBox1.Width / 2 - width / 2;
  return new Point((int)((p.X - left) / zoom), (int)(p.Y / zoom));
  }
  else
  {
  return p;
  }
 }

如全靠手动鼠标点击坐标位置来玩游戏,这和直接在手机里手动玩游戏是没有什么区别的,区别只在于能够跳跃精准些(跳跃力度能自动计算出,下面会讲),所以程序还要能够实现自动化,就是要能够自动找出棋子与跳跃落脚点的位置。

A、找棋子的坐标位置

棋子的位置非常的好找,对游戏界面里的棋子(图2黄色块)进行放大可以发现棋子底部有一块区域(图3白色块)的颜色值是固定的R(54)G(60)B(102)颜色,如下两图:

(图2)

(图3)

根据棋子的这一颜色特点在获取到手机界面截图时,对图片象素进行扫描,查找R(54)G(60)B(102)这一颜色,找到的坐标位置就是棋子的位置。为了能快速扫描图片,不采用效率较低下的GetPixel方法获取颜色值,而采用LockBits方法锁定图片数据到内存,再采用指针移动获取象素颜色,由于采用了指针,代码需要开启unsafe定义。且棋子正常情况下不会在最顶部和最底部出现,所以不需要对整张界面图片扫描,只扫描20%-63%区域的数据,并且从底部开始找起。

B、找跳跃的落脚点位置

写此助手只是无聊时的产出物,所以我只是简单实现。游戏中如果连续跳到了目标物的中间位置时,新目标物的中间部分会出现一个白色圈(如上图2的红色块),如果再跳中此位置,会进行加分。根据这一特点,程序找出那一白色圈圈的位置即可做为落脚点位置,白色圈的颜色值为R(254)G(254)B(254),如果没有此白色圈位置,则手动鼠标选择落脚点位置。实现此功能后,程序基本上也能实现90%左右的自动化跳跃了。

查找代码实现如下:

private static Point FindPointImpl(Bitmap bitmap, out Point comboPoint)
 {
  var standPColor = Color.FromArgb(54, 60, 102);
  var comboPColor = Color.FromArgb(245, 245, 245);

  Point standPoint = Point.Empty;
  comboPoint = Point.Empty;

  int y1 = (int)(bitmap.Height * 0.2);
  int y2 = (int)(bitmap.Height * 0.63);

  PixelFormat pf = PixelFormat.Format24bppRgb;

  BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, y1, bitmap.Width, y2), ImageLockMode.ReadOnly, pf);
  try
  {
  unsafe
  {
   int w = 0;
   while (y2 > y1)
   {
   byte* p = (byte*)bitmapData.Scan0 + (y2 - y1 - 1) * bitmapData.Stride;
   w = bitmap.Width;
   int endColorCount = 0;
   while (w > 40)
   {
    ICColor* pc = (ICColor*)(p + w * 3);
    if (standPoint == Point.Empty &&
    pc->R == standPColor.R && pc->G == standPColor.G && pc->B == standPColor.B)
    {
    standPoint = new Point(w - 3, y2);
    if (comboPoint != Point.Empty) break;
    }
    else if (comboPoint == Point.Empty)
    {
    if (pc->R == comboPColor.R && pc->G == comboPColor.G && pc->B == comboPColor.B)
    {
     endColorCount++;
    }
    else
    {
     if (endColorCount > 0)
     {
     comboPoint = new Point(w + 5, y2 - 1);
     if (standPoint != Point.Empty) break;
     }
     endColorCount = 0;
    }
    }
    w--;
   }
   if (comboPoint == Point.Empty)
   {
    if (endColorCount > 10)
    {
    comboPoint = new Point(w + 5, y2 - 1);
    }
   }
   if (standPoint != Point.Empty && comboPoint != Point.Empty) break;
   y2--;
   }
  }
  return standPoint;
  }
  finally
  {
  bitmap.UnlockBits(bitmapData);
  }
 }

4、棋子跳跃

要能跳跃,首先需要知道一个蓄力时间,就是按住棋子多久的时间,此蓄力时间的计算公式如下:

蓄力时间 = 距离 * 力度系数

“距离”就是棋子位置与跳跃落脚点位置的距离,根据上面的方法得出这两个位置的坐标点后,根据直角三角形的勾股定理即可求出,代码如下:

 public double Distance
 {
  get
  {
  if (!this.CanDo) return -1;
  int w = Math.Abs(this.P2.X - this.P1.X);
  int h = Math.Abs(this.P2.Y - this.P1.Y);
  return Math.Sqrt((double)(w * w) + (h * h));
  }
 }

“力度系数”  是一个常量值,具体怎么定义没去细查,我采用的计算公式是: “力度系数 = 1495 / 手机分辨率的宽度值”, 如我的手机分辨率是1080*1920,则力度系数就是 1495 / 1080 = 1.3842....

算出了蓄力时间后通过以下adb命令发送到手机即可模拟点击操作。

adb shell input swipe <x1> <y1> <x2> <y2> [duration(ms)]

x1, y1 就是棋子的坐标位置

x2, y2 还是棋子的坐标位置

duration 蓄力时间值,由距离*力度系数得出。

代码如下:

 public bool Do()
 {
  if (!this.CanDo) return false;
  var startInfo = new ProcessStartInfo("adb", string.Format("shell input swipe {0} {1} {0} {1} {2}", this.P1.X, this.P1.Y, this.Time));
  startInfo.CreateNoWindow = true;
  startInfo.ErrorDialog = true;
  startInfo.UseShellExecute = false;
  var process = Process.Start(startInfo);
  return process.Start();
 }

三、结束语

程序实现很简单,都是通过adb命令与手机进行交互操作。如果你认为对你有帮助麻烦赞下即可:)积分别玩太过哦。

代码仓库:https://github.com/kingthy/JumperHelper

总结

以上所述是小编给大家介绍的C#实现微信跳一跳小游戏的自动跳跃助手开发实战,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1.windows上安装python2.7,配置好环境变量和pip 2.到这个网站下载对应版本的pyHook和pywin32 http://www.lfd.uci.edu/~gohlke/pythonlibs 2.打开cmd,安装下载好的whl文件和其他库 pip install pywin32-221

  • 微信跳一跳辅助Java代码实现

    微信跳一跳辅助的Java具体实现代码,供大家参考,具体内容如下 1.参考知乎教你用Python来玩微信跳一跳,鉴于本人Python一直都是半吊子水平,之前打算用python刷分,可无奈安装python环境各种模块缺失,报错不停,于是乎,使用Java重新实现了一下. 2.环境配置及相关说明: 1).Windows系统,本人win10 2).AVA环境安装,JDK7以上即可 3).安卓手机一部.数据线一条 4).电脑安装ADB驱动,连接安卓手机,同时打开USB调试模式 5).打开微信小程序的跳一跳游

  • 教你用 Python 实现微信跳一跳(Mac+iOS版)

    这几天看网上好多微信跳一跳破解了,不过都是安卓的,无奈苹果不是开源也没办法.这个教程是 Mac + iOS , 要下xcode 要配置环境小白估计是没戏了,有iOS 开发经验的可以看看 .不过其实可以没事帮同事刷一下,让他们请吃个饭什么的,哈哈. 先发个战果 一.WebDriverAgent 首先去 https://github.com/facebook/WebDriverAgent 下一份代码 选择 WebDriverAgentRunner 用真机 然后 test 运行一下 , 看到IP地址就

  • 微信跳一跳php代码实现

    本文实例为大家分享了php微信跳一跳的具体代码,供大家参考,具体内容如下 <?php require 'config.php'; function similar($rgb1, $rgb2) { $r1 = ($rgb1 >> 16) & 0xFF; $g1 = ($rgb1 >> 8) & 0xFF; $b1 = $rgb1 & 0xFF; $r2 = ($rgb2 >> 16) & 0xFF; $g2 = ($rgb2 >

  • C#图像识别 微信跳一跳机器人

    更新 GitHub中所有类库的源码已经转换为C#版本. 准备 IDE:VisualStudio Language:C#/VB.NET GitHub:AutoJump.NET 本文将向你介绍一种通过图像识别实现"跳一跳"机器人的方法. 第一节 图像识别 文中提到的所有方法和步骤只涉及简单的向量计算. 需要用到哪些计算? 比较像素点的颜色 求向量集合的中心 计算颜色的相似度 一个RGB颜色可以看作一个三维向量 比较两个颜色的相似度可以计算它们的欧几里得距离 也可以直接比较它们的夹角:夹角越

  • 微信小程序—微信跳一跳,Android游戏助手(外挂)使用教程详解

    作为一名有着丰富实战经验的Android开发人员,作为一个有着一定基础和实战的逆向新司机,第一次面对github上的这个项目自己也是懵的,即使看完了README,也还是不知道从何下手.在此之前玩游戏从未使用过游戏助手之类的.那么我在想,作为小半个专业选手尚且这样,广大小白又能比我好到哪里去呢? 以前我也曾经是个单纯的好骚年啊! 后来经过仔细阅读README,加上摸索,和查看源码,才慢慢走上正途:下面记录一下,以备你查看: 成果 图片说明:本人排行第二,记得我自己才跳了昨天一百七十多分,大多数都是

  • 安卓版本微信跳一跳自动执行代码剖析

    手动版的这里不多说,图像识别,坐标计算跳跃,要想得高分会点的手疼.这里主要剖析下自动版的,这里仅介绍安卓版本. 整体的结构 脚本的整体结构还是比较简洁的,如下图所示. 手机连接PC,PC通过adb命令对手机游戏界面进行截图: PC通过adb命令将该截图拷贝回PC: PC端通过python对图像进行处理(第一版中使用的opencv,目前使用的是直接读取像素的rgb值),获取棋子的位置,获取下一个棋盘的位置,然后计算出下一跳的距离,从而根据经验值计算出按压时间t: 通过adb命令模拟按压时间t即可实

  • 微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧

    前言 小程序跳一跳最近很火,之前爆出微信游戏小程序漏洞,网上也不乏大神.这里就用一大神的python脚本来刷下高分. 跳一跳python脚本传送门 配置过程 注: 电脑环境未配置python环境,请自行谷歌或者百度配置,这里不再做叙述. 1. 将上述传送门整个项目拷贝到本地(用git命令,或者直接压缩包下载,这里大家随意).比如我这里下载压缩包,解压我电脑以下的目录. 2. 楼主用的是 ios , 操作起来比较繁琐,也懒得找测试要 Android 测试机,所有就下了模拟器测试,首推雷电模拟器,安

  • C#实现微信跳一跳小游戏的自动跳跃助手开发实战

    一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏"跳一跳"在各朋友圈里又火了起来,类似以前的"打飞机"游戏,这游戏玩法简单,但加上了积分排名功能后,却成了"装逼"的地方,于是很多人花钱花时间的刷积分抢排名.后来越来越多的聪明的"程序哥们"弄出了不同方式不同花样的跳一跳助手(外挂?),有用JS实现的.有JAVA实现的.有Python实现的,有直接物理模式的.有机械化的.有量尺子的等等,简直是百花齐放啊-- 赶一下潮流

  • Android版微信跳一跳小游戏利用技术手段达到高分的操作方法

    本文主要来讲个个好玩的东西,近来微信刚出的跳一跳微信小程序的游戏很火,看到很多人都达到了二三百分就各种刷朋友圈了. 甩手一个表情 最终我们达到的分数却是这样的: 羡慕吧 一定会有人拍手叫好,"黄金右手"!说真的,我已经不用右手好多年,而且我玩这个游戏压根就没用手,而是意念!哈哈,别喷我,开个玩笑而已,肯定是利用技术手段啦,什么技术?python喽-哈哈,不过不是我写的,我自己是做Android开发的,我对于python从来没有接触,只是恰好在蛋哥公众号看到关于这个游戏的文章,觉得有意思

  • 微信跳一跳小游戏python脚本

    Python编写微信小游戏"跳一跳"的运行脚本,分享给大家. 更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪录后总是手抖就挂掉了,气的想要砸手机.闲来无事刷微博的时候正好看到有人分析如何编写脚本自动运行游戏破了3000多分,细看后觉得原理并不复杂,就索性花了一个晚上,参考大神的实现方法,在他的基础上删减了一些代码,也用Python写了个脚本.接下来进行原理和代码分析. 图1.跳一跳启动界面 原理 配置adb环境变量,在我的电脑–>属性–>高

  • 小米5s微信跳一跳小程序python源码

    本文实例为大家分享了微信跳一跳小程序python源码,供大家参考,具体内容如下 微信跳一跳小程序小米5s源码python,搭建环境后亲测可用. # coding: utf-8 import os import sys import subprocess import shutil import time import math from PIL import Image, ImageDraw import random import json import re # === 思路 === # 核

  • 原生JS实现的跳一跳小游戏完整实例

    本文实例讲述了原生JS实现的跳一跳小游戏.分享给大家供大家参考,具体如下: 以下说的是闲暇编写的一个小游戏--跳一跳,类似于微信的跳一跳,大体实现功能有: 1.先随机生成地图: 2.按住按钮释放后完成动作并进行判断: 首先po一下代码: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="vie

  • js实现跳一跳小游戏

    本文实例为大家分享了js实现跳一跳小游戏的具体代码,供大家参考,具体内容如下 效果 流程分析 1.鼠标按下开始蓄力 2.鼠标松开,根据鼠标按下的时间让小球运动相应的距离 3.判断小球落点是否在平台内 4.如果在平台范围内,产生下一个平台,分数加10.如果不在游戏结束,判断分数是否大于历史最高分,更新历史最高分. 动画效果 5.鼠标按下小球所在平台要有蓄力效果,鼠标松开后慢慢恢复, 6.小球在空中的运动曲线要平滑 7.小球和平台要有3D效果 注意事项 8.运动涉及到计算器和延时器,要注意清除定时器

  • python版微信跳一跳游戏辅助

    本文实例为大家分享了微信跳一跳游戏辅助python代码,供大家参考,具体内容如下 import os import PIL import numpy import matplotlib matplotlib.use('TKAgg') import matplotlib.pyplot as plt import time from matplotlib.animation import FuncAnimation # 是否需要进行图片更新 need_update = True def get_sc

  • python微信跳一跳游戏辅助代码解析

    这个代码实现的是   手动点击起点 和 终点  ,程序自动判断距离.触屏时间  完成跳跃 原理(摘自项目说明页面): 1. 将手机点击到"跳一跳"小程序界面: 2. 用Adb 工具获取当前手机截图,并用adb将截图pull上来: adb shell screencap -p /sdcard/1.png adb pull /sdcard/1.png . 3. 用matplot显示截图: 4. 用鼠标点击起始点和目标位置,计算像素距离: 5. 根据像素距离,计算按压时间: 6. 用Adb工

  • 微信跳一跳python辅助脚本(总结)

    这段时间微信跳一跳这个游戏非常火爆,但是上分又非常的难,对于程序员来说第一个念头就是通过写一个辅助脚本外挂让上分变的容易,python现在比较火,我们一起来以python语言为基础总结以下各路神仙写的关于跳一跳的辅助脚本,大家在学习的时候主要理解他们的写法思路,对你学习python非常的有帮助. 1.微信跳一跳自动运行python脚本 注解:思路 核心:每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标, 根据两个点的距离乘以一个时间系数获得长按的时间 识别棋子:靠棋子的颜色来识别

随机推荐