You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

先修正现有代码的基础错误

  1. 颜色值格式错误:$RED = 0xD12321A是7位十六进制,AutoIT的RGB颜色是6位,改成0xD12321;其他颜色值建议用AutoIT自带的PixelGetColor()工具获取准确值,避免颜色不匹配。
  2. 循环终止条件错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:07:32