src/caves/world.clj @ b08b5fd0f3e8
entry-03-2
moar
author |
Steve Losh <steve@stevelosh.com> |
date |
Sun, 08 Jul 2012 20:43:22 -0400 |
parents |
a13a6a80dd59 |
children |
0e18cc5ab726 |
(ns caves.world)
; Constants -------------------------------------------------------------------
(def world-size [160 50])
; Data structures -------------------------------------------------------------
(defrecord World [tiles])
(defrecord Tile [kind glyph color])
(def tiles
{:floor (new Tile :floor "." :white)
:wall (new Tile :wall "#" :white)
:bound (new Tile :bound "X" :black)})
(defn get-tile [tiles x y]
(get-in tiles [y x] (:bound tiles)))
; Debugging -------------------------------------------------------------------
(defn print-row [row]
(println (apply str (map :glyph row))))
(defn print-world [world]
(dorun (map print-row (:tiles world))))
; World generation ------------------------------------------------------------
(defn random-tiles []
(let [[cols rows] world-size]
(letfn [(random-tile []
(tiles (rand-nth [:floor :wall])))
(random-row []
(vec (repeatedly cols random-tile)))]
(vec (repeatedly rows random-row)))))
(defn get-smoothed-tile [block]
(let [tile-counts (frequencies (map :kind block))
floor-threshold 5
floor-count (get tile-counts :floor 0)
result (if (>= floor-count floor-threshold)
:floor
:wall)]
(tiles result)))
(defn block-coords [x y]
(for [dx [-1 0 1]
dy [-1 0 1]]
[(+ x dx) (+ y dy)]))
(defn get-block [tiles x y]
(map (fn [[x y]]
(get-tile tiles x y))
(block-coords x y)))
(defn get-smoothed-row [tiles y]
(mapv (fn [x]
(get-smoothed-tile (get-block tiles x y)))
(range (count (first tiles)))))
(defn get-smoothed-tiles [tiles]
(mapv (fn [y]
(get-smoothed-row tiles y))
(range (count tiles))))
(defn smooth-world [{:keys [tiles] :as world}]
(assoc world :tiles (get-smoothed-tiles tiles)))
(defn random-world []
(let [world (new World (random-tiles))
world (nth (iterate smooth-world world) 0)]
world))