Использование двумерного массива в Jess

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

Кто-нибудь может дать мне некоторое представление о том, как этого добиться?


person Sasha Fonseca    schedule 12.03.2013    source источник


Ответы (1)


Сама Джесс не имеет такой структуры данных. Вы могли бы использовать список списков Java, но было бы неудобно манипулировать из Jess. К счастью, игровое поле обычно представляет собой разреженную матрицу, а это означает, что большинство позиций пусты, поэтому вам нужно представлять только те, которые не пусты. Вы можете поместить координаты непосредственно в шаблон вашего игрового объекта, например, x и y здесь:

(deftemplate game-object (slot name) (slot type) (slot x) (slot y) ...)

Или вы можете использовать отдельный шаблон «позиции» и сопоставить его с игровыми объектами, используя идентификатор, например

(deftemplate game-object (slot name) (slot type) (slot id) ...)
(deftemplate location (slot id) (slot x) (slot y))

Одно важное открытие состоит в том, что сопоставление с образцом делает ненужными циклы для всех объектов. Например, предположим, что вы хотите проверить, нет ли других персонажей в той же строке, что и ваш «герой». Вы можете просто написать что-то вроде этого, цикл не требуется:

(defrule no-character-in-same-row-as-hero
    (game-object (name hero) (y ?y))
    (not (game-object (name ~hero) (y ?y)))
     =>
    // Do whatever you want, knowing that no other characters are in the same row
    )
person Ernest Friedman-Hill    schedule 14.03.2013