Created
June 30, 2014 23:03
-
-
Save sudodoki/61666a9fe7e1ec49f420 to your computer and use it in GitHub Desktop.
Cljs following of https://hexlet.org/open_lectures/clojure_rpg/ instructions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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