解讀跳一跳「外掛」背後的算法

目前大熱的微信小遊戲“跳一跳”令很多人趨之若鶩,更有腦洞大開的愛好者開發出了各種“外掛”。今天,小編就為您解讀一下這些“神奇”的“外掛”背後的算法。

解读跳一跳“外挂”背后的算法

常規思路

找到棋子的x,y

找到目標平臺中心點的x,y

計算兩點像素距離(橙色)

按壓時間 = 距離 × 係數

缺點:這個方法得到的結果是直線的像素距離,於是不同屏幕尺寸下,感官上相同的跳躍距離,像素距離確是不同的,這就需要手動設置不同係數(一大堆的congif)。

那麼能不能更直觀地設置跳躍所需要的時間呢?

解读跳一跳“外挂”背后的算法

1.UI自適應

實測 4:3/16:9/2:1 三類屏幕比例,得到如下結果。

遊戲內UI

遊戲主畫面按寬度適配,垂直居中。

其他界面元素四角定位,比如關閉右上角,分數左上角。

這裡是一個重要信息,遊戲主畫面是根據寬度縮放的。

再來一局

核心UI是16:9,然後fit到窗口。

這樣就能找準按鈕的位置了。

解读跳一跳“外挂”背后的算法

2.簡化方案

從絕對距離到比例關係

根據我們上一節提到的寬度適配原則。

假設兩個方塊離得非常遠,剛好斜著隔開整個屏幕,跳躍時間假設是1秒。

那麼如果把目標平臺移近一半,那跳躍需要時間是不是就是0.5秒呢?

也就是說 把跳躍距離,從像素的絕對距離,轉化為相對的比例關係。

從斜邊到鄰邊

另外,因為遊戲視角固定。

所以斜邊的比例關係,可以用X軸的水平的比例關係替代。

那麼,跳躍距離就轉化為起點到目標的水平距離和屏幕寬度的正比例關係。

不再需要獲取Y軸位置。

那麼,接下來總結一下公式吧。

按壓時間=跳全屏寬度需要的時間× (起點和目標的橫向距離/屏幕寬度)

distanceX = abs(board_x-piece_x) #起點到目標的水平距離

shortEdge = min(im.size) #屏幕寬度

jumpPercent = distanceX/shortEdge #跳躍百分比

jumpFullWidth = 1700 #跳過整個寬度 需要按壓的毫秒數

press_time = round(jumpFullWidth*jumpPercent) #按壓時長

優點:省略了所有 Y 軸的取值,並且自適應所有設備。(實測 4:3/16:9/2:1都成功。原方案的所有配置文件都不需要了。)

解读跳一跳“外挂”背后的算法解读跳一跳“外挂”背后的算法

圖為X、Y軸座標的測算

3.誤差的估算

上一次從另一個方向跳過來且未落在中心

可能下次起跳位置需要修正(紫色)

不過誤差並不大,除非當前格子很大。

加上還有模擬器卡頓或者其他細微的影響,所以這點偏移基本忽略,目前沒有看到方案適配這個。

之所以不必糾結誤差,因為即使每次偏移中心10%,不考慮平臺大小,也要連續累積10次才會掉落。

也就是棋子要往一個方向跳10次,概率(1/2)^(10-1)=1/512,其實很低的。

實際過程中,由於終端性能造成的延遲對分數影響更大,所以,我們依賴性能更高的終端來運算。因此,我們看到的很多朋友們都用PC來運行腳本並用控制手機進行遊戲。

解读跳一跳“外挂”背后的算法
解读跳一跳“外挂”背后的算法


分享到:


相關文章: