Соответствующее представление 2D-игрового поля в Clojure

Я работаю над небольшой игрой в Clojure как обучающее упражнение. Я думаю, что остановился на представлении состояния игры в любой конкретный момент времени в виде списка «движимых объектов» и двумерного вектора векторов для «территории» (квадратов доски).

В 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]

Я попробовал что-то более лаконичное с индексацией карт, но это быстро стало ужасно и все еще не дало мне того, что я хотел. Есть ли более идиоматический способ выполнить этот поиск, или, может быть, мне лучше использовать другую структуру данных? Может быть, карта {[x y] -> cell}? Использование карты для представления матрицы кажется мне таким неправильным :)

5
задан kylewm 17 April 2012 в 21:19
поделиться