Fix replicant example
This commit is contained in:
parent
31b3719920
commit
b01eb6b5eb
5 changed files with 9 additions and 9 deletions
41
resources/public/cljs/replicant_tictactoe/game.cljs
Normal file
41
resources/public/cljs/replicant_tictactoe/game.cljs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
;; COPIED FROM https://github.com/cjohansen/replicant-tic-tac-toe/blob/7a33fb12f0cd6658b2f555ff673dee031d4aa921/src/tic_tac_toe/game.cljs
|
||||
|
||||
(ns replicant-tictactoe.game)
|
||||
|
||||
(defn create-game [{:keys [size]}]
|
||||
{:next-player :x
|
||||
:size size})
|
||||
|
||||
(def next-player {:x :o, :o :x})
|
||||
|
||||
(defn winner? [tics path]
|
||||
(when (= 1 (count (set (map tics path))))
|
||||
path))
|
||||
|
||||
(defn get-winning-path [{:keys [size tics]} y x]
|
||||
(or (winner? tics (mapv #(vector y %) (range 0 size)))
|
||||
(winner? tics (mapv #(vector % x) (range 0 size)))
|
||||
(when (= y x)
|
||||
(winner? tics (mapv #(vector % %) (range 0 size))))))
|
||||
|
||||
(defn maybe-conclude [game y x]
|
||||
(if-let [path (get-winning-path game y x)]
|
||||
(-> (dissoc game :next-player)
|
||||
(assoc :over? true
|
||||
:victory {:player (get-in game [:tics [y x]])
|
||||
:path path}))
|
||||
(let [tie? (= (count (:tics game)) (* (:size game) (:size game)))]
|
||||
(cond-> game
|
||||
tie? (dissoc :next-player)
|
||||
tie? (assoc :over? true)))))
|
||||
|
||||
(defn tic [game y x]
|
||||
(let [player (:next-player game)]
|
||||
(if (or (get-in game [:tics [y x]])
|
||||
(<= (:size game) x)
|
||||
(<= (:size game) y))
|
||||
game
|
||||
(-> game
|
||||
(assoc-in [:tics [y x]] player)
|
||||
(assoc :next-player (next-player player))
|
||||
(maybe-conclude y x)))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue