Guest User

Untitled

a guest
Sep 13th, 2018
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.67 KB | None | 0 0
  1. (defun dragon-n (string n)
  2.   (if (equal n 0)
  3.       string
  4.       (dragon-n
  5.        (format nil "~{~A~}"
  6.            (loop for item in (coerce string 'list)
  7.                     when (equal item #\a) collect "aRbFR"
  8.                     when (equal item #\b) collect "LFaLb"
  9.                     unless (or (equal item #\a) (equal item #\b)) collect item))
  10.        (- n 1))))
  11.  
  12. (defclass d-screen
  13.                ()
  14.              ((dir :initarg :dir :initform nil)
  15.               (x   :initarg :x   :initform nil)
  16.               (y   :initarg :y   :initform nil)
  17.               (ox  :initarg :ox  :initform nil)
  18.               (oy  :initarg :oy  :initform nil)))
  19.  
  20. (defmethod right ((screen d-screen))
  21.            (with-slots (dir) screen
  22.              (if (equal dir 3)
  23.                  (setf dir 0)
  24.                  (incf dir))))
  25.  
  26. (defmethod left ((screen d-screen))
  27.            (with-slots (dir) screen
  28.              (if (equal dir 0)
  29.                  (setf dir 3)
  30.                  (decf dir))))
  31.  
  32. (defmethod forward ((screen d-screen))
  33.            (with-slots (dir x y ox oy) screen
  34.              (cond ((equal dir 0)
  35.                     (setf oy y)
  36.                     (decf y))
  37.                    ((equal dir 1)
  38.                     (setf ox x)
  39.                     (incf x))
  40.                    ((equal dir 2)
  41.                     (setf oy y)
  42.                     (incf y))
  43.                    ((equal dir 3)
  44.                     (setf ox x)
  45.                     (decf x)))))
  46.  
  47. (defun strip-dragon (string)
  48.   (remove #\a (remove #\b string)))
  49.  
  50. (defun render-dragon (string s)
  51.            (let ((screen (make-instance 'd-screen :dir 0 :x 0 :y 0 :ox 0 :oy 0))
  52.                  (sx (* 1/2 (aref (sdl:video-dimensions) 0)))
  53.                  (sy (* 1/2 (aref (sdl:video-dimensions) 1))))
  54.                (with-slots (dir x y ox oy) screen
  55.                  (loop for item in (coerce string 'list)
  56.                 do (cond ((equal item #\L) (left screen))
  57.                              ((equal item #\R) (right screen))
  58.                              ((equal item #\F)
  59.                               (progn
  60.                                 (forward screen)
  61.                             (sdl:draw-line-* (+ (* ox s) sx) (+ (* oy s) sy) (+ (* x s) sx) (+ (* y s) sy))
  62.                                 (sdl:update-display))))))))
  63.  
  64. (defun dragon-display-loop (string s sizex sizey)
  65.            (sdl:with-init ()
  66.              (sdl:window sizex sizey)
  67.              (render-dragon string s)
  68.              (sdl:with-events ()
  69.            (:quit-event () t)
  70.                (:idle ()
  71.                       (sdl:update-display)))))
  72.  
  73. ;; run with something like (dragon-display-loop (strip-dragon (dragon-n "Fa" 10)) 1 640 480)
Add Comment
Please, Sign In to add comment