私は学習演習として Clojure で小さなゲームに取り組んでいます。特定の時点でのゲームの状態を、「可動要素」のリストと「地形」(ボードの四角形) のベクトルの 2D ベクトルとして表現することに落ち着いたと思います。
95% の時間で、2D ベクトルが適切と思われる特定の正方形での衝突をチェックしていると思います。しかし、場合によっては、別の方向に進む必要があります。ある条件に一致するセルの (x,y) 位置を見つけます。最初の試みは次のようなものでした:
(defn find-cell-row [fn row x y]
(if (empty? row) nil
(if (fn (first row)) [x y]
(find-cell-row fn (rest row) (inc x) y))))
(defn find-cell [fn grid y]
(if (empty? grid) nil
(or (find-cell-row fn (first grid) 0 y)
(find-cell (rest grid) (inc y)))))
(def sample [[\a \b \c][\d \e \f]])
(find-cell #(= % \c) sample 0) ;; => [2 0]
私は map-indexed でもっと簡潔なことを試みましたが、すぐに醜くなり、それでも私が望んでいたものはまったく得られませんでした. この検索を行うためのより慣用的な方法はありますか、それとも別のデータ構造を使用したほうがよいでしょうか? マップ { [xy] -> cell } でしょうか。マップを使用してマトリックスを表すのは、私にはとても間違っているように感じます:)