Как вызвать таблицу из переменной в Lua?
Я создаю программу для черепахи в 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 ответ
В настоящее время ваш 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
функции, чтобы сделать звонки на них проще (как указано выше). Там нет такой функции, как 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