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 clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
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)))

Reply via email to