我一直在尝试为我在 Jess 中构建的游戏代表某个场景,到目前为止,我有一个特定的事实可以告诉每个场景的所有元素。由于此游戏场景将以文本格式表示(仅使用文本字符),因此我非常想根据从场景事实中检索到的信息,使用二维数组将某个字符与某个位置进行匹配。
任何人都可以给我一些关于如何实现这一目标的见解?
我一直在尝试为我在 Jess 中构建的游戏代表某个场景,到目前为止,我有一个特定的事实可以告诉每个场景的所有元素。由于此游戏场景将以文本格式表示(仅使用文本字符),因此我非常想根据从场景事实中检索到的信息,使用二维数组将某个字符与某个位置进行匹配。
任何人都可以给我一些关于如何实现这一目标的见解?
Jess 本身没有这样的数据结构。您可以使用 Java list-of-lists,但从 Jess 操作会很尴尬。幸运的是,棋盘通常是一个稀疏矩阵,这意味着大多数位置都是空的,因此您只需要表示不是的位置。您可以将坐标直接放入您的游戏对象模板中——即,x
在y
这里:
(deftemplate game-object (slot name) (slot type) (slot x) (slot y) ...)
或者您可以使用单独的“位置”模板并使用 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
)