我正在使用 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]
我尝试了一些更简洁的地图索引,但它很快就变得丑陋了,仍然没有给我想要的东西。是否有更惯用的方法来进行此搜索,或者也许我会更好地使用不同的数据结构?也许是地图 { [xy] -> cell }?使用地图来表示矩阵对我来说感觉很不对 :)