我一直在尝试着为我在Jess中创造的游戏呈现一个特定的场景,到目前为止我已经拥有了一个特定的事实,能够告诉我们每个场景中的所有元素。由于这个游戏场景将以文本格式表示(仅使用文本字符),我考虑使用二维数组根据从场景事实中检索到的信息将特定字符匹配到特定位置。
谁能给我一些关于如何实现这一点的见解?
Jess本身没有这样的数据结构。您可以使用Java列表的列表,但是在Jess中操作会很尴尬。幸运的是,游戏棋盘通常是一个稀疏矩阵,这意味着大多数位置是空的,因此你只需要表示那些不是空的位置。你可以将坐标直接放入游戏对象模板中——例如,这里的x
和y
:
(deftemplate game-object (slot name) (slot type) (slot x) (slot y) ...)
或者你可以使用一个单独的"position"模板,并使用id将其与游戏对象匹配,如
(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
)