1 (изменено: kostos97, 2018-10-23 23:08:41)

Тема: Случайный выбор ГК из определенного массива чисел.

Добрый день. Пытаюсь сделать макрос для PoE.

Есть массив, содержащий 5 значений [5, 6, 7, 8, 9].

Изначальная цель стоит следующая: при нажатии клавиши R выполняется эмуляция нажатия клавиш клавиатуры 5, 6, 7, 8, 9 в случайном порядке, со случайной задержкой в каком то интервале. При этом необходимо чтобы при одном нажатии R не было повторений нажатий клавиш, т.е. за одно нажатие R будет произведено 5 нажатий клавиш [5..9] без повторений.

Как у совсем зеленого человека в кодинге возникло несколько вопросов, а именно:

1) Где использовать Return (подсмотрел пару кодов на ahk, расположение return в коде для меня не очень понятно)?

2) Как, с учетом условия реализовать данную задачу? Попробовал накатать скрипт, но он не заработал.



Random, Rand1, 50, 150
l_V1 := 0
l_V2 := 0
l_V3 := 0

R::

IfWinActive Path of Exile ahk_class POEWindowClass {

WinActivate

while (l_V1 < 5) { 

Random, Rand2, 5, 9

l_V2 := Rand2
if l_V3 = l_V2
break

else

SendInput l_V2
Sleep Rand1
l_V1 := l_V1+1
l_V3 =: Rand2

}

return 

2 (изменено: stealzy, 2018-10-24 19:56:16)

Re: Случайный выбор ГК из определенного массива чисел.

Return используете когда хотите закончить последовательность. Попробуйте что-нибудь попроще сначала чтобы освоиться и аккуратнее со скобками.

3 (изменено: kostos97, 2018-10-24 15:18:55)

Re: Случайный выбор ГК из определенного массива чисел.

Немного подправил код:


l_V1 := 1 ;Переменная - счетчик
l_V2 := 0 ;Переменная для случайной ГК
l_M := [] ;Массив уже имеющихся значений

R::

IfWinActive Path of Exile ahk_class POEWindowClass {

WinActivate

while (l_V1 < 6) { 

Random, Rand1, 100, 200
Random, Rand2, 5, 9
l_V2 := Rand2

if (l_M[l_V1-1] = l_V2)  
	continue 
	
SendInput %l_V2%
Sleep Rand1

l_V1 := l_V1+1
l_M[l_V1-1] := l_V2 

} 

На данный момент происходит сравнение значение только с предыдущим, а нужно со всеми.

Главный вопрос - как сравнить все уже имеющиеся значения в массиве со значением переменной т.е. как узнать что значение переменной l_V2 уже есть в массиве l_M?

4 (изменено: kostos97, 2018-10-24 17:50:50)

Re: Случайный выбор ГК из определенного массива чисел.

Код подправил, теперь работает, но используется при этом GoTo.

Прошу проконсультировать про возможные альтернативы GoTo в данном контексте, а так же, возможно, другие версии как это можно было реализовать.


l_V1 := 1 ;Переменная - счетчик
l_V2 := 0 ;Переменная для случайной ГК
l_M := [] ;Массив уже имеющихся значений

R::

;IfWinActive Path of Exile ahk_class POEWindowClass {

;WinActivate

while (l_V1 < 6) 
{ 
Again:

Random, Rand1, 100, 200
Random, Rand2, 5, 9
l_V2 := Rand2

l_V3 := l_V1 ;Переменная - обратный счетчик

while (l_V3 > 0) 
{
	if (l_M[l_V3] != l_V2) 
	{
		l_V3 := l_V3 - 1		
		continue 
	}
	else 
	{ 
	GoTo Again
	}
}
	
SendInput %l_V2%
Sleep Rand1

l_V1 := l_V1 + 1
l_M[l_V1-1] := l_V2 
} 

5

Re: Случайный выбор ГК из определенного массива чисел.

#IfWinActive Path of Exile ahk_class POEWindowClass
R::
...
Return
a := [1, 2, 3, 4, 5]
a := shuffle(a)
shuffle(a) {
	i := a.MaxIndex()
	While (i > 0) {
		Random j, 1, i
		x := a[i]
		a[i] := a[j]
		a[j] := x
		--i
	}
	Return a
}

6 (изменено: kostos97, 2018-10-24 22:30:36)

Re: Случайный выбор ГК из определенного массива чисел.

Еще вопросик: после выполнения скрипт останавливается, т.е. я нажимаю R, после чего скрипт выполняется, но если нажать R во второй раз, то ничего не происходит, немного не понимаю как это реализуется.

И тем не менее при указании #IfWinActive Path of Exile ahk_class POEWindowClass буква R продолжает восприниматься и без запущенного окна игры, в чем причина, тоже не очень понимаю.

7

Re: Случайный выбор ГК из определенного массива чисел.

1) Значит какая-то переменная у вас изменилась после первого раза.
2) Так в этом и смысл — чтобы горячая клавиша работала только в игре.