我正在用Clojure做一个小游戏,作为学习练习。在任何特定时间点上,我认为已经确定了游戏状态的表示方式是“可移动物”列表和二维向量的向量,用于“地形”(棋盘方块)。
95%的时间,我希望检查特定方格中是否发生碰撞,这时使用二维向量似乎很合适。但在一些情况下,我需要反过来——找到与某些条件匹配的单元格的(x,y)位置。第一次尝试类似于这样:
95%的时间,我希望检查特定方格中是否发生碰撞,这时使用二维向量似乎很合适。但在一些情况下,我需要反过来——找到与某些条件匹配的单元格的(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,但它很快变得混乱,并且仍然没有完全满足我的需求。是否有更符合惯用法的方式来进行这种搜索?或者我可以使用不同的数据结构来更好地服务于我自己?也许是一个map {[x y] -> cell}?对我来说,使用map来表示矩阵感觉很奇怪 :)
assoc-in
是什么意思,但是在Clojure中,“普通”映射是作为函数式(不可变)树实现的,因此当您修改映射时,您会得到一个新实例,它与先前实例共享许多结构。我在dfs中使用了map {[x y] -> cell} 作为一种结构,效果很好。然而,它感觉非常“奇怪”,所以我将此问题加入书签,以查看是否有更好的解决方案... - andrew cooke(assoc-in sample [0 2] \z)
来创建一个副本,将样本中的\c更改为\z。感谢你们两个的反馈。 - kylewm