Skip to content

Instantly share code, notes, and snippets.

@sudodoki
Created June 30, 2014 23:03
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 sudodoki/61666a9fe7e1ec49f420 to your computer and use it in GitHub Desktop.
Save sudodoki/61666a9fe7e1ec49f420 to your computer and use it in GitHub Desktop.
Cljs following of https://hexlet.org/open_lectures/clojure_rpg/ instructions
(ns rpg.core)
(enable-console-print!)
(def max-lvl 10)
;; lvl(integer) -> att(integer)
;; given lvl calculate attack by formula
;; att = lvl * 2
(defn calc-attack
[lvl]
(* lvl 6))
;; lvl(integer) -> def(integer)
;; given lvl calculate defence by formula
;; def = lvl * 1.5
(defn calc-defense
[lvl]
(int (* lvl 1.5)))
;; lvl(integer) -> hp(integer)
;; hp = lvl * 20
(defn calc-hitpoints
[lvl]
(* lvl 20))
(defn calc-sides
[lvl]
(if (> lvl 5) 4 6))
(defn kill-negative
[n]
(if (neg? n) 0 n))
(defn calc-base-damage
[att def]
(kill-negative (- att def)))
;; given number of sides roll the dice
;; sides(int) -> roll dice(int)
(defn roll-dice
[sides]
(inc (rand-int sides)))
(defn create-character
[name lvl]
{:name name
:lvl lvl
:att (calc-attack lvl)
:def (calc-defense lvl)
:hp (calc-hitpoints lvl)})
(defn real-damage
[base sides]
(let [rd (roll-dice sides)
s (/ sides 2)]
(cond
(<= rd s) (int (/ base 2))
(= rd sides) (* base 2)
(> rd s) base)))
;;from(character) + to(character)
;; [damage(integer), chracter]
(defn take-damage
[from to]
(let [bd (calc-base-damage (:att from) (:def to))
s (calc-sides (:lvl from))
rd (real-damage bd s)]
[rd, (update-in to [:hp] #(- % rd))]))
(defn log-template [a b c]
(str "Character " a " received " b " damage.
His new life is " c "."))
(defn print-battle-log
[damage character]
(let [name (:name character)
newhp (:hp character)
; no format in cljs, see http://dev.clojure.org/jira/browse/CLJS-324
s (log-template name damage newhp)]
(println s)))
(defn print-winner
[p-hp e-hp]
(if (<= p-hp 0)
(println "Enemy won.")
(println "Player won.")))
(defn game-logic
[config]
(loop [player (:player config)
enemy (:enemy config)
round 1]
(if (or (<= (:hp player) 0)
(<= (:hp enemy) 0))
(print-winner (:hp player) (:hp enemy))
(let [pl-en (take-damage player enemy)
en-pl (take-damage enemy player)]
(do
(println (str "Round " round ":"))
(print-battle-log (pl-en 0) (pl-en 1))
(print-battle-log (en-pl 0) (en-pl 1))
(recur (en-pl 1) (pl-en 1) (inc round)))))))
(def player (create-character "Robert" 6))
(def troll (create-character "Troll" 2))
(def big-troll (create-character "Troll" 2))
(def config
{:player (create-character "John" 3)
:enemy big-troll})
(game-logic config)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment