Skip to content

Instantly share code, notes, and snippets.

@laurentpetit
Created April 25, 2012 15:52
Show Gist options
  • Save laurentpetit/2490821 to your computer and use it in GitHub Desktop.
Save laurentpetit/2490821 to your computer and use it in GitHub Desktop.
Ajout d'un visualiseur swing
;; Pour ajouter un visualiseur Swing
;;
;; 1. coller ce texte à la fin de votre namespace mixit.life
;; 2. evaluer
;; 3. demarrer un visualiseur swing :
;; (swing-board board 7 5)
;; 4. attention, la fenetre swing est peut etre cachee derriere votre fenetre Eclipse
;; 5. lancer l'animation en calculant 10 générations à partir de l'état init :
;; (play init 20)
(defn str-board
"Represente les cells dans une chaîne
de caractères de largeur w et de hauteur
h."
[cells w h]
(apply str (for [y (range h)
x (range (inc w))]
(cond
(= x w) \newline
(cells [x y]) \O
:else \.))))
(defn pb
"Fonction utilitaire pour afficher
les cellules vivantes pour la plage
7 5"
[cells]
(print (str-board cells 7 5)))
(def poll-period 40)
(def continue? true)
(defn swing-board
"Affiche la plage [w h] de cellules vivantes dans un
TextArea Swing, en allant toutes les poll-period millisecondes
recuperer la valeur de r et en l'affichant."
[r w h]
(let [t (doto (javax.swing.JTextArea. "" h w)
(.setFont (java.awt.Font/decode "Monospaced 48")))
j (doto (javax.swing.JFrame. "Jeu de la vie")
(.add t)
.pack
.show)]
(future (while continue?
(Thread/sleep poll-period)
(.setText t (str-board @r w h))))))
(def board "atom dans lequel on stocke la valeur courante a afficher"
(atom #{}))
(def sleep "Temps d'attente(ms) avant de calculer l'etat suivant du jeu"
200)
(defn play
"En partant d'un etat initial init du jeu, calcule times etats
suivants, et met a jour la variable board a intervalles sleep."
[init times]
(future
(reset! board init)
(dotimes [_ times]
(Thread/sleep sleep)
(swap! board step))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment