在Clojure中适当表示2D游戏板

kyl*_*ewm 5 clojure data-structures

我正在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]
Run Code Online (Sandbox Code Playgroud)

我用map-indexed尝试了一些更简洁的东西,但是很快就变得丑陋而且仍然没有给我我想要的东西.是否有更惯用的方式来进行此搜索,或者我可能会更好地使用不同的数据结构?也许是地图{[xy] - > cell}?使用地图来表示矩阵对我来说感觉很不对:)

ama*_*loy 4

嵌套向量对于这类事情来说是很正常的,如果你使用理解,那么扫描一个向量既不难也不难看for

(let [h 5, w 10]
  (first
   (for [y (range h), x (range w)
         :let [coords [y x]]
         :when (f (get-in board coords))]
     coords)))
Run Code Online (Sandbox Code Playgroud)