Как вызвать таблицу из переменной в Lua? - PullRequest
0 голосов
/ 23 декабря 2018

Я создаю программу для черепахи в ComputerCraft.Программа собирается сделать так, чтобы черепаха управляла складом для хранения моих предметов в игре.Он проверит, какой предмет я положил, затем выяснит местоположение сундука, пойдет туда и выбросит его. Я храню расположение каждого сундука в столе.Например:

cobblestone = {2,0,1}

Это говорит черепахе, что сундук с булыжником хранится в положении x = 2 y = 0 и z = 1.Чтобы черепаха узнала, что ей нужно хранить, она делает:

itemDetails = turtle.getItemDetail()
name = string.gsub(itemDetails.name, "minecraft:", "")

Получает черепаху информацию о предмете.Затем он устанавливает переменную в качестве имени предмета за вычетом Minecraft: в начале его (у меня не может быть переменной с именем "minecraft: cobblestone").Я не знаю, как использовать эту переменную для вызова таблицы и определения ее положения для черепахи.Если кто-нибудь может помочь, я был бы признателен за любую помощь.Заранее спасибо!Кроме того, просто наперед, код все еще настроен для целей отладки и тестирования.Это черепаха, с входным сундуком впереди, топливным сундуком справа и складом за ней.

Я пытался сделать:

cobblestone = {2,0,1}
--Putting a piece of cobblestone in--
itemDetails = turtle.getItemDetail()
--Returning name of "minecraft:cobblestone"--
name = string.gsub(itemDetails.name, "minecraft:", "")
print name[1]

Итакпока это не сработало.

pos = {0,0,0}
looking = 0
cobblestone = {2,0,1}
function fuel()
    if turtle.getFuelLevel() < 20 then
        turtle.select(16)
        turtle.refuel(1)
    end
end
function left()
    turtle.turnLeft()
    looking = looking - 1
    if looking < 0 then
        looking = 3
    end
        print(looking)
end
function right()
    turtle.turnRight()
    looking = looking + 1
    if looking > 3 then
        looking = 0
    end
        print(looking)
end
function forward()
    fuel()
        if turtle.forward() then
            if looking == 0 then
                pos[1] = pos[1] - 1
            elseif looking == 1 then
                pos[3] = pos[3] - 1 
            elseif looking == 2 then
                pos[1] = pos[1] + 1
            elseif looking == 3 then
                pos[3] = pos[3] + 1
            else
                print("wot")
            end
        end

end
function up()
    fuel()
    turtle.up()
    pos[2] = pos[2] + 1
end
function down()
    fuel()
    turtle.down()
    pos[2] = pos[2] - 1
end
function goHome()
    while pos[3] > 0 do
        while  looking > 1 do
            left()
        end
        forward()
    end
    while  pos[2] > 0 do
        down()
    end
    while  pos[1] > 0 do
        while  looking > 0 do
            left()
        end
        forward()
    end
end

while true do
    turtle.select(1)
    while not turtle.suck() do
        sleep(1)
    end
    itemDetails = turtle.getItemDetail()
    name = string.gsub(itemDetails.name, "minecraft:", "")
    print(name)
        while looking < 2 or looking > 2 do
            left()
        end
        for i = pos[1],name[1]-1 do
            forward()
        end
        while looking > 3 or looking < 3 do
            right()
        end
        for i = pos[3],name[3]-1 do
            forward()
        end
        for i = pos[2],name[2]-1 do
            up()
        end
        while looking < 2 or looking > 2 do
            left()
        end
        turtle.select(1)
        turtle.drop()
        goHome()
end

Я хочу иметь возможность сделать:

cobblestone = {2,0,1}
--Putting a piece of cobblestone in--
itemDetails = turtle.getItemDetail()
--Returning name of "minecraft:cobblestone"--
name = string.gsub(itemDetails.name, "minecraft:", "")
print name[1]

и напечатать черепаху так же, как булыжник [1], что будет 2Тем не менее, он возвращается с нуля.

1 Ответ

0 голосов
/ 23 декабря 2018

В настоящее время ваш cobblestone является глобальным, что плохо для этого примера.Во-первых, сохраните все элементы следующим образом:

local myelems = {
   cobblestone = {2,0,1};
   grass = {3,1,2};
}

и так далее.Если возможно, используйте local переменных, это хорошая практика в программировании.

Итак, давайте посмотрим на ваш код:

-- Returning name of "minecraft:cobblestone"
local name = string.gsub(itemDetails.name, "minecraft:", "")
print(name[1])

Что он делает?(Я немного его изменил)

Сначала string.gsub выглядит как избыточное убийство, используйте вместо него string.match:

local name = itemDetails.name:match("^minecraft:(.+)$")

Здесь itemDetails.name:match аналогично вызовуstring.match с itemDetails.name в качестве первого аргумента.Он может использоваться для всех string функций.

Так что здесь name - это string переменная.Индексирование строк на разных языках может иметь разные результаты.В lua in фактически предоставляется доступ ко всем string функциям, чтобы сделать вызовы к ним проще (как указано выше).Нет такой функции, как string[1], поэтому вы получаете nil.Однако теперь у нас есть таблица myelems, в которой ключи - это строки, а значения - ваши таблицы.

Полный код:

-- Table for all elements
local myelems = {
   cobblestone = {2,0,1};
   grass = {3,1,2};
}
-- Putting a piece of cobblestone in
local itemDetails = turtle.getItemDetail()
--Returning name of "minecraft:cobblestone"
local name = itemDetails.name:match("^minecraft:(.+)$")
-- Get our table
local elem = myelems[name]
if elem then
  print(elem[1], elem[2], elem[3])
end
...