金豬腳本(原飛豬腳本)以按鍵精靈教學為主,涉及UiBot,Python,Lua等腳本編程語言,教學包括全自動辦公腳本,遊戲輔助腳本,引流腳本,網頁腳本,安卓腳本,IOS腳本,註冊腳本,點贊腳本,閱讀腳本以及網賺腳本等各個領域。想製作腳本和學習按鍵精靈的朋友可以添加按鍵精靈學習交流群:554127455 學習路上不再孤單,金豬腳本伴你一同成長.
遊戲吸引人的地方在於他的不確定性,有可能趕路的時候順手幹掉一個野怪,居然爆出了屠龍寶刀(→_→),但是腳本不同,我們希望的是:他能完全按照我們的邏輯進行,就算偏離了後也能自動扭正回來,繼續當前的邏輯。
腳本的穩定性是所有作者最關心的問題,可能你的腳本能運行1個小時,2個小時,但是由於各種因素,甚至有的並不是因為你腳本的問題而產生的邏輯進行不下去的情況,最典型的例子就是網絡延時的彈窗,當然這個要處理很簡單,因為他屬於可預測的問題(遊戲本身的),只需要在每一個含有聯網操作的地方都加上判定即可(寫一個函數大家一起用)。但是有一類是無法預測的,比如有的遊戲會有全服公告的喇叭,時不時就出現一次,即使他只出現一會也會影響我們的判定,一個判定的錯誤會導致一連串的錯誤,導致遊戲實際狀態和我們邏輯處理到的地方不一致,然後。。。就沒有然後了,等著用戶發現並吐槽你吧。
對於這類型的問題:先來分析一下第一種處理方法----在所有的操作循環中加入判定,看看代碼:
- Dim 計數器 = 0
- Do
- If CmpColorEx("當前界面特徵",0.9)=1 Then
- Tap 相應功能的位置
- End If
- Delay 100
- If CmpColorEx("操作之後的界面特徵",0.9)=1 Then
- Exit Do
- End If
- If 計數器 > 50 Then
- TracePrint "超時了"
- Call 超時處理()
- Else
- 計數器= 計數器+1
- End If
- Loop
複製代碼
代碼的功能很簡單,就是一次操作使用的循環,先尋找當前界面你需要點擊的位置(找色比色找圖都行),點擊之後尋找此次操作產生的響應,比如出現彈窗什麼的,然後開始尋找此彈窗特點,尋找到就說明此次操作成功,可以退出此循環,這就是這段代碼的功能,而後面的計數器則是為了防止有一些特殊情況,產生兩個特徵圖都找不到,腳本卡死在這個循環裡,超時之後我們可以在超時處理函數裡做重啟遊戲之類的操作。
分析完了功能之後,我們再來分析一下優缺點,優點顯而易見,基本能處理所有我們預測不到的問題,並且超時時間可以調整,添加的位置很自由,超時的處理方式也可以自己設置。缺點就是工作量大,一個腳本可能含有大量的循環,他們或多或少有點區別,這段代碼沒法複用。
好了,我們再來看看第二種處理方式----多線程檢測,直接看代碼:
- Thread.SetShareVar("進度值",0)
- Dim 超時 = 8 //秒
- Dim 主邏輯線程
- Function 主邏輯函數()
- Do
- Dim 任務時間 = Cint(Rnd()*5)+5
- Delay 任務時間 * 1000
- Thread.SetShareVar "進度值", Thread.GetShareVar("進度值") + 1
- TracePrint "此次任務完成,使用了"&任務時間&"秒,當前進度為:"&Thread.GetShareVar("進度值")&",重新計數"
- Loop
- End Function
- Function 超時處理()
- TracePrint "此次任務耗時超過"&超時&"秒,等待5秒後重新啟動,繼續上次的進度"
- Thread.Stop (主邏輯線程)
- Delay 5000
- 主邏輯線程 = Thread.Start(主邏輯函數)
- End Function
- Function 判斷超時函數()
- Dim 判定計數 = 0
- Do
- Dim 初始進度 = Thread.GetShareVar("進度值")
- Delay 1000
- If 初始進度 = Thread.GetShareVar("進度值") Then
- 判定計數 = 判定計數 + 1
- TracePrint "超時計數器:"&判定計數
- Else
- 判定計數 = 0
- End If
- If 判定計數 >= 8 Then
- 超時處理()
- 判定計數 = 0
- End If
- Loop
- End Function
- 主邏輯線程 = Thread.Start(主邏輯函數)
- Call 判斷超時函數()
複製代碼
使用多線程來做定時,我們需要對任務時間做分析來設定超時時間,上面的代碼中,設置每個任務的時間使用一個隨機延時5-10秒,在多線程檢測中,如果一個任務處理超過8秒,我們就認定這個任務超過了預計的時間,有可能發生問題了(卡在某個地方之類的),那麼我們直接做超時處理。我們來看看處理的結果:
繼續討論優缺點,優點是處理簡單,通過一個共享變量在遊戲線程中變動,而超時判斷線程中檢測此變動來判定是否卡住,只算單個任務或者全部任務的總耗時,偏差小(一個任務如果偏差1-10秒,當有10種任務時,我們用第一種方式可能會允許100秒的超時,但是實際上平均時間只有50秒,我們計算總耗時可以設定70秒,偏差相對較小,在任務越多,耗時差距越大時候越明顯),缺點就是可控性差,甚至無法針對一個任務中的一部分操作做超時檢測。
兩種方法各有優缺點,用哪種全看你自己的需求和習慣,實在不好決定的話。。。。。兩種一起用吧!不信你的腳本還不穩定!