RosettaCodeData/Task/Rock-paper-scissors/Clojure/rock-paper-scissors.clj
2023-07-01 13:44:08 -04:00

39 lines
1.2 KiB
Clojure

(ns rps.core
(:require [clojure.data.generators :refer [weighted]])
(:import jline.Terminal)
(:gen-class))
(def what-beats {:rock :paper, :paper :scissors, :scissors :rock})
(defn battle [human comp]
(let [h (name human)
c (name comp)]
(cond
(= human comp) (println (format "We both picked %s. DRAW!" c))
(= human (what-beats comp))
(println (format "Your %s defeats computer's %s. YOU WIN!" h c))
(= comp (what-beats human))
(println (format "Computer's %s defeats your %s. YOU LOSE!" c h))
:else (println (format "Wat? %s and %s ?" h c)))))
(defn key->rps [k]
(cond
(or (= k 82) (= k 114)) :rock
(or (= k 80) (= k 112)) :paper
(or (= k 83) (= k 115)) :scissors
:else nil))
(defn play-game [freqs]
(println "\n(R)ock, (P)aper, (S)cissors?")
(let [term (Terminal/getTerminal)
rps (key->rps (.readCharacter term System/in))]
(if-not (nil? rps)
(do
(battle rps (what-beats (weighted freqs)))
(recur (assoc freqs rps (inc (rps freqs)))))
(println "Game Over Man! Game Over!"))))
(defn -main
"Rock, Paper, Scissors!"
[& args]
(play-game {:rock 1, :paper 1, :scissors 1}))