2015-08-21 1 views
1

Я пытаюсь создать сценарий AHK, который будет вводить случайное оскорбление всякий раз, когда я набираю «diss». Однако на данный момент все, что я получаю каждый раз, когда я набираю «diss», это «Array [rand]».Случайная отправка массива в AutoHotKey

Что я делаю неправильно?

Array:= Object() 

Loop, Read, C:\Users\dell\Desktop\insults.txt 
{ 
    Array.Insert(A_LoopReadLine) 
} 


::diss:: 
Random, rand, 0, 3 
Send, Array[rand] 
Return 
+0

Ваш код действительно работает, если вы используете последнюю версию AHK от http://ahkscript.org/ –

ответ

2

Deceiving_Solicitite технически правильно ... но я не чувствую, что он объяснил свой код очень хорошо и честно код в Хишам просто написано лучше, даже если это не так (только 2 мелких деталей). Теперь, когда это было сказано, можно перейти к кодированию.

Первый вопрос, который выдается мне, - это ваша команда отправки. Позволяет попытаться изменить Send, Array[rand] к Send % Array[rand] и теперь код работает большую часть времени ...

Но что это значит?

Отметьте % знак? То, что это делает, - принудительное выражение для команды, которая обычно не оценивает выражения. Массивы/объекты рассматриваются как таковые в AHK, и Command's не узнает их.

Это еще не объясняет, почему код только «работает большую часть времени ...»

Ну как выясняется, есть также небольшая проблема с случайными числами он порождающее. При введении значений в массив они индексируются постепенно, начиная с 1, и его случайное число иногда приводит к нулю. Таким образом, мы изменим эту строку теперь с Random, rand, 1, 3, на этом этапе код фиксируется и работает% 100 времени.

Но что, если он хочет иметь больше оскорблений, чем 3? Должен ли он пройти через и подсчитать каждую строку и внести поправки в свою команду Random?

Это было бы глупо, так как мы можем заставить компьютер сделать это для нас, поскольку он намного быстрее при подсчете строк текста, чем мы.Таким образом, мы просто будем иметь результаты случайных результатов от 1 до Max Index нашего массива так: Random, rand, 1, % Array.MaxIndex(). Обратите внимание на%? Мы снова принуждаем команду к оценке и выражению. Аккуратно?

Завершенный код:

Array:= Object() 

Loop, Read, C:\Users\dell\Desktop\insults.txt 
{ 
    Array.Push(A_LoopReadLine) 
} 

::diss:: 
Random, rand, 1, % Array.MaxIndex() 
Send % Array[rand] 
Return 

Я надеюсь, что вы узнали из этого.

Редактировать: Изменен Array.Insert(), deprecated, to Array.Push().

+1

Спасибо, Это очень помогло мне :) –

+0

Добро пожаловать. Счастливое кодирование! – errorseven

0

вы забыли установить имя массива в precent знаков ->%A_index%

fileread,contents,C:\Users\dell\Desktop\insults.txt 

Loop, parse, contents, `n, `r 
{ 
array%a_index% := A_LoopField 

} 

return 


::diss:: 


Random, rand, 1, 3 
tosend = array%rand% 
tosend = % %tosend% 
Send, %tosend% 
Return 

фиксированные mutliple вещи ..

1.try читать в переменные

2 .arrays могут использоваться как имена переменных

3.Возвращаемые имена могут содержать переменные

Сообщить о возврате, если мой код работает для вас, и если вы его понимаете.

/edit Я исправил код и протестировал его.

для вашей информации, в которой указано имя, если переменная внутри переменной. АХК магия

+0

Итак, я не понимаю ваш код. Тем не менее, я никогда не использовал AHK до сегодняшнего дня, поэтому я буду читать все эти вещи в ближайшем будущем. Тем не менее, ваш код не работал для меня - когда я печатаю идентификатор, он просто ничего не печатает, вместо одной из трех строк, которые у меня есть в текстовом файле ... –

+0

@ Хишам Мохаммед исправил код! –

+0

это не работает :(все еще такая же проблема ... –