美文网首页程序员@IT·互联网
用 Lua 实现微信跳一跳辅助

用 Lua 实现微信跳一跳辅助

作者: 小狐狸的后花园 | 来源:发表于2018-01-04 18:06 被阅读0次

    开发环境

    电脑:Windows 或 Mac
    软件:Lua 编辑器、抓色器(可以在官网下载)
    手机:触动精灵(iOS 或者安卓都可以)

    工作原理

    抓色器远程连接手机截图,找到坐标点和颜色值,作业部落上有使用教程。(https://www.zybuluo.com/miniknife/note/629913)。
    通过 Lua 实现模拟点击

    网上分享的帖子不管是 python 还是其他语言基本都是安卓平台的,其实 iOS 也可以用 Lua 模拟点击实现跳一跳自动辅助。
    前提是你的 iPhone 越狱了。

    步骤:

    • 安装抓色器(用来截图取点)
    • 越狱手机添加源:apt.touchsprite.com,安装触动精灵
    • 在手机上截取跳一跳界面,也可以用抓色器远程截图:打开触动更多界面的局域网广播开关,手机和电脑在同一局域网就可以
    • 在抓色器上打开截图,鼠标放到小人的底部中心点,同时按下 CTRL 和鼠标,在周围也取两个点 抓色器
    • 生成代码,插入到下面的代码中(可以用触动精灵的编辑器,远程调试比较方便)
    • 编辑器设备标签页搜索连接设备(也要在同一个局域网),打开脚本点击远程运行(需要提前进入游戏界面)


      编辑器

    代码:

    local screenWidth, screenHeight= getScreenSize();--获取屏幕分辨率
    local distanceTimeRate = 1.15--按压时间与距离的系数,数字越大表示蓄力时间越长,当前为 6P 的系数local
    local targetPositionOffset = screenHeight * 0.012--表示方块最上方的点,距离中心点的偏移
    
    function Touch(x, y, millsSecond)
        touchDown(x, y)
        mSleep(millsSecond)
        touchUp(x, y)
    end
    
    function main()
    --  dialog("请在3秒内打开游戏,并点击开始按钮", 0);
        mSleep(1000)
        DoLoop()
    end
    
    function DoLoop()
        while true do 
            keepScreen(true);  
            if DoJump() == false then
                keepScreen(false); 
                break
            end
            keepScreen(false); 
            mSleep(2000)
        end
    end
    
    function DoJump() 
        local x, y = GetCalcSelfPosition()
        if x == -1 or x == 0 then
            return false
        end
        local endX = screenWidth-3  -- 1080 1920
        local endY = screenHeight * 0.7
        local startX = 0
        local startY = screenHeight * 0.2
    
        if x < screenWidth / 2 then
            startX =  screenWidth / 2
        else
            endX = screenWidth / 2
        end
        
        local targetX, targetY = GetTargetPosition(startX, startY, endX, endY)
        local distance = math.sqrt( (x - targetX) * (x - targetX) + (y - targetY) * (y - targetY) )
        local pressTime = CalcHoldTime(distance)
        Touch(100,100, pressTime)
        return true
    end
    
    function GetCalcSelfPosition()
        x,y = findMultiColorInRegionFuzzy( 0x373860, "-2|-214|0x34353d,-42|-2|0x2b2b49,40|-4|0x393550", 98, 0, 0, screenWidth, screenHeight) -- 6p
    --  x,y = findMultiColorInRegionFuzzy( 0x38365e, "-16|-6|0x35335a,13|-5|0x39375f", 98, 0, 0, screenWidth, screenHeight)
        return x, y
    end
    
    function GetTargetPosition(startX, startY, endX, endY)
        local step = 3
        local r, g, b, rr, gg, bb 
        for y = startY , endY, step do
            r, g, b = getColorRGB(1, y)
            for x = startX, endX , step do
                rr, gg, bb  = getColorRGB(x, y)
                if isColor(r, g, b, rr, gg, bb, 98)  then
                    r = rr
                    g = gg
                    b = bb
                else
                    return x, y + targetPositionOffset
                end
            end
        end
        return -1, -1
    end
    
    function isColor(rr, gg, bb, r, g, b ,s) 
        local fl,abs = math.floor,math.abs
        s = fl(0xff*(100-s)*0.01)
        if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
            return true
        end
        return false
    end
    
    function CalcHoldTime(distance)
        return distance * distanceTimeRate
    end
    
    main()
    

    如果脚本跑的并不准确,可以修改参数
    distanceTimeRate:数字越大表示蓄力时间越长
    targetPositionOffset:表示方块最上方的点,距离中心点的偏移
    如果还是不行的话,那就算了吧...

    思路

    1. 确定自己的当前位置
      直接查找像素就可以了
    2. 确定目标点位置
      可以通过自己当前的位置判断一个大致的范围。
      然后通过从左上,到右下角,依次遍历像素。找到方块最上方的像素点。
      然后把y + 上一个大概的值来确定。
    3. 距离与时间转换
      游戏的公式是线性的,直接乘以系数就可以了

    需要优化的点

    1. 并没有去精确的识别位置
    2. sleep 函数并不精确,需要一个更加精确的方式来控制
    3. 不同分辨率的屏幕,并没有做完美的适配,需要各自截图取小人底部的坐标
    4. 距离时间的比率,不应该粗暴的用一个值去控制,应该用两个值去分别乘以x,y的距离,然后再算距离(这得看游戏画面本身的屏幕适配是如何做的)
    5. 性能差的机型,跑得并不稳定(我用红米2,跑了大概10次,最高跑到2000多分,最低只跑了几百分),这有一部分是因为“优化点 1”导致的。

    本文源码和原理参考自知乎 xtutu

    相关文章

      网友评论

        本文标题:用 Lua 实现微信跳一跳辅助

        本文链接:https://www.haomeiwen.com/subject/yufdnxtx.html