Clojureで七並べ序章

;全自動モード (def AUTO_MODE false) ;プレイヤー人数 (def PLAYER_NUMB […]

;全自動モード (def AUTO_MODE false) ;プレイヤー人数 (def PLAYER_NUMB […]

;
(def AUTO_MODE false)
;
(def PLAYER_NUMBER 4)
;
(def PASS_NUMBER 3)
;
(def TrumpCard-suitStrs ["▲" "▼" "◆" "■" "Jo" "JO"])
(def TrumpCard-powerStrs ["" "" "" "" "" "" "" "" "" "10" "" "" "" "KR"])
(def TrumpCard-suits 4)
(def TrumpCard-powers 13)
(defrecord TrumpCard[name suit power])
(defn make-TrumpCard[suit power]
(let [name (str (nth TrumpCard-suitStrs suit) (nth TrumpCard-powerStrs power))]
(TrumpCard. name suit power)
)
)
;
(defprotocol ITrumpDeck
(-count[self])
(-shuffle[self])
(draw[self])
)
(defrecord TrumpDeck[__g __deck] ITrumpDeck
(-count[self]
(count @__deck)
)
(-shuffle[self]
(swap! __deck shuffle)
)
(draw[self]
(let [card (nth @__deck @__g)]
(swap! __g inc)
card
)
)
)
(defn make-TrumpDack[& {:keys [jokers] :or {jokers 0}}]
(let [
deck (vec(concat
(apply concat (for[suit (range TrumpCard-suits)]
(for[power (range TrumpCard-powers)]
(make-TrumpCard suit power)
)
))
(for[jokers (range jokers)]
(make-TrumpCard (+ TrumpCard-suits jokers) TrumpCard-powers)
)))
]
(TrumpDeck. (atom 0) (atom deck))
)
)
;
(defprotocol IPlayer
(sortDeck[self])
(addCard[self card])
(removeCard[self cardName])
(existCard[self cardName])
(gameOut[self])
)
(def MPlayer{
:sortDeck (fn[self]
(let [sortValue (fn[v] (+(*(:suit v) TrumpCard-powers) (:power v)))]
(swap! (:deck self) #(sort-by sortValue %1))
)
)
:addCard (fn[self card]
(swap! (:deck self) #(cons card %1))
)
:removeCard (fn[self cardName]
(swap! (:deck self) #(remove (fn[card] (= cardName (:name card))) %1))
)
:existCard (fn[self cardName]
(keep-indexed (fn[index card] (if(= cardName (:name card)) index)) @(:deck self))
)
:gameOut (fn[self]
(reset! (:isGameOut self) true)
)
})
(defrecord Player[deck id name isGameOut])
(extend Player IPlayer MPlayer)
(defn make-Player[id name]
(Player. (atom '()) id name (atom false))
)
;
(loop[i 0](when(< i 100)
(println)
(recur(inc i))))
(print "
/---------------------------------------/
/ /
/---------------------------------------/
")
(let [
trp (make-TrumpDack)
p (atom '())
pid (atom 0)
]
(-shuffle trp)
(loop[i 0](when(< i PLAYER_NUMBER)
(swap! p #(cons (make-Player @pid (str "Player " (inc @pid))) %1))
(swap! pid inc)
(recur(inc i))))
(swap! p reverse)
(loop[i 0](when(< i (-count trp))
(addCard (nth @p (mod i PLAYER_NUMBER)) (draw trp))
(recur(inc i))))
(doseq[pl @p]
(sortDeck pl)
(printf "\n%s\n" (:name pl))
(doseq[card @(:deck pl)]
(print (:name card))
)
)
)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX