AutoHotKey 中数组的随机发送

Random sending of array in AutoHotKey

我正在尝试创建一个 AHK 脚本,它会在我输入 'diss' 时输入随机侮辱。但是,目前,我每次输入 'diss' 时得到的都是 "Array[rand]"。

我做错了什么?

Array:= Object()

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


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

您忘记用分号设置数组名称 -> %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

修复了多个问题..

1.try 读入变量

2.arrays可以作为变量名

3.varaible 名称可以包含变量

如果我的代码对你有用,以及你是否理解,请反馈。

/edit 我修复了代码并对其进行了测试。

供您参考,如果变量在变量中,我将名称嵌套。 ahk 魔法

Deceiving_Solicitite 在技术上是正确的...但我觉得他没有很好地解释他的代码,坦率地说,Hisham 的代码写得更好,即使它是错误的(只有 2 个小细节)。说了这么多,让我们开始编码吧。

第一个突然出现的问题是您的发送命令。让我们尝试将 Send, Array[rand] 更改为 Send % Array[rand],现在代码大部分时间都可以工作...

But what does this mean?

注意到 % 标志了吗?这是在对通常不计算表达式的命令强制执行表达式。 Arrays/Objects 在 AHK 中被视为如此,Command 将无法识别它们。

This still doesn't explain why the code only "works most of the time..."

事实证明,他生成的随机数也存在一个小问题。将值插入数组时,它们会从 1 开始递增索引,而且他的随机数有时会产生零。因此,我们现在将该行从更改为 Random, rand, 1, 3,此时代码已修复并且 %100 的时间有效。

But what if he wanted to have more insults than 3? Will he have to go through and count every line and amend his Random command?

这很愚蠢,因为我们可以让计算机为我们做这件事,因为它计算文本行数的速度比我们快得多。因此,我们只需让我们的 Random 产生介于 1 和数组的最大索引之间的结果,如下所示: 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 更改为 Array.Push()。