mirror of
https://github.com/richardharrington/robotwar.git
synced 2024-09-29 07:55:24 +00:00
got terminal animation almost working, without being able to set frame rate
This commit is contained in:
parent
088fbea98e
commit
f90b7c37a0
@ -4,6 +4,7 @@
|
|||||||
:license {:name "Eclipse Public License"
|
:license {:name "Eclipse Public License"
|
||||||
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
||||||
:dependencies [[org.clojure/clojure "1.5.1"]
|
:dependencies [[org.clojure/clojure "1.5.1"]
|
||||||
[org.clojure/core.match "0.2.0-rc5"]]
|
[org.clojure/core.match "0.2.0-rc5"]
|
||||||
|
[clj-time "0.5.1"]]
|
||||||
:profiles {:dev {:dependencies [[midje "1.5.1"]]}}
|
:profiles {:dev {:dependencies [[midje "1.5.1"]]}}
|
||||||
:main robotwar.core)
|
:main robotwar.core)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
(ns robotwar.world
|
(ns robotwar.world
|
||||||
(:use [clojure.string :only [join]])
|
(:use [clojure.string :only [join]])
|
||||||
(:require [robotwar.robot :as robot]))
|
(:require [clj-time.core :as time]
|
||||||
|
[clj-time.periodic :as periodic]
|
||||||
|
[robotwar.robot :as robot]))
|
||||||
|
|
||||||
(defn init-world
|
(defn init-world
|
||||||
"initialize all the variables for a robot world."
|
"initialize all the variables for a robot world."
|
||||||
@ -36,6 +38,14 @@
|
|||||||
[world tick-duration]
|
[world tick-duration]
|
||||||
(iterate #(tick-world % tick-duration) world))
|
(iterate #(tick-world % tick-duration) world))
|
||||||
|
|
||||||
|
(defn world-seq
|
||||||
|
"returns a world-sequence. keeps the tick-duration field
|
||||||
|
as a key instead of just passing it to iterate-worlds and forgetting it,
|
||||||
|
because it's needed later for rendering."
|
||||||
|
[world tick-duration]
|
||||||
|
{:worlds (iterate-worlds world tick-duration)
|
||||||
|
:tick-duration tick-duration})
|
||||||
|
|
||||||
(defn get-world
|
(defn get-world
|
||||||
"convenience function for identifying a world in a sequence of worlds
|
"convenience function for identifying a world in a sequence of worlds
|
||||||
by its round idx (where one round means all the robots have stepped)
|
by its round idx (where one round means all the robots have stepped)
|
||||||
@ -51,21 +61,39 @@
|
|||||||
|
|
||||||
(defn arena-text-grid
|
(defn arena-text-grid
|
||||||
"outputs the arena, with borders"
|
"outputs the arena, with borders"
|
||||||
[{:keys [width height robots]} output-width output-height]
|
[{:keys [width height robots]} print-width print-height]
|
||||||
(let [horiz-border-char "-"
|
(let [horiz-border-char "-"
|
||||||
vert-border-char "+"
|
vert-border-char "+"
|
||||||
header-footer (apply str (repeat (+ output-width 2) horiz-border-char))
|
header-footer (apply str (repeat (+ (* print-width 3) 2) horiz-border-char))
|
||||||
scale-x #(* % (/ output-width width))
|
scale-x #(* % (/ print-width width))
|
||||||
scale-y #(* % (/ output-height height))
|
scale-y #(* % (/ print-height height))
|
||||||
field (for [y (range output-height), x (range output-width)]
|
field (for [y (range print-height), x (range print-width)]
|
||||||
(or (some (fn [{:keys [icon pos-x pos-y]}]
|
(or (some (fn [{:keys [icon pos-x pos-y]}]
|
||||||
(when (near-point [(scale-x pos-x) (scale-y pos-y)] [x y])
|
(when (near-point [(scale-x pos-x) (scale-y pos-y)] [x y])
|
||||||
icon))
|
(str "(" icon ")")))
|
||||||
robots)
|
robots)
|
||||||
" "))]
|
" "))]
|
||||||
(str header-footer
|
(str header-footer
|
||||||
"\n"
|
"\n"
|
||||||
(join "\n" (map #(join (apply str %) (repeat 2 vert-border-char))
|
(join "\n" (map #(join (apply str %) (repeat 2 vert-border-char))
|
||||||
(partition output-width field)))
|
(partition print-width field)))
|
||||||
"\n"
|
"\n"
|
||||||
header-footer)))
|
header-footer)))
|
||||||
|
|
||||||
|
(defn animate
|
||||||
|
"takes a world-sequence and animates it,
|
||||||
|
using the :tick-duration to set the frame rate"
|
||||||
|
[{:keys [worlds tick-duration]} print-width print-height]
|
||||||
|
(let [frame-rate (Math/round (/ 1 tick-duration))]
|
||||||
|
(doseq [[world idx next-tick] (map
|
||||||
|
vector
|
||||||
|
worlds
|
||||||
|
(range)
|
||||||
|
(periodic/periodic-seq
|
||||||
|
(time/now)
|
||||||
|
(time/secs tick-duration)))]
|
||||||
|
(println (arena-text-grid world print-width print-height))
|
||||||
|
(println "Animation frame rate:" frame-rate)
|
||||||
|
(println "World-tick number:" idx)
|
||||||
|
)))
|
||||||
|
;(Thread/sleep (* (time/in-secs (time/interval (time/now) next-tick)) 1000)))))
|
||||||
|
@ -27,3 +27,7 @@
|
|||||||
RANDOM TO A
|
RANDOM TO A
|
||||||
RANDOM TO A
|
RANDOM TO A
|
||||||
RANDOM TO A ")
|
RANDOM TO A ")
|
||||||
|
|
||||||
|
(def speedy-program
|
||||||
|
" 70 TO SPEEDX
|
||||||
|
140 TO SPEEDY ")
|
||||||
|
Loading…
Reference in New Issue
Block a user