zoukankan      html  css  js  c++  java
  • 跳一跳辅助程序(拿来主义)

    感谢博主提供了手动跳。

    github大佬们提供了自动跳

    手动跳很累,而且有时候会掉下来。还是自动跳好。

    首先你需要一个python开发环境,需要numpy PIL matplotlib这三个包的支持。如果没有pip,可以到这里手动下载

    然后是一个adb,这个是android开发包的一个程序,可以到这里下载,(需要免费的可以给我留言,或者自己下载SDK)

    然后就是代码了。直接复制运行。我慢慢会补充代码的说明(毕竟伸手党懒)

    #coding:utf-8
    import os
    import PIL,numpy
    import  matplotlib.pylab as plt
    from matplotlib.animation import FuncAnimation
    import time
    need_update = True
    press_coefficient=2.099
    piece_base_height_1_2=13
    piece_body_width=47
    
    def get_screen_image():
        os.system('adb shell screencap -p /sdcard/screen.png')#获取当前界面的手机截图
        os.system('adb pull /sdcard/screen.png')#下载当前截图到电脑当前文件夹
        return numpy.array(PIL.Image.open('screen.png')) #打开当前文件下的图片
    
    def jump_to_next(point1,point2):#计算弦的长度
        x1, y1 = point1; x2, y2 = point2
        distance = ((x2-x1)**2 + (y2-y1)**2)**0.5
        x1=int(x1)
        y1=int(y1)
        x2=int(x2)
        y2=int(y2)
        os.system('adb shell input swipe {} {} {} {} {}'.format(x1,y1,x2,y2,int(distance*2)))
        #手机的单击位置,0 0 0 0 0 ,x轴y轴滑动后的xy轴单击时间
    
    
    def on_calck(event, coor=[]):#绑定鼠标的单击事件[(x,y)(x2,y2)],
        global need_update
        coor.append((event.xdata, event.ydata))
        if len(coor) == 2:
            jump_to_next(coor.pop(), coor.pop())
        need_update = True
    
    def update_screen(frame):#更新图片/从画图片
        global need_update
        if need_update:
            time.sleep(1)
            axes_image.set_array(get_screen_image())
            need_update = False
        return axes_image,
    def find_piece_and_board(im):
        """
        寻找关键坐标
        """
        w, h = im.size
    
        piece_x_sum = 0
        piece_x_c = 0
        piece_y_max = 0
        board_x = 0
        board_y = 0
        scan_x_border = int(w / 8)  # 扫描棋子时的左右边界
        scan_start_y = 0  # 扫描的起始 y 坐标
        im_pixel = im.load()
        # 以 50px 步长,尝试探测 scan_start_y
        for i in range(int(h / 3), int(h*2 / 3), 50):
            last_pixel = im_pixel[0, i]
            for j in range(1, w):
                pixel = im_pixel[j, i]
                # 不是纯色的线,则记录 scan_start_y 的值,准备跳出循环
                if pixel != last_pixel:
                    scan_start_y = i - 50
                    break
            if scan_start_y:
                break
        print('scan_start_y: {}'.format(scan_start_y))
    
        # 从 scan_start_y 开始往下扫描,棋子应位于屏幕上半部分,这里暂定不超过 2/3
        for i in range(scan_start_y, int(h * 2 / 3)):
            # 横坐标方面也减少了一部分扫描开销
            for j in range(scan_x_border, w - scan_x_border):
                pixel = im_pixel[j, i]
                # 根据棋子的最低行的颜色判断,找最后一行那些点的平均值,这个颜
                # 色这样应该 OK,暂时不提出来
                if (50 < pixel[0] < 60) 
                        and (53 < pixel[1] < 63) 
                        and (95 < pixel[2] < 110):
                    piece_x_sum += j
                    piece_x_c += 1
                    piece_y_max = max(i, piece_y_max)
    
        if not all((piece_x_sum, piece_x_c)):
            return 0, 0, 0, 0
        piece_x = int(piece_x_sum / piece_x_c)
        piece_y = piece_y_max - piece_base_height_1_2  # 上移棋子底盘高度的一半
    
        # 限制棋盘扫描的横坐标,避免音符 bug
        if piece_x < w/2:
            board_x_start = piece_x
            board_x_end = w
        else:
            board_x_start = 0
            board_x_end = piece_x
    
        for i in range(int(h / 3), int(h * 2 / 3)):
            last_pixel = im_pixel[0, i]
            if board_x or board_y:
                break
            board_x_sum = 0
            board_x_c = 0
    
            for j in range(int(board_x_start), int(board_x_end)):
                pixel = im_pixel[j, i]
                # 修掉脑袋比下一个小格子还高的情况的 bug
                if abs(j - piece_x) < piece_body_
                    continue
    
                # 修掉圆顶的时候一条线导致的小 bug,这个颜色判断应该 OK,暂时不提出来
                if abs(pixel[0] - last_pixel[0]) 
                        + abs(pixel[1] - last_pixel[1]) 
                        + abs(pixel[2] - last_pixel[2]) > 10:
                    board_x_sum += j
                    board_x_c += 1
            if board_x_sum:
                board_x = board_x_sum / board_x_c
        last_pixel = im_pixel[board_x, i]
    
        # 从上顶点往下 +274 的位置开始向上找颜色与上顶点一样的点,为下顶点
        # 该方法对所有纯色平面和部分非纯色平面有效,对高尔夫草坪面、木纹桌面、
        # 药瓶和非菱形的碟机(好像是)会判断错误
        for k in range(i+274, i, -1):  # 274 取开局时最大的方块的上下顶点距离
            pixel = im_pixel[board_x, k]
            if abs(pixel[0] - last_pixel[0]) 
                    + abs(pixel[1] - last_pixel[1]) 
                    + abs(pixel[2] - last_pixel[2]) < 10:
                break
        board_y = int((i+k) / 2)
    
        # 如果上一跳命中中间,则下个目标中心会出现 r245 g245 b245 的点,利用这个
        # 属性弥补上一段代码可能存在的判断错误
        # 若上一跳由于某种原因没有跳到正中间,而下一跳恰好有无法正确识别花纹,则有
        # 可能游戏失败,由于花纹面积通常比较大,失败概率较低
        for j in range(i, i+200):
            pixel = im_pixel[board_x, j]
            if abs(pixel[0] - 245) + abs(pixel[1] - 245) + abs(pixel[2] - 245) == 0:
                board_y = j + 10
                break
    
        if not all((board_x, board_y)):
            return 0, 0, 0, 0
        return piece_x, piece_y, board_x, board_y
    
    def auto_jump(frame):
        x1,y1,x2,y2=find_piece_and_board(PIL.Image.open('screen.png'))
        coor=[]
        global need_update
        coor.append((x1,y1))
        coor.append((x2,y2))
        jump_to_next(coor.pop(), coor.pop())
        need_update = True
        global need_update
        if need_update:
            time.sleep(1)
            axes_image.set_array(get_screen_image())
            need_update = False
        return axes_image,
    figure = plt.figure(u'跳一跳辅助') #创建一个空白的图片对象、创建一张图片
    axes_image = plt.imshow(get_screen_image(), animated=True)#把获取的图片画在坐标轴上
    
    #figure.canvas.mpl_connect('button_press_event', on_calck)
    #figure.canvas.mpl_connect('button_press_event', auto_jump)
    #ani = FuncAnimation(figure, update_screen, interval=50, blit=True)
    ani = FuncAnimation(figure, auto_jump, interval=50, blit=True)
    plt.show()
    跳一跳辅助源码

    自动跳有时候也会掉下来,不知道是怎么回事。github上好像还有一个用图像识别做的。有时间可以看一下。应该没有时间了。

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/8407430.html
Copyright © 2011-2022 走看看