以滑鼠位置為圓心一圈圈往外點的掃怪腳本,v2 版可以直接用。附舊 v1 版本,以及它的圓其實從來沒畫出來過的原因。
發布於 2026-09-04・約 5 分鐘
掛機打怪的腳本:按 F9,以滑鼠當下的位置為圓心,一圈一圈往外點滑鼠中鍵去撿目標,掃完十圈回到原點再重來。F10 停止。
複製存成 .ahk 就能跑。
.ahk
⚠ 自動練功腳本違反絕大多數線上遊戲的服務條款,帳號被停權是常態不是意外。這篇的重點在 AutoHotkey 的寫法,用不用是你的事。
#Requires AutoHotkey v2.0 #SingleInstance Force SetMouseDelay 1 ; 用螢幕座標,不然座標會跟著「當下哪個視窗在前景」跑掉 CoordMode "Mouse", "Screen" startRadius := 70 ; 第一圈半徑(像素) ringStep := 25 ; 每圈往外擴幾像素 rings := 10 ; 擴散幾圈後回到原點 pointsPerRing := 24 ; 每圈點幾下 PI := 4 * ATan(1) ; AutoHotkey 沒有內建的 pi 常數 scanning := false F9:: { global scanning if scanning return ; 已經在跑就別再開一輪 scanning := true MouseGetPos &originX, &originY Loop rings { if !scanning break r := startRadius + (A_Index - 1) * ringStep Loop pointsPerRing { if !scanning break angle := (A_Index - 1) * 2 * PI / pointsPerRing MouseClick "Middle", Round(originX + r * Cos(angle)), Round(originY + r * Sin(angle)) } } MouseMove originX, originY ; 回到起點 scanning := false } F10:: { global scanning scanning := false ; 讓正在跑的迴圈自己收掉 }
上面那五個變數就是你要動的全部,其他都不用碰。
startRadius
ringStep
rings
pointsPerRing
SetMouseDelay
攻擊鍵不是滑鼠中鍵的話,把 MouseClick "Middle", … 換成 "Left" 或 "Right";如果是鍵盤技能,把整行換成 MouseMove 移過去再 Send "1" 之類。
MouseClick "Middle", …
"Left"
"Right"
MouseMove
Send "1"
F10 不是重載整支腳本,是翻一個旗標讓迴圈自己停。熱鍵按下時會開新執行緒插隊執行,所以跑到一半也停得掉。
F10
原本的版本是 v1 語法,而且它從來沒有畫過圓。我用了十年才發現,因為 v1 把兩個錯誤都吞掉了。
; ⚠ v1.1 語法,而且數學是壞的,放在這裡只是留個對照 setmousedelay,1 nu=70 ; 起始範圍 F9:: MouseGetPos, xpos, ypos loop { MouseMove %xpos%,%ypos% mousegetpos,objx,objy loop,10 ; 擴散圈數 { gosub,up gosub,left gosub,down gosub,right i++ } i=0 } up: j=%nu% loop,%i% { tmp:=j tmp*=j ; tmp = j*j newx:=i newx*=i ; newx = i*i newx-=tmp ; newx = i*i - j*j newx:=sqrt(newx) newx+=objx newy=%objy% newy-=j click,middle,%newx%,%newy% j++ } return ; left / down / right 是同樣的東西換個軸,略
想法是圓的方程式:半徑 i、垂直位移 j,水平位移就是 sqrt(i² − j²)。
i
j
sqrt(i² − j²)
問題一:半徑永遠比位移小。 i 是圈數(1 到 10),j 的起點是 nu = 70。所以 i*i - j*j 是 1 − 4900、4 − 4900⋯⋯永遠是負的。我把「起始半徑」跟「圈數」當成同一個東西在用,但程式裡它們是兩個獨立變數。
nu
i*i - j*j
1 − 4900
4 − 4900
v1 的 Sqrt() 文件寫:If Number is negative, the function yields a blank result (empty string). 負數開根號回空字串,不報錯。接著 newx += objx,空字串在 v1 的算術裡當 0——橫向位移一律是 0。四個方向合起來畫出來的是一個十字,距離永遠卡在 70 到 79 之間,十圈完全沒有擴散。
Sqrt()
newx += objx
問題二:第一輪整個被跳過。 i 從來沒初始化,第一次進內圈時是空字串。v1 的 Loop 文件:If Count is a variable reference such as %ItemCount%, the loop is skipped entirely whenever the variable is blank or contains a number less than 1. 所以第一次按 F9 是完全沒反應的。
Loop
%ItemCount%
同一份數學搬到 v2,Sqrt(-4899) 直接丟 ValueError 中斷腳本。這件事本來很煩,但它是 v2 最值得升級的理由:v1 把「算不出來」跟「算出 0」混成同一個結果。同樣的規則套用在 Log、Ln、ASin、ACos、Mod 除以零——v1 全部回空字串,v2 全部丟例外。舊 v1 腳本如果「有時候怪怪的但大致能動」,很可能就是在吃這種空字串,移植到 v2 是一次免費的健檢。
Sqrt(-4899)
ValueError
Log
Ln
ASin
ACos
Mod
用三角函數,不解圓的方程式。 Cos / Sin 直接給座標,不用處理象限跟定義域,也不會有負數開根號的問題。
Cos
Sin
gosub 四個方向的段落全刪。 原本 up / left / down / right 是同一段抄四次換軸,八十幾行。改成一圈掃 pointsPerRing 個角度之後只剩一個迴圈,而且圈上的取樣是均勻的——原版四個方向的密度本來就不一樣。v2 也沒有 gosub 了。
gosub
MouseClick 而不是 Click。 Click 的參數是一整串字串拼起來的,Click 100 200(中間沒逗號)會變成 Click "100200",滑鼠跑到螢幕外面而且不報錯。MouseClick "Middle", x, y 的參數是分開的,寫錯會直接被擋下來。
MouseClick
Click
Click 100 200
Click "100200"
MouseClick "Middle", x, y
ringStep 獨立出來。 這就是原版真正缺的東西:一個「每圈往外多遠」的參數。原版把它跟 nu 混在一起,所以怎麼調都不會擴散。
標籤:AutoHotkey、遊戲腳本、自動練功、掃怪、Windows