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)))