lua: пользовательский ввод в справочную таблицу

У меня проблемы с таблицами, я делаю текстовое приключение на lua

local locxy = {}
      locxy[1] = {}
      locxy[1][1] = {}
      locxy[1][1]["locdesc"] =  "dungeon cell"
      locxy[1][1]["items"] = {"nothing"}
      locxy[1][1]["monsters"] = {monster1}

[1] [1] относится к координатам x, y, и с помощью команды перемещения я могу успешно перемещаться в разные комнаты и получать описание указанной комнаты.

Предметы и монстры представляют собой вложенные таблицы, поскольку в них можно хранить несколько предметов (каждый со своими свойствами).

Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить работать часть предметов/монстров. У меня есть отдельная таблица, например:

local monsters = {}
    monsters["rat"] = {}
    monsters["rat"]["Name"] = "a rat"
    monsters["rat"]["Health"] = 5
    monsters["rat"]["Attack"] = 1

Я использую подобную таблицу для создания контуров для различных типов врагов. Monster1 — это переменная, которую я могу вставить в таблицу местоположений, чтобы вызвать один из этих контуров, однако я не знаю, как на нее сослаться.

print("You are in ", locxy[x][y]["locdesc"]) -- this works
print("You can see a ", locxy[x][y]["monsters]["Name"],".") - does not work

Поэтому я хотел бы знать, как я могу заставить это работать, мне может понадобиться другой подход, который хорош, так как я учусь. Но я также хотел бы знать, как/если можно использовать переменную в записи таблицы, которая указывает на данные в отдельной таблице.

Спасибо за любую помощь, которая может быть предложена!


person mixedfr00tjam    schedule 01.10.2014    source источник


Ответы (1)


Эта линия

locxy[x][y]["monsters]["Name"]

говорит

  1. поищите в таблице locxy поле x
  2. затем посмотрите в поле y этого значения
  3. поищите в поле "монстры" это значение
  4. затем посмотрите в поле "Name" этого значения

Проблема в том, что таблица, которую вы получаете из locxy[x][y]["monsters"], не имеет поля "Name". Он имеет некоторое количество записей в числовых индексах.

locxy[x][y]["monsters][1]["Name"] даст вам имя первого монстра в этой таблице, но вам нужно будет перебрать таблицу монстров, чтобы получить их все.

Примечания к стилю:

Вместо:

tab = {}
tab[1] = {}
tab[1][1] = {}

вы можете просто использовать:

tab = {
    [1] = {
        {}
    }
}

и вместо:

monsters = {}
monsters["rat"] = {}
monsters["rat"]["Name"] = "foo"

вы можете просто использовать:

monsters = {
    rat = {
        Name = "foo"
    }
}

Или ["rat"] и ["Name"], если вы хотите быть явным в своих ключах.

Точно так же вместо monsters["rat"]["Name"] можно использовать monsters.rat.Name.

person Etan Reisner    schedule 01.10.2014
comment
Спасибо за очень быстрый и полезный ответ. - person mixedfr00tjam; 02.10.2014