Skip to content

Instantly share code, notes, and snippets.

@stoeckley
Last active October 19, 2017 21:55
Show Gist options
  • Save stoeckley/c79f25dfddfca297e333f1f2638240f6 to your computer and use it in GitHub Desktop.
Save stoeckley/c79f25dfddfca297e333f1f2638240f6 to your computer and use it in GitHub Desktop.
A hangman port from the Elm Haarlem workshop Hangman, into ClojureScript
(def init {:word "XIMEDES"
:attempts-left 10
:state :playing
:guessed #{}})
(def model (atom init))
(defn show-won []
[:div "Jeej you won!, share it with your friends!"])
(defn show-lost []
[:div "Too bad... you lost"])
(defn show-letter [letter]
[:li (get (:guessed @model) letter "_")])
(defn show-word []
(into [:ul] (map show-letter (:word @model))))
(defn show-attempts-left []
[:div (:attempts-left @model)])
(defn is-correct-guess? [letter]
(some #(= letter %) (:word @model)))
(defn guessed-word? []
(every? #(get (:guessed @model) %) (:word @model)))
(defn receive-letter [letter]
(if (is-correct-guess? letter)
(swap! model update-in [:guessed] conj letter)
(swap! model update-in [:attempts-left] dec))
(when (zero? (:attempts-left @model))
(swap! model assoc :state :lost))
(when (guessed-word?)
(swap! model assoc :state :won)))
(defn show-input []
[:input {:on-change #(receive-letter (upper-case (-> % .-target .-value)))
:value ""}])
(defn show-reset []
[:div [:button {:on-click #(reset! model init)}] "Reset"])
(defn show-playing []
[:div (show-word) (show-attempts-left) (show-input)])
(defn show-state []
(case (:state @model)
:playing (show-playing)
:won (show-won)
:lost (show-lost)))
(defn show-model []
[:div [:h1 "Hangman the game!"]
(show-state)
(show-reset)])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment