Carp/examples/ant.carp

121 lines
3.1 KiB
Plaintext
Raw Normal View History

2017-12-24 20:36:34 +03:00
(use Int)
(use Double)
(use Array)
(load "sdl.carp")
(load "sdl_image.carp")
2017-12-25 18:35:00 +03:00
(load "Debug.carp")
(Debug.sanitize-addresses)
2017-12-24 20:36:34 +03:00
(deftype State
[width Int
height Int
grid (Array Bool)
x Int
y Int
dir Int])
(defn coord-to-index [state x y]
2018-02-05 13:14:13 +03:00
(+ (* y @(State.width state)) x))
2017-12-24 20:36:34 +03:00
(defn get-square [state x y]
@(nth (State.grid state) (coord-to-index state x y)))
(defn draw [rend state]
(do
(SDL_SetRenderDrawBlendMode rend SDL_BLENDMODE_ADD)
(SDL_SetRenderDrawColor rend 0 0 0 0)
(SDL_RenderClear rend)
2018-02-05 13:14:13 +03:00
(for [y 0 @(State.height state)]
(for [x 0 @(State.width state)]
(let [w (/ 800 @(State.width state))
h (/ 600 @(State.height state))]
2017-12-24 20:36:34 +03:00
(do
(cond
2018-02-05 13:14:13 +03:00
(and (= x @(State.x state)) (= y @(State.y state))) (SDL_SetRenderDrawColor rend 255 0 0 255)
2017-12-24 20:36:34 +03:00
(get-square state x y) (SDL_SetRenderDrawColor rend 0 0 0 255)
(SDL_SetRenderDrawColor rend 255 255 255 255))
(SDL_RenderFillRect rend (address (make-rect (* x w) (* y h) (dec w) (dec h))))))))
(SDL_RenderPresent rend)
))
(defn handle-events [app rend]
(let [event (SDL_Event_init)]
(while (SDL_PollEvent (address event))
(let [et (event-type &event)]
(cond (= et SDL_QUIT) (quit app)
())))))
(defn flip-at-ant [state]
2018-02-05 13:14:13 +03:00
(let [x @(State.x &state)
y @(State.y &state)
2017-12-24 20:36:34 +03:00
n (coord-to-index &state x y)
b (nth (State.grid &state) n)]
(do (aset! (State.grid &state) n (not @b))
state)))
(defn turn-left [dir]
(if (= dir 3) 0 (inc dir)))
(defn turn-right [dir]
(if (= dir 0) 3 (dec dir)))
(defn move-ant [state]
2018-02-05 13:14:13 +03:00
(let [x @(State.x &state)
y @(State.y &state)
2017-12-24 20:36:34 +03:00
n (coord-to-index &state x y)
b (nth (State.grid &state) n)
2018-02-05 13:14:13 +03:00
dir @(State.dir &state)
2017-12-24 20:36:34 +03:00
new-dir (if @b (turn-left dir) (turn-right dir))
new-x (case new-dir
0 (inc x)
2 (dec x)
x)
new-y (case new-dir
1 (inc y)
3 (dec y)
y)]
(=> state
(State.set-x new-x)
(State.set-y new-y)
(State.set-dir new-dir))))
(defn tick [state]
(=> state
2017-12-24 20:36:34 +03:00
(move-ant)
(flip-at-ant)))
(defn create-state []
(let [w 80
h 60
b false
arr (Array.replicate (* w h) &b)]
(State.init w h arr (/ w 2) (/ h 2) 0)))
2018-01-23 16:20:35 +03:00
(defn-do main []
(Debug.log-memory-balance! true)
2017-12-24 20:36:34 +03:00
(let [app (app-init @"Langton's Ant" 800 600)
rend (app-renderer app)
state (create-state)]
(while true
(do
(handle-events &app rend)
(draw rend &state)
(set! state (tick state))
2017-12-24 20:36:34 +03:00
(SDL_Delay 2)))))
2017-12-25 18:51:23 +03:00
;; Just the model
2017-12-25 18:52:00 +03:00
;; (defn main []
;; (do
;; (Debug.reset-memory-balance!)
;; (let [state (create-state)]
;; (for [i 0 10000]
2017-12-25 18:52:00 +03:00
;; (do
;; (set! state (tick state))
2017-12-25 18:52:00 +03:00
;; (IO.println &(str (State.dir &state)))
;; (IO.println &(str (Debug.memory-balance)))
;; (System.sleep-micros 1000)
2017-12-25 18:52:00 +03:00
;; )))
;; (IO.println &(str (Debug.memory-balance)))))