Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
(ns s-and-l.main)
#?(:cljs (set! *print-fn* #(.log js/console %)))
#?(:cljs (def log print))
#?(:clj (def log println))
(def max-board-value 100)
(defn roll-dice []
(-> #?(:cljs (.random js/Math) :clj (java.lang.Math/random))
(* 100)
int
(rem 6)
(+ 1)))
(def board {03 10, 18 51, 26 04,
32 62, 37 80, 44 91,
56 22, 60 89, 97 15})
(defn climb-or-drop-position [current-position]
(let [next-position (board current-position current-position)]
(if-not (= current-position next-position)
(log "And we've been promoted/demoted from " current-position " to " next-position))
next-position))
(defn get-next-position [current-position dice-value]
(let [provisional-position (+ current-position dice-value)]
(if (> provisional-position max-board-value)
current-position
(climb-or-drop-position provisional-position))))
(defonce ^:dynamic *player-positions* (atom {}))
(defn create-players [num-players]
(reset! *player-positions* (zipmap (iterate inc 0) (take num-players (iterate identity 0)))))
(defn game-over? []
(some #(= max-board-value (second %)) @*player-positions*))
(defn update-player-position [player-number new-position]
(swap! *player-positions* assoc player-number new-position))
(defn play [player]
(let [dice-value (roll-dice)]
(log (str "Player " player " rolled dice to get " dice-value))
(update-player-position player (get-next-position (@*player-positions* player) dice-value))))
(defn ^:export play-a-game [num-players]
(let [_ (create-players num-players)]
(loop [player 0]
(play player)
(if (game-over?)
(log (str "Game over. Player " player " won."))
(recur (rem (inc player) num-players))))))
(defn -main [& args]
(let [num-players (str (or (first args) "2"))]
(play-a-game #?(:cljs (js/parseInt num-players) :clj (java.lang.Integer/parseInt num-players)))))
#?(:cljs (set! *main-cli-fn* -main))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment