【问题标题】:For loops not working completely right Lua对于循环不能完全正确 Lua
【发布时间】:2020-05-07 21:13:15
【问题描述】:
for amountofspinstodo = 1, 100 do
    local pick = math.random( 1, #box.CONTENTS )
    local rarity = INV:CalculateItemRarity()
    local ITEMPICK = INV:GetDataFromName(box.CONTENTS[pick])
    local RARITYS_OF_ITEM_PICK = ITEMPICK.RARITYS
    if has_value(RARITYS_OF_ITEM_PICK, rarity)then
        tbl.spintable[amountofspinstodo] = { NAME = box.CONTENTS[pick], RARITY = rarity }
        print(amountofspinstodo)
    else
        amountofspinstodo = amountofspinstodo - 1
        print(amountofspinstodo)
    end
end

我做了这个for循环来检查一个项目是否有一定的稀有度,如果有,那么就允许它成为一个项目,但如果它没有稀有度,那么它应该让for循环做到这一点再一次,直到每个项目都被挑选出来。但是,当我运行 for 循环时,它会这样做,我不知道为什么。

Here is the console output

有些数字是重复的,例如 48 和 48,应该是 48 和 49。

任何帮助将不胜感激!

-谢谢 D12

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow!从技术上讲,您的代码正在执行您告诉它执行的操作,如果稀有度不匹配,则从 amountofspins 中减去 1。但如果amountofspins 与表中的项目数匹配,则最好使用print(#tbl.spintable)。此外,我认为您可能会考虑table.insert(tbl.spintable, {...}),而不是您现在的做法。
  • 看起来您在发布的代码中错过了 for 循环的开头,您可以将其包括在内吗?
  • @Nifim 很抱歉,我现在已经添加了。
  • 您不能从 for 循环中更改循环迭代器的值,您需要改用 while 循环

标签: lua


【解决方案1】:

amountofspinstodo 不能从你的 for 循环内部更改,并持续到循环的下一次运行。

参考资料:

第三,你不应该改变控制变量的值:这种改变的效果是不可预测的。如果要在正常终止之前中断 for 循环,请使用 break。 - Programming in Lua: 4.3.4 – Numeric for

这里有一个简单的例子,你可以看看:

for i = 1, 10 do
    print(i) 
    i = 10
end

您应该使用 while 循环:

local amountofspinstodo = 1
while(amountofspinstodo < 100) do
    local pick = math.random( 1, #box.CONTENTS )
    local rarity = INV:CalculateItemRarity()
    local ITEMPICK = INV:GetDataFromName(box.CONTENTS[pick])
    local RARITYS_OF_ITEM_PICK = ITEMPICK.RARITYS
    if has_value(RARITYS_OF_ITEM_PICK, rarity)then
        tbl.spintable[amountofspinstodo] = { NAME = box.CONTENTS[pick], RARITY = rarity }
        print(amountofspinstodo)
        amountofspinstodo = amountofspinstodo + 1
    else
        print(amountofspinstodo)
    end
end

【讨论】:

  • 你的意思是“不能”还是“不应该?”
  • 不能,简单例子:for i = 1, 10 do print(i); i = 10; end
  • The documentation 特别警告不要这样做:"[...] 你永远不应该改变控制变量的值:这种改变的影响是不可预测的。" 在练习一下,看起来您可以在正文中随心所欲地更改变量...但是对于以下迭代,更改将被丢弃。
  • @canon 谢谢您,我正在寻找要包含在我的答案中的确切文档。
【解决方案2】:

作为 Nifim already pointed,你不能。

但是查看您的代码,很明显您实际上是在尝试在一个 for 循环中执行两个实际循环,这显然是行不通的。

稍微移动一下你的代码,你会得到:

for spins = 1, 100 do
    local pick, rarity
    repeat
        pick = math.random( 1, #box.CONTENTS )
        rarity = INV:CalculateItemRarity()
        local ITEMPICK = INV:GetDataFromName(box.CONTENTS[pick])
        local RARITYS_OF_ITEM_PICK = ITEMPICK.RARITYS
        print(spins)
    until has_value(RARITYS_OF_ITEM_PICK, rarity)
    tbl.spintable[spins] = { NAME = box.CONTENTS[pick], RARITY = rarity }
end

如您所见,有一个从 1 计数到 100 的外循环,以及一个重复某些代码直到您对结果满意的内循环。

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多