Сама Джесс не имеет такой структуры данных. Вы могли бы использовать список списков 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