Итак, у меня есть массив существ из игры, каждое из которых представляет собой просто имя в виде строки. Я хочу перебрать каждый из них и создать для каждого таблицу, содержащую все характеристики существ, здоровье, урон и т. д. Но я не могу найти способ создания новых таблиц Lua, например, присвоения новой переменной таблице. не копирует его.
На самом деле я мало что пробовал, так как я новичок в программировании и не нашел в Интернете почти никакой информации, касающейся моей конкретной проблемы.
Допустим, ваш массив выглядит следующим образом (и имейте в виду, что массивы Lua представляют собой таблицы с числовыми индексами):
monsters = {[1] = "orc", [2] = "troll", [3] = "ogre"}
да, у вас возникнут проблемы, если вы попытаетесь создать один шаблон таблицы «статистика» и присвоить его каждому имени монстра в массиве:
stats = {["strength"] = 15, ["health"] = 10}
monster_stats = {} -- initialize new table for stats
for k,v in ipairs(monsters) do
monster_stats[v] = stats
end
monster_stats["orc"].strength = 10 -- change strength
print(monster_stats["orc"].strength)
print(monster_stats["troll"].strength)
выход:
10
10
Мы хотим изменить только силу орка, но в конечном итоге мы изменяем силу каждого. Это потому, что и monster_stats["orc"] и monster_stats["troll"] указать на ту же таблицу в памяти. Вам нужен способ клонировать таблицу — и пример есть на lua.org[0].
Добавьте эту функцию в начало вашего скрипта, и теперь вы сможете вызывать clone() во время присваивания. На этот раз все идет так, как задумано, потому что переменная «статистика» каждого монстра указывает на отдельную таблицу в памяти.
function clone (t) -- t is a table
local new_t = {} -- create a new table
local i, v = next(t, nil) -- i is an index of t, v = t[i]
while i do
new_t[i] = v
i, v = next(t, i) -- get next index
end
return new_t
end
monsters = {[1] = "orc", [2] = "troll", [3] = "ogre"}
stats = {["strength"] = 15, ["health"] = 10}
monster_stats = {} -- initialize new table for stats
for k,v in ipairs(monsters) do
monster_stats[v] = clone(stats)
end
monster_stats["orc"].strength = 10 -- change strength
print(monster_stats["orc"].strength)
print(monster_stats["troll"].strength)
выход:
10
15
Вы можете увидеть, что все таблицы теперь разделены, распечатав значения самих таблиц:
print(monster_stats["orc"])
print(monster_stats["troll"])
print(monster_stats["ogre"])
выход:
table: 0x55be070536b0
table: 0x55be07053bc0
table: 0x55be07053c80
Ссылки:
[0] https://www.lua.org/manual/2.4/node31.html