(Lua) оператор while останавливается, когда оператор if внутри останавливается - PullRequest
1 голос
/ 01 июля 2019

Я создаю автоматизированную ферму в майнкрафт с компьютерными черепахами, и я столкнулся с загадкой.У меня есть место, где черепахи сбрасывают пшеницу, которую они собрали, в бункер, но как только * CropData.name == "minecraft:wheat" становится ложным внутри оператора if, весь цикл while останавливается, а значение, контролирующее цикл while, становится ложным.Когда черепаха сталкивается с ячейкой инвентаря, в которой нет пшеницы, она просто останавливается, когда я хочу, чтобы она продолжала проверять все остальные ячейки.Есть ли способ исправить это?

Вот фрагмент кода, с которым у меня возникли проблемы:

while i < 16 do
    turtle.select(i)
    CropData = turtle.getItemDetail()
    if CropData.name == "minecraft:wheat" then
        turtle.dropDown()
    end
    i = i + 1
end

Вот полный код программы:

local x = 1
local i = 1
local itemSlot = 1
local y = 1
local success, data = turtle.inspectDown()
local CropData = turtle.getItemDetail()
while true do
y = 1
while y < 9 do
    x = 1
    while x < 14 do
        turtle.forward()
        success, data = turtle.inspectDown()
        print(data.metadata)
        if data.metadata == 7 then
            turtle.digDown()
            turtle.select(12)
            turtle.suckDown()
            turtle.select(itemSlot)
            turtle.placeDown()
        elseif data.metadata == nil then
            turtle.down()
            success, data = turtle.inspectDown()
            if data.name == "minecraft:dirt" then
            turtle.up()
            turtle.digDown()
            turtle.placeDown()
            elseif data.name == "minecraft:farmland" then
            turtle.up()
            turtle.placeDown()
            end
        end
        if turtle.getItemCount()==0 then
            itemSlot = itemSlot + 1
        end
        turtle.select(itemSlot)
        x = x + 1
    end
    turtle.turnLeft()
    turtle.forward()
    turtle.turnRight()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    turtle.back()
    y = y + 1
end
while i < 16 do
    turtle.select(i)
    CropData = turtle.getItemDetail()
    if CropData.name == "minecraft:wheat" then
        turtle.dropDown()
    end
    i = i + 1
end
turtle.turnRight()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.turnLeft()
end

PS Извините, если какой-то мой код запутан и неэффективен, большую часть времени я написал большую часть этого текста на маленьком экране, поэтому мне было лень.Прости еще раз!

1 Ответ

1 голос
/ 01 июля 2019

Проблема (или одна из) заключается в том, что turtle.getItemDetail() возвращает nil, когда i-й слот пуст.Вы не можете получить доступ к полю с нулевым значением, поэтому сценарий завершается сбоем, если вы когда-либо сталкиваетесь с пустым слотом.

Попробуйте вместо этого изменить его на

  if CropData ~= nil and CropData.name == "minecraft:wheat" then
    turtle.dropDown()
  end

.

Также: условие в вашем цикле while должно быть <=, а не <, так как количество слотов увеличивается до 16. Включая 1013 *

...