AKUDA wrote: ↑13 Mar 2024, 02:19
Здравствуйте всем, у меня есть одна проблемка, сам скрипт находится чуть ниже.
Я думаю, стоит переделать логику скрипта (увы, в сторону усложнения).
Сперва следить за действиями противника и записывать их в массив.
Затем, когда станет ясно, что противник завершил все действия – начать воспроизводить свои действия по этому массиву.
Эта сложность даёт определённую гибкость, хоть в вашем случае это, возможно, и не требуется. Например, при определённой доработке можно записывать не только что было нажато, но и как долго, записывать несколько нажатых клавиш одновременно и т.п.
Возможно, есть более элегантное решение вашей проблемы, но найти его, не зная всех деталей, мне не под силу.
Скрипт ниже основан на моих предположениях, поэтому может и вовсе не работать.
Code: Select all
isRecording := true ; если true - записываем действия, если false - воспроизводим
recordedActions := [] ; массив для записи действий
lastActionRecorded := "" ; последнее действие
lastActionTime := A_TickCount ; время последнего действия
Loop {
Sleep 100
If (isRecording == true) {
; записываем, какие стрелки нажаты соперником
newAction := DetectAction()
; если нажаты всё те же, что и в предыдущий раз:
If (newAction == lastActionRecorded)
{
If (newAction == "") ; если соперник ничего не нажимает,
&& ((A_TickCount - lastActionTime) > 3000) ; и уже прошло три секунды,
&& (recordedActions.Length() > 0) ; и у нас есть записанные действия
{
; считаем, что противник завершил свои действия
; и переходим в режим воспроизведения
isRecording := false
}
Continue
}
; записываем новое действие в массив
recordedActions.Push( newAction )
lastActionTime := A_TickCount
Continue
}
; Режим воспроизведения
; извлекаем следующее в очереди действие и нажимаем соответствующую кнопку
currentAction := recordedActions.RemoveAt(1)
; если ничего не было нажато - пропускаем цикл
If (currentAction == "")
Continue
; если нажато несколько клавиш - берём только первую
currentKey := Substr(currentAction, 1, 1)
sendStringDn := "{" . currentKey . " down}"
sendStringUp := "{" . currentKey . " up}"
Sleep, 500
SendInput, % sendStringDn
Sleep, 100
SendInput, % sendStringUp
; если больше действий нет - снова переходим в режим записи
If (recordedActions.Length() == 0)
{
isRecording := true
}
}
; Функция возвращает строку с нажатыми соперником клавишами,
; или пустую строку, если соперник ничего не нажимает.
DetectAction() {
pressedKeys := "" ; отмечаем нажатые стрелки соответствующими им клавишами
PixelGetColor, color1, 1271, 368
PixelGetColor, color2, 1404, 501
PixelGetColor, color3, 1283, 631
PixelGetColor, color4, 1140, 500
If (color1 == 0xFFFFFF)
pressedArrows .= "w"
If (color2 == 0xFFFFFF)
pressedArrows .= "d"
If (color3 == 0xFFFFFF)
pressedArrows .= "s"
If (color4 == 0xFFFFFF)
pressedArrows .= "a"
Return pressedKeys
}
[code]