[按鍵精靈教程]學了這個你也能做出穩定的腳本

金豬腳本(原飛豬腳本)以按鍵精靈教學為主,涉及UiBot,Python,Lua等腳本編程語言,教學包括全自動辦公腳本,遊戲輔助腳本,引流腳本,網頁腳本,安卓腳本,IOS腳本,註冊腳本,點贊腳本,閱讀腳本以及網賺腳本等各個領域。想製作腳本和學習按鍵精靈的朋友可以添加按鍵精靈學習交流群:554127455 學習路上不再孤單,金豬腳本伴你一同成長.

[按鍵精靈教程]學了這個你也能做出穩定的腳本

[按鍵精靈教程]學了這個你也能做出穩定的腳本

遊戲吸引人的地方在於他的不確定性,有可能趕路的時候順手幹掉一個野怪,居然爆出了屠龍寶刀(→_→),但是腳本不同,我們希望的是:他能完全按照我們的邏輯進行,就算偏離了後也能自動扭正回來,繼續當前的邏輯。



[按鍵精靈教程]學了這個你也能做出穩定的腳本


腳本的穩定性是所有作者最關心的問題,可能你的腳本能運行1個小時,2個小時,但是由於各種因素,甚至有的並不是因為你腳本的問題而產生的邏輯進行不下去的情況,最典型的例子就是網絡延時的彈窗,當然這個要處理很簡單,因為他屬於可預測的問題(遊戲本身的),只需要在每一個含有聯網操作的地方都加上判定即可(寫一個函數大家一起用)。但是有一類是無法預測的,比如有的遊戲會有全服公告的喇叭,時不時就出現一次,即使他只出現一會也會影響我們的判定,一個判定的錯誤會導致一連串的錯誤,導致遊戲實際狀態和我們邏輯處理到的地方不一致,然後。。。就沒有然後了,等著用戶發現並吐槽你吧。

對於這類型的問題:先來分析一下第一種處理方法----在所有的操作循環中加入判定,看看代碼:

  1. Dim 計數器 = 0
  2. Do
  3. If CmpColorEx("當前界面特徵",0.9)=1 Then
  4. Tap 相應功能的位置
  5. End If
  6. Delay 100
  7. If CmpColorEx("操作之後的界面特徵",0.9)=1 Then
  8. Exit Do
  9. End If
  10. If 計數器 > 50 Then
  11. TracePrint "超時了"
  12. Call 超時處理()
  13. Else
  14. 計數器= 計數器+1
  15. End If
  16. Loop

複製代碼

代碼的功能很簡單,就是一次操作使用的循環,先尋找當前界面你需要點擊的位置(找色比色找圖都行),點擊之後尋找此次操作產生的響應,比如出現彈窗什麼的,然後開始尋找此彈窗特點,尋找到就說明此次操作成功,可以退出此循環,這就是這段代碼的功能,而後面的計數器則是為了防止有一些特殊情況,產生兩個特徵圖都找不到,腳本卡死在這個循環裡,超時之後我們可以在超時處理函數裡做重啟遊戲之類的操作。

分析完了功能之後,我們再來分析一下優缺點,優點顯而易見,基本能處理所有我們預測不到的問題,並且超時時間可以調整,添加的位置很自由,超時的處理方式也可以自己設置。缺點就是工作量大,一個腳本可能含有大量的循環,他們或多或少有點區別,這段代碼沒法複用。

好了,我們再來看看第二種處理方式----多線程檢測,直接看代碼:

  1. Thread.SetShareVar("進度值",0)
  2. Dim 超時 = 8 //秒
  3. Dim 主邏輯線程
  4. Function 主邏輯函數()
  5. Do
  6. Dim 任務時間 = Cint(Rnd()*5)+5
  7. Delay 任務時間 * 1000
  8. Thread.SetShareVar "進度值", Thread.GetShareVar("進度值") + 1
  9. TracePrint "此次任務完成,使用了"&任務時間&"秒,當前進度為:"&Thread.GetShareVar("進度值")&",重新計數"
  10. Loop
  11. End Function
  12. Function 超時處理()
  13. TracePrint "此次任務耗時超過"&超時&"秒,等待5秒後重新啟動,繼續上次的進度"
  14. Thread.Stop (主邏輯線程)
  15. Delay 5000
  16. 主邏輯線程 = Thread.Start(主邏輯函數)
  17. End Function
  18. Function 判斷超時函數()
  19. Dim 判定計數 = 0
  20. Do
  21. Dim 初始進度 = Thread.GetShareVar("進度值")
  22. Delay 1000
  23. If 初始進度 = Thread.GetShareVar("進度值") Then
  24. 判定計數 = 判定計數 + 1
  25. TracePrint "超時計數器:"&判定計數
  26. Else
  27. 判定計數 = 0
  28. End If
  29. If 判定計數 >= 8 Then
  30. 超時處理()
  31. 判定計數 = 0
  32. End If
  33. Loop
  34. End Function
  35. 主邏輯線程 = Thread.Start(主邏輯函數)
  36. Call 判斷超時函數()

複製代碼

使用多線程來做定時,我們需要對任務時間做分析來設定超時時間,上面的代碼中,設置每個任務的時間使用一個隨機延時5-10秒,在多線程檢測中,如果一個任務處理超過8秒,我們就認定這個任務超過了預計的時間,有可能發生問題了(卡在某個地方之類的),那麼我們直接做超時處理。我們來看看處理的結果:


[按鍵精靈教程]學了這個你也能做出穩定的腳本


繼續討論優缺點,優點是處理簡單,通過一個共享變量在遊戲線程中變動,而超時判斷線程中檢測此變動來判定是否卡住,只算單個任務或者全部任務的總耗時,偏差小(一個任務如果偏差1-10秒,當有10種任務時,我們用第一種方式可能會允許100秒的超時,但是實際上平均時間只有50秒,我們計算總耗時可以設定70秒,偏差相對較小,在任務越多,耗時差距越大時候越明顯),缺點就是可控性差,甚至無法針對一個任務中的一部分操作做超時檢測。

兩種方法各有優缺點,用哪種全看你自己的需求和習慣,實在不好決定的話。。。。。兩種一起用吧!不信你的腳本還不穩定!

相關推薦

推薦中...