循环遍历数组并对Lua中的nil值执行算术运算

时间:2018-01-12 22:23:14

标签: arrays math lua null

嘿,我对lua很新,已经开始盯着lua乱搞了。我已经编写了以下脚本,在数组的帮助下打印出构造函数中每个可用对象的距离和角度但是我的方式存在很大问题:

me = {'["game.exe"+2A]','["game.exe"+A8]','["game"+6A8]'}

botallx = {'["game.exe"+01]','["game.exe"+02]','["game.exe"+03]',
'["game.exe"+04]','["game.exe"+05]','["game.exe"+06]','["game.exe"+07]',
'["game.exe"+08]','["game.exe"+09]','["game.exe"+10]','["game.exe"+11]',
'["game.exe"+12]'}

botally = {'["game.exe"+31]','["game.exe"+32]','["game.exe"+33]',
'["game.exe"+34]','["game.exe"+35]','["game.exe"+36]','["game.exe"+37]',
'["game.exe"+38]','["game.exe"+39]','["game.exe"+30]','["game.exe"+31]',
'["game.exe"+32]'}

botallz = {'["game.exe"+51]','["game.exe"+52]','["game.exe"+53]',
'["game.exe"+54]','["game.exe"+55]','["game.exe"+56]','["game.exe"+57]',
'["game.exe"+58]','["game.exe"+59]','["game.exe"+50]','["game.exe"+51]',
'["game.exe"+52]'}

function sight_angle()
     if (isKeyPressed(VK_E)) then

     for i=1, 12 do
     if (botallx[i] ~= nil or botally[i] ~= nil or botallz[i] ~= nil ) then
     vecX=readFloat(me[1])-readFloat(botallx[i])
     vecY=readFloat(me[2])-readFloat(botally[i])
     vecZ=readFloat(me[3])-readFloat(botallz[i])

     distance=math.sqrt(math.pow(calcZ,2)+math.pow(calcX,2))

     angleX=math.deg(math.atan2(calcZ, calcX))

     print ("current distance is " .. distance)
     print ("current angle is " .. angleX)
     else --One of the botallx, botally, botallz value was nil
     print ("Can't perform calculations due to a nil value")
     end
     end
end

这些名为[“game.exe”+ ...]的地址包含一个浮点值,但是botally,botallx和botallz容器中的一些对象是零或没有值。因此,当我执行脚本时,i = 1到12的数组开始计算第一个并给出角度和距离,但是一直计算直到它从具有零值的容器中击中一个对象然后不想携带在计算其他对象。

示例:对象1,3,6在botally中,botallx和botallz有值,其他一切都是零。 它开始计算第一个...给出距离和角度,但然后停止在scenond并开始抱怨由于零值而无法执行计算,所以它跳回到第一个对象并给我dist和角度再次。

但我希望它跳过第二个空的nil对象并继续第三个对象,它有一个值并打印我的距离和角度,然后跳过空的第4个和第5个并计算第6个和之后,它可以再次跳回到第一个,因为从7到12的其余部分是零。

但它不想这样做....有人可以帮助我吗? :(

2 个答案:

答案 0 :(得分:0)

一般来说,在lua中,你应该使用~= nil检查一个值是否为零。所以你可以修改你的代码:

  for i=1, 12 do
    --Do the following calculations only if botallx or botally or botallz        
    -- are not nil
    if (botallx[i] ~= nil or botally[i] ~= nil or botallz[i] ~= nil ) then
       vecX=readFloat(me[1])-readFloat(botallx[i])
       vecY=readFloat(me[2])-readFloat(botally[i])
       vecZ=readFloat(me[3])-readFloat(botallz[i])

       distance=math.sqrt(math.pow(calcZ,2)+math.pow(calcX,2))

       angleX=math.deg(math.atan2(calcZ, calcX))

       print ("current distance is " .. distance)
       print ("current angle is " .. angleX)
    else --One of the botallx, botally, botallz value was nil
       print ("Can't perform calculations due to a nil value")
 end

或者上面的if语句也可以这样写:

if (botallx[i] not nil or botally[i] not nil or botallz[i] not nil )

答案 1 :(得分:0)

我认为您想要的是 and 而不是 or。使用 or,您要检查其中至少一个存在,然后使用无论如何都不存在的那些。

if (botallx[i] ~= nil and botally[i] ~= nil and botallz[i] ~= nil ) then

或者:

if botallx[i] and botally[i] and botallz[i] then

尽管这些 botall 地址在您设置表格的方式中总是非零的。

什么是calcXcalcZ您的意思是 vecXvecZ 在那里吗?如果是这样,那就是您的零算术异常。如果您不知道,未声明的变量具有 nil 值,而不是像大多数其他语言一样导致“未知符号”错误。

假设 calcX 问题只是复制/粘贴错误,您可能需要对这些 readFloat(...) 调用进行一些 nil 检查。

function sight_angle()
    if (isKeyPressed(VK_E)) then
        local meX = readFloat(me[1])
        local meY = readFloat(me[2])
        local meZ = readFloat(me[3])
        if not meX or not meY or not meZ then
            print ("Can't perform calculations due to a nil value")
            return
        end
        for i=1, 12 do
            -- Ditch the botall nil checks
            local bX = readFloat(botallx[i])
            local bY = readFloat(botally[i])
            local bZ = readFloat(botallz[i])
            
            if bX and bY and bZ then   
                local vecX=meX-bX
                local vecY=meY-bY
                local vecZ=meZ-bZ

                -- Assuming calcX and calcZ meant vecX and vecZ
                local distance=math.sqrt(math.pow(vecZ,2)+math.pow(vecX,2))

                local angleX=math.deg(math.atan2(vecZ, vecX))

                print ("current distance is " .. distance)
                print ("current angle is " .. angleX)
            else
                print ("Can't perform calculations due to a nil value")
            end
        end
    end
end

当然,我完全不知道这些东西是做什么的!这是作弊引擎插件吗?我只是基于我在您的代码片段中看到的内容。