Для петель не работает полностью правильно Lua - PullRequest
1 голос
/ 21 января 2020
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

Я сделал это для l oop, чтобы проверить, есть ли у предмета определенная редкость, и если это так, то разрешить ему быть предметом, но также, если у него нет редкости, то он должен заставьте for l oop делать это снова, пока не будет выбран каждый предмет. Однако, когда я запускаю для l oop, он делает это, и я понятия не имею, почему.

Вот вывод консоли

Некоторые из чисел являются дубликатами, такими как 48 и 48, которые должны быть 48 и 49.

Любая помощь будет оценена!

-Спасибо D12

Ответы [ 2 ]

5 голосов
/ 21 января 2020

amountofspinstodo не может быть изменено изнутри вашего на l oop, и сохраняется до следующего запуска l oop.

Ссылки:

Третий Вы никогда не должны изменять значение управляющей переменной: эффект таких изменений непредсказуем. Если вы хотите разбить a для l oop до его нормального завершения, используйте break. - Программирование в Lua: 4.3.4 - Нумерация c для

Вот простой пример, который вы можете использовать, чтобы увидеть:

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

Вместо этого вы должны использовать некоторое время l oop:

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
2 голосов
/ 22 января 2020

Поскольку Nifim уже указал , вы не можете.

Но, глядя на ваш код, становится ясно, что вы на самом деле пытаетесь сделать два фактических цикла в одном для l oop, что, очевидно, не работает.

Немного переместив код, вы получите:

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

Как видите, есть внешний l oop, который считается от одного до ста, и внутренний l oop, который повторяет некоторый код, пока вы не будете удовлетворены результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...