39 lines
1.2 KiB
Clojure
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}))
|