Помощь в создании скрипта.

Помощь в написании скриптов для игр.
AKUDA
Posts: 1
Joined: 13 Mar 2024, 02:09

Помощь в создании скрипта.

13 Mar 2024, 02:19

Здравствуйте всем, у меня есть одна проблемка, сам скрипт находиться чуть ниже. У меня есть соперник который нажимает поочередно стрелки, в самом начале их 2, после чего он ждет пока я их повторю, далее идут 3 стрелки и тд. до 6 стрелок. Когда стрелки загораются - становятся белыми. Скрипт работал бы идеально если бы не одно но, если соперник нажмет одну и ту же кнопку быстрее чем за 3.6 секунды - у меня нажмется стрелка только 1 раз, но без задержки тоже быть ни как, потому что мне нужно подождать пока соперник нажмет все кнопки. Что подскажете делать?

Code: Select all

Y::
Loop {
PixelGetColor, color1, 1271, 368
PixelGetColor, color2, 1404, 501
PixelGetColor, color3, 1283, 631
PixelGetColor, color4, 1140, 500

If (color1 = 0xFFFFFF) {
Sleep, 3600
SendInput, {w down}
sleep, 50
SendInput, {w up}
}
If (color2 = 0xFFFFFF) {
Sleep, 3600
SendInput, {d down}
sleep, 50
SendInput, {d up}
}
If (color3 = 0xFFFFFF) {
Sleep, 3600
SendInput, {s down}
sleep, 50
SendInput, {s up}
}
If (color4 = 0xFFFFFF) {
Sleep, 3600
SendInput, {a down}
sleep, 50
SendInput, {a up}
}
Sleep, 400 ; Пауза между проверками цветов
}
return
[Mod edit: + [code][/code] tags.]
mcl
Posts: 357
Joined: 04 May 2018, 16:35

Re: Помощь в создании скрипта.

14 Mar 2024, 17:04

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]
github://oGDIp - GDI+ wrapper for AHK v1.1

Return to “Скрипты для Игр”

Who is online

Users browsing this forum: No registered users and 37 guests