python写微信跳一跳的辅助,拿高分

  • baagee 发布于 2018-01-05 14:36:07
  • 分类:Python
  • 1405 人围观
  • 6 人喜欢

原因:最近微信更新后有了微信跳一跳小游戏,可是对我来说好难啊,最高才几十分。心中不甘心,就想着使了点小手段,于是半夜快两点睡不着了,就起床研究了一下。

思路:主要思路就是手机通过usb链接电脑,截取游戏屏幕,电脑分析两点的距离,乘以某个系数来计算按压时间,然后在通过电脑操作手机。

问题:

①:电脑如何操作手机呢?我不是搞安卓的,但是会刷机的朋友都知道有个adn驱动,可以操作安卓手机。接下来就要派它上场了。

这里主要就用到了三个命令:

1:获取屏幕截图:

adb.exe shell screencap -p /sdcard/1.png

2:将截图拉到电脑上:

adb.exe pull /sdcard/1.png

3:操作手机实现按压操作:

adb.exe shell input swipe 600 700 600 700 390

最后一个数字表示按压时间,单位毫秒。600,700是按压的位置,两个600,700是滑动操作的起始和终点坐标,当两个坐标不一样就是滑动了。坐标一样时就是长按。

②:要获得两点的坐标就有点困难了,棋子的坐标可以检测棋子上面的圆头来定位,而跳的位置虽然网上有解决方法,但是我仔细想了想,还是决定由用户自己选择吧,这样可能更准确一下,毕竟计算机识别偶尔还是会出错的。

1:首先获取棋子坐标:

def __getChessPosition(self):
        img = cv2.imread('./1Thumb.png')
        try:
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 600, param1=100, param2=25, minRadius=9,
                                        maxRadius=13)
            circles = np.uint16(np.around(circles1))
            circle = circles[0][0]
        except Exception as e:
            print('Error: %s' % e)
            exit()
        else:
            self.pos_1, self.pos_2 = circle[0], circle[1] + 59
            self.__markThumb(circle[0], circle[1])

解释:

主要是通过霍夫变换来识别棋子的,然后进一步获取棋子的坐标。

先补充下霍夫圆变换的几个参数知识:

dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。

minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。

param1,有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

param2,也有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。

minRadius,默认值0,表示圆半径的最小值。

maxRadius,也有默认值0,表示圆半径的最大值。

1Thumb.png是游戏屏幕截图的缩略图。

self.pos_1, self.pos_2就是棋子坐标。

2:获取用户点击坐标

def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    exit()
                elif event.type == MOUSEBUTTONDOWN:
                    if pygame.mouse.get_pressed()[0] == 1:
                        self.pos_3, self.pos_4 = pygame.mouse.get_pos()
            if self.pos_1 != 0 and self.pos_2 != 0 and self.pos_3 != 0 and self.pos_4 != 0:
                press_time = int(
                        math.sqrt(abs(self.pos_1 - self.pos_3) ** 2 + abs(self.pos_2 - self.pos_4) ** 2) * 3.8)
                print('pos_1=%s, pos_2=%s, pos_3=%s, pos_4=%s, press_time=%s' % (
                    self.pos_1, self.pos_2, self.pos_3, self.pos_4, press_time))
                self.__addJumpLine(press_time)
                self.__flushGame("./pictures/%s.png" % self.nowTime)
                self.__jump(press_time)
                self.pos_1 = self.pos_2 = self.pos_3 = self.pos_4 = 0
                time.sleep(1)
                self.__getScreen()
                self.__getChessPosition()
                self.__flushGame('./1Thumb.png')

解释:

主要用到了pygame,将获取的游戏缩略图放到pygame中当做背景。通过事件获取鼠标点击位置。这样就能计算棋子和下一个落地点的距离了,进而就获取了按压时间,至于时间系数这个我是一个一个数尝试的,最后找到了大致合适的系数。

重点讲完了,其实思路也很简单是不是,接下来看一下成果吧:



一万多分瞬间秒杀好友有木有!不过好景不长,分太高就被清零了。所以装逼有风险,帅不过三秒。

最后福利时间:贡献源码,需要的自取:github地址,觉得有用的给个小星星吧。


标签: python

评论

点击图片切换
还没有评论,快来抢沙发吧!