-
-
Save fogus/846a35b3593fb0cc9e76bbf368f6bfcc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(require '[clojure.string :as s]) | |
;; Maze GENERATION | |
(defn north-of [[row col]] [(dec row) col]) | |
(defn south-of [[row col]] [(inc row) col]) | |
(defn west-of [[row col]] [row (dec col)]) | |
(defn east-of [[row col]] [row (inc col)]) | |
(defn neighbours [rows cols cell] | |
(filter (fn [[i j]] (and (< -1 i rows) (< -1 j cols))) ((juxt north-of east-of south-of west-of) cell))) | |
(defn visited? [fallen-walls rows cols cell] | |
(some fallen-walls (for [n (neighbours rows cols cell)] #{n cell}))) | |
(defn find-unvisited-neighbours [fallen-walls rows cols cell] | |
(let [n (neighbours rows cols cell)] | |
(remove #(visited? fallen-walls rows cols %) n))) | |
(defn generate-maze [rows cols] | |
(loop [fallen-walls #{} | |
backtrackstack '([0 0])] | |
(if-some [cell (peek backtrackstack)] | |
(if-some [unvn (seq (find-unvisited-neighbours fallen-walls rows cols cell))] | |
(let [next (rand-nth unvn)] | |
(recur | |
(conj fallen-walls #{next cell}) | |
(conj backtrackstack next))) | |
(recur fallen-walls (pop backtrackstack))) | |
{:fallen-walls fallen-walls | |
:cols cols | |
:rows rows}))) | |
;; Maze PRINTING | |
(defn print-maze [{:keys [fallen-walls rows cols]}] | |
(doseq [j (range cols)] | |
(print "+---")) | |
(println "+") | |
(doseq [i (range rows)] | |
(doseq [j (range cols)] | |
(print (if (fallen-walls #{[i j] [i (dec j)]}) " " "| "))) | |
(println "|") | |
(doseq [j (range cols)] | |
(print (if (fallen-walls #{[i j] [(inc i) j]}) "+ " "+---"))) | |
(println "+"))) | |
;; Maze DRAWING | |
(defn draw-maze [{:keys [fallen-walls rows cols]}] | |
(let [w (* 10 (inc cols)) | |
h (* 10 (inc rows)) | |
img (java.awt.image.BufferedImage. w h java.awt.image.BufferedImage/TYPE_INT_RGB) | |
g (.createGraphics img)] | |
(doto g | |
(.translate 10 10) | |
(.scale 10 10) | |
(.setBackground java.awt.Color/BLACK) | |
(.setColor java.awt.Color/WHITE) | |
(.setStroke (java.awt.BasicStroke. 0.5)) | |
(.clearRect 0 0 w h)) | |
(doseq [[[i j] [ii jj]] (map seq fallen-walls)] | |
(.drawLine g j i jj ii)) | |
img)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment