微信跳一跳

作者: 菜鸟H | 来源:发表于2018-04-12 19:38 被阅读0次

    代码

    init(0, 0)

    local screenWidth, screenHeight= getScreenSize();

    local distanceTimeRate = 1.32

    local targetPositionOffset = screenHeight * 0.013

    function Touch(x, y, milliSecond)

        touchDown(x, y)

        mSleep(milliSecond)

        touchUp(x, y)

    end

    function main()

    dialog("请在5秒内打开游戏,并点击开始按钮", 0);

    mSleep(5000)

    DoLoop()

    end

    function DoLoop()

    for i = 1, 1000 do

      keepScreen(true); 

      if DoJump() == false then

      keepScreen(false);

      break

      end

      keepScreen(false);

      mSleep(2500)

    end

    end

    function DoJump()

    local x, y = GetCalcSelfPosition()

    if x == -1 or x == 0 then

      return false

    end

    local endX = screenWidth -- 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( 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.距离与时间转换

    游戏的公式是线性的,直接乘以系数就可以了

    使用方法

    **必备条件:root了的android手机**

    Android手机安装触动精灵

    左上角Wifi传输

    复制上述代码(直接手机新建脚本复制,会导致代码格式变乱,没法运行,得通过电脑wifi传输等方式来传输!脚本放在目录TouchSprite/lua/下,文件名可以取为main.lua)

    勾选该脚本

    点击右侧菜单,点击立即运行(按照提示进行即可)

    需要优化的点

    0. 并没有去精确的识别位置

    1. sleep函数并不精确,需要一个更加精确的方式来控制

    2. 不同分辨率的屏幕,并没有做完美的适配(我的是1080 * 1920)

    3. 距离时间的比率,不应该粗暴的用一个值去控制,应该用两个值去分别乘以x,y的距离,然后再算距离(这得看游戏画面本身的屏幕适配是如何做的)

    4. 性能差的机型,跑得并不稳定(我用红米2,跑了大概10次,最高跑到2000多分,最低只跑了几百分),这有一部分是因为“优化点 1”导致的。

    5. ...

    其它的方式:

    除了手动模拟操作,应该还可以直接截取网络请求,通过篡改分数来达到目的。

    (不过感觉这样做的话,就没有了好看的视觉效果...)

    相关文章

      网友评论

        本文标题:微信跳一跳

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