I've also updated the code for "modern" Clojure, including stylistic
changes, plus some other changes that turned out to be mostly
gratuitous. Anyway, here it is. To run:
java -cp clojure.jar clojure.lang.Repl snake.clj
--Chouser
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---
(import '(java.awt.event KeyEvent ActionListener KeyListener)
'(javax.swing JPanel JFrame Timer))
(defn gen-apple [] [(rand-int 790) (rand-int 590)])
(def snake (ref {:body (list [10 10]) :dir [10 0]}))
(def apple (ref (gen-apple)))
(def dirs {KeyEvent/VK_LEFT [-10 0] KeyEvent/VK_RIGHT [10 0]
KeyEvent/VK_UP [0 -10] KeyEvent/VK_DOWN [0 10]})
(defn move [{body :body dir :dir :as snake} & [grow]]
(into snake {:body (cons (vec (map #(+ (dir %) ((first body) %)) [0 1]))
(if grow body (butlast body)))}))
(defn turn [snake newdir] (if newdir {:body (:body snake) :dir newdir} snake))
(defn collision? [{[b & bs] :body} a]
(every? #(<= (- (a %) 10) (b %) (+ 10 (a %))) [0 1]))
(let [panel (proxy [JPanel ActionListener KeyListener] []
(paintComponent [g] (proxy-super paintComponent g)
(.fillRect g (@apple 0) (@apple 1) 10 10)
(doseq [p (:body @snake)]
(.fillRect g (p 0) (p 1) 10 10))
(if (collision? @snake @apple)
(dosync (ref-set apple (gen-apple))
(alter snake move true))))
(actionPerformed [e] (dosync (alter snake move)) (.repaint this))
(keyPressed [e] (dosync (alter snake turn (dirs(.getKeyCode e)))))
(keyReleased [e])
(keyTyped [e]))]
(doto panel (.setFocusable true) (.addKeyListener panel))
(doto (JFrame. "Snake") (.add panel) (.setSize 800 600) (.setVisible true))
(.start (Timer. 75 panel)))