Skip to content

Instantly share code, notes, and snippets.

@rf-

rf-/core.clj Secret

Created February 24, 2013 03:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rf-/7bdbc47e54ab17188513 to your computer and use it in GitHub Desktop.
Save rf-/7bdbc47e54ab17188513 to your computer and use it in GitHub Desktop.
(ns bottles-and-kegs.core
(:use lamina.core aleph.tcp gloss.core)
(:gen-class))
(defrecord Player [channel id])
(def players (ref '()))
(def player-count (atom 0))
(defn wrap [maybe-seq]
(cond
(seq? maybe-seq) maybe-seq
(nil? maybe-seq) '()
:else (list maybe-seq)))
(defn rotate [seq]
(concat (rest seq) (list (first seq))))
(defn remove-item [coll item]
(remove #(= item %) coll))
(defn add-player [player]
(dosync
(alter players concat (list player))))
(defn rotate-players []
(dosync
(alter players rotate)))
(defn remove-player [player]
(dosync
(alter players remove-item player)))
(defn current-player []
(first @players))
(defn other-players []
(rest @players))
(defn num-active-players []
(count @players))
(defn game-started? []
(> (num-active-players) 1))
(defn is-players-turn? [player]
(= (current-player) player))
(defn send-to [players msg]
(doseq [player (wrap players)]
(enqueue (.channel player) msg)))
(defn announce-message [msg]
(send-to (current-player)
(str "You said " msg "."))
(send-to (other-players)
(str "Player " (.id (current-player)) " said " msg ".")))
(defn advance-turn []
(rotate-players)
(send-to (current-player) "It's your turn to say something."))
(defn handle-message [player msg]
(if (game-started?)
(if (is-players-turn? player)
(do
(announce-message msg)
(advance-turn))
(send-to player "Hey, it isn't your turn!"))
(send-to player "Sorry, the game hasn't started yet.")))
(defn handle-quit [player]
(if (is-players-turn? player)
(advance-turn))
(remove-player player))
(defn handler [channel client-info]
(let [identifier (swap! player-count inc)
player (Player. channel identifier)]
(add-player player)
(receive-all channel #(handle-message player %))
(on-closed channel #(handle-quit player))))
(defn -main [& args]
(start-tcp-server handler
{:port 7535, :frame (string :utf-8 :delimiters ["\r\n"])}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment