私は Jess で構築しているゲームの特定のシナリオを表現しようとしてきましたが、これまでのところ、各シナリオのすべての要素を伝える特定の事実があります。このゲーム シナリオはテキスト形式 (テキスト文字のみを使用) で表現されるため、2 次元配列を使用して、シナリオ ファクトから取得した情報に基づいて特定の文字を特定の位置に一致させることを考えました。
これを達成する方法について誰かが私に洞察を与えることができますか?
私は Jess で構築しているゲームの特定のシナリオを表現しようとしてきましたが、これまでのところ、各シナリオのすべての要素を伝える特定の事実があります。このゲーム シナリオはテキスト形式 (テキスト文字のみを使用) で表現されるため、2 次元配列を使用して、シナリオ ファクトから取得した情報に基づいて特定の文字を特定の位置に一致させることを考えました。
これを達成する方法について誰かが私に洞察を与えることができますか?
Jess 自体には、そのようなデータ構造はありません。Java のリストのリストを使用することもできますが、Jess から操作するのは面倒です。幸いなことに、ゲーム ボードは通常sparse matrixです。つまり、ほとんどの位置は空であるため、そうでない位置のみを表す必要があります。座標をゲーム オブジェクト テンプレートに直接入力することもできます。つまり、次のように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))
重要な洞察の 1 つは、パターン マッチングによってすべてのオブジェクトのループが不要になるということです。たとえば、「ヒーロー」キャラクターと同じ行に他のキャラクターがいないかどうかを確認したいとします。次のように書くだけで、ループは必要ありません。
(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
)