基于AutoIT实现游戏按钮点击序列复刻的技术求助
记忆游戏自动复刻脚本:后续开发方向与优化方案
你的问题背景
我正在开发一款AutoIT脚本,用来自动复刻一款记忆类游戏的按钮点击序列——系统先展示1次点击,我需要复刻,之后序列长度逐步增加到2、3次等。目前我写了一段代码,但遇到了瓶颈,希望得到后续开发的指导方向。
现有代码
HotKeySet("{F1}", loco) #include <Array.au3> Global $Coords Global $Array[0] Local $Green = 0xFDEA68 ;Clicked Local $Gray = 0xF5F2F0;Clicked Local $RED = 0xD12321A;Clicked 这里有颜色值错误 Local $Blue = 0x55ECD1;Clicked Local $BackGreen = 0xE1183C;Click released Local $BackGray = 0xF0F4F9;Click released Local $BackRed = 0x21968F;Click released Local $BackBlue = 0x66212C;Click released While 1 Do $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $Green) If Not(@Error) Then Sleep(100) While 1 $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $BackGreen) If Not(@Error) Then _ArrayAdd($Array,"Green") ExitLoop EndIf WEnd EndIf $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $Gray) If Not(@Error) Then Sleep(100) While 1 $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $BackGray) If Not(@Error) Then _ArrayAdd($Array,"Gray") ExitLoop EndIf WEnd EndIf $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $RED) If Not(@Error) Then Sleep(100) While 1 $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $BackRed) If Not(@Error) Then _ArrayAdd($Array,"Red") ExitLoop EndIf WEnd EndIf $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $Blue) If Not(@Error) Then Sleep(100) While 1 $Coords = PixelSearch(0, 0, @DesktopWidth - 1, @DesktopHeight - 1, $BackBlue) If Not(@Error) Then _ArrayAdd($Array,"Blue") ExitLoop EndIf WEnd EndIf Sleep(1000) Until StringLen($Coords) > 0 ; 这里逻辑错误,$Coords是数组,StringLen会报错 Local $ArrLen = UBound($Array) For $i = 0 To $ArrLen - 1 ConsoleWrite("Color: " & $Array[$i] & @CRLF) Next ;_ArrayDelete($Array,0:) ; MouseClick("Left",$Coords[0],$Coords[1],1,5) Sleep(1000) WEnd Func loco() Exit 12 EndFunc
先修正现有代码的基础错误
- 颜色值格式错误:
$RED = 0xD12321A是7位十六进制,AutoIT的RGB颜色是6位,改成0xD12321;其他颜色值建议用AutoIT自带的PixelGetColor()工具获取准确值,避免颜色不匹配。 - 循环终止条件错误:
Until StringLen($Coords) > 0中,$Coords是PixelSearch返回的坐标数组,StringLen无法处理数组,会导致脚本异常,需要替换成合理的终止逻辑(比如检测序列长度达标)。
核心后续开发方向
1. 优化像素搜索效率,固定按钮区域
全屏PixelSearch速度极慢,而且容易误判。先手动获取每个按钮的坐标范围(比如绿色按钮左上角(100,200)到右下角(200,300)),把搜索范围限定在对应按钮区域:
; 预先定义每个按钮的搜索区域 Global $btnGreenArea = [100, 200, 200, 300] ; 搜索绿色按钮的按下状态 $Coords = PixelSearch($btnGreenArea[0], $btnGreenArea[1], $btnGreenArea[2], $btnGreenArea[3], $Green)
2. 明确区分「系统展示阶段」和「用户复刻阶段」
现有代码没有区分这两个核心阶段,会导致序列收集和复刻逻辑混乱:
- 新增状态变量:
Global $isDemoPhase = True,系统展示序列时设为True,收集序列;展示结束后切换为False,执行复刻。 - 检测展示结束:可以通过等待游戏的固定停顿(比如展示完序列后有1.5秒空白),或者检测界面上的「开始复刻」提示元素。
3. 完善序列复刻的点击逻辑
现在你只是把颜色存入数组,但没有对应到具体按钮的点击操作:
- 预先存储每个按钮的中心点击坐标:
Global $btnGreenPos = [150, 250](取按钮区域的中心) - 遍历序列数组时,根据颜色调用
MouseClick:
For $i = 0 To UBound($Array) - 1 Switch $Array[$i] Case "Green" MouseClick("Left", $btnGreenPos[0], $btnGreenPos[1], 1, 5) Case "Gray" MouseClick("Left", $btnGrayPos[0], $btnGrayPos[1], 1, 5) Case "Red" MouseClick("Left", $btnRedPos[0], $btnRedPos[1], 1, 5) Case "Blue" MouseClick("Left", $btnBluePos[0], $btnBluePos[1], 1, 5) EndSwitch Sleep(Random(300, 700)) ; 模拟人类随机点击间隔,避免被检测 Next
4. 优化序列收集与循环逻辑
- 新增序列长度变量:
Global $sequenceLength = 1,每次收集到对应长度的序列后,切换到复刻阶段。 - 复刻完成后重置数组:
_ArrayDelete($Array, 0),并将$sequenceLength += 1,进入下一轮系统展示。
5. 增加容错与错误处理
- 给
PixelSearch添加超时逻辑,避免脚本无限等待:比如用TimerInit()和TimerDiff()判断搜索超时。 - 处理数组为空的情况,避免遍历空数组报错。
内容的提问来源于stack exchange,提问作者OhadH
相关产品推荐
相关产品推荐

