 May 24, 2015

## Is Move Allowed?

In the last chapter we already used the is-move-allowed? function. There are four functions at all taking care of it.

The first one just checks the boundaries and if none tetriminio is defined at that position:

``````(defn is-moving-part-allowed? [x y grid]
(and (<= 0 x) (< x 10) (<= 0 y) (< y 20) (= 0 (get-in grid [x y]))))
``````

The second one makes use of the function definitions. If a x or y key exists in the map if will apply the function to the old x or y value. If not, it just returns the old one. This is how we update the four blocks:

``````(defn move-x-y [x y rec]
(let [x' (if (get rec :x) ((get rec :x) x) x)
y' (if (get rec :y) ((get rec :y) y) y)]
{:x x' :y y'}))

(defn realize-move [x y t grid] (assoc-in grid [x y] t))

``````
This draws one tetriminio in the grid according to the tetriminio definition:
``````(defn draw-tet [{:keys [x y t o] :as cur-tet} tet-recipe d grid]
(let [new-position (map #(move-x-y x y %) (get-in tet-recipe [t o]))]
(reduce (fn [a b] (realize-move (:x b) (:y b) (* t d) a)) grid new-position)))

``````
is-move-allowed? basically only calls the functions defined above for every single block and returns true orfalse:
``````(defn is-move-allowed? [{:keys [x y t o]} cur-active grid tet-recipe]
(let [new-position (map #(move-x-y x y %) (get-in tet-recipe [t o]))
removed-grid (draw-tet cur-active tet-recipe 0 grid)]
(h/not-in? (map #(is-moving-part-allowed? (:x %) (:y %) removed-grid) new-position) false)))
``````
Tags: tetris clojuresrcipt