For循环在Lua中不能完全正常工作

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循环时,它会发生这种情况,我不知道为什么。

这是控制台输出

一些数字是重复的,如48和48,而应该是48和49。

任何帮助都将不胜感激!

-谢谢D12

点赞
用户7396148
用户7396148

amountofspinstodo 不能在 for 循环内部修改,并会在下一次循环中保留。

参考文献:

第三,在 for 循环中你不应该改变控制变量的值:这种改变的作用是不可预测的。如果你想在正常终止之前中止 for 循环,请使用 break。 - Lua 编程:4.3.4 数字 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
2020-01-21 19:22:36
用户4984564
用户4984564

如Nifim已经指出,你不可能这样做。

但看一下你的代码,就会看出你实际上在尝试在一个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

你可以看到,有一个外部循环计数从一到一百,还有一个内部循环重复某些代码,直到你对结果满意。

2020-01-22 20:44:07