Created
November 16, 2009 15:15
-
-
Save cgrand/236050 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
(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