Skip to content

Instantly share code, notes, and snippets.

@cgrand
Created November 16, 2009 15:15
Show Gist options
  • Save cgrand/236050 to your computer and use it in GitHub Desktop.
Save cgrand/236050 to your computer and use it in GitHub Desktop.
(import '(javax.swing JFrame JPanel)
'(java.awt Color Graphics2D))
(defn spawn? [rows i]
(let [w (count (first rows))]
(= 2 (count (for [j [(mod (inc i) w) i (mod (dec i) w)]
r rows :when (= :on (r j))] r)))))
(defn step1 [rows]
(let [current (second rows)]
(loop [i (dec (count current)), row (transient current)]
(if (neg? i)
(persistent! row)
(let [c (current i)]
(cond
(= c :on)
(recur (dec i) (assoc! row i :dying))
(= c :dying)
(recur (dec i) (assoc! row i :off))
(spawn? rows i)
(recur (dec i) (assoc! row i :on))
:else
(recur (dec i) row)))))))
(defn step [board]
(vec (map step1
(partition 3 1 (concat [(peek board)] board [(first board)])))))
(defn dims [[row :as board]] [(count row) (count board)])
(defn render-board [board #^Graphics2D g cell-size]
(let [[w h] (dims board)]
(doto g
(.setColor Color/BLACK)
(.scale cell-size cell-size)
(.fillRect 0 0 w h))
(doseq [i (range h) j (range w)]
(when-let [color ({:on Color/WHITE :dying Color/GRAY} ((board i) j))]
(doto g
(.setColor color)
(.fillRect j i 1 1))))))
(defn blank-board [w h]
(vec (repeat h (vec (repeat w :off)))))
(defn rand-board [w h]
(vec (map vec (partition w (take (* w h) (repeatedly #(if (zero? (rand-int 3)) :on :off)))))))
(defn start-brian [board cell-size]
(let [switch (atom true)
[w h] (dims board)
board (atom board)
panel (doto (proxy [JPanel] []
(paint [g] (render-board @board g cell-size)))
(.setDoubleBuffered true))]
(doto (JFrame.)
(.addWindowListener (proxy [java.awt.event.WindowAdapter] []
(windowClosing [_] (reset! switch false))))
(.setSize (* w cell-size) (* h cell-size))
(.add panel)
.show)
(future (while @switch (swap! board step)))
(future (while @switch (.repaint panel) (Thread/sleep 100)))))
(start-brian (rand-board 160 160) 5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment