(defvar key-left 65361) ;; macroquad input code (defvar key-up 65362) (defvar key-right 65363) (defvar key-down 65364) (defvar gameover ()) (defvar tile-size (list 18.0 24.0)) (defvar subtile-width 5.0) (defvar subtile-height 7.0) (defvar player-direction ()) (defvar player-body (list (list 3 2))) (defvar frame-timer-duration 0.3) (defvar frame-timer 0.0) (defvar fruit-tile (list 4 5)) (defun is-tile-equal? (pos1 pos2) (and (== (car pos1) (car pos2)) (== (cadr pos1) (cadr pos2))) ) (defun sum-pos (pos1 pos2) (list (+ (car pos1) (car pos2)) (+ (cadr pos1) (cadr pos2))) ) (defun tile-to-pos (tile) (list (* (car tile) (car tile-size)) (* (cadr tile) (cadr tile-size))) ) (defun draw-subtile (tile subtile) (defvar offset (tile-to-pos tile)) (mq-draw-rectangle (+ (car offset) (+ (* subtile-width (car subtile)) (car subtile))) (+ (cadr offset) (+ (* subtile-height (cadr subtile)) (cadr subtile))) subtile-width subtile-height) ) (defun draw-fruit (tile) (draw-subtile tile (list 1 0)) (draw-subtile tile (list 2 1)) (draw-subtile tile (list 1 2)) (draw-subtile tile (list 0 1)) ) (defun draw-horizontal-line (tile) (draw-subtile tile (list 0 1)) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 2 1)) ) (defun draw-vertical-line (tile) (draw-subtile tile (list 1 0)) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 1 2)) ) (defun draw-corner-tl (tile) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 2 1)) (draw-subtile tile (list 1 2)) ) (defun draw-corner-tr (tile) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 0 1)) (draw-subtile tile (list 1 2)) ) (defun draw-corner-bl (tile) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 1 0)) (draw-subtile tile (list 2 1)) ) (defun draw-corner-br (tile) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 1 0)) (draw-subtile tile (list 0 1)) ) (defun draw-snake-tile (tile) (defvar offset (tile-to-pos tile)) (mq-draw-rectangle (car offset) (cadr offset) (car tile-size) (cadr tile-size) 0.4) (draw-subtile tile (list 0 0)) (draw-subtile tile (list 1 0)) (draw-subtile tile (list 2 0)) (draw-subtile tile (list 0 1)) (draw-subtile tile (list 1 1)) (draw-subtile tile (list 2 1)) (draw-subtile tile (list 0 2)) (draw-subtile tile (list 1 2)) (draw-subtile tile (list 2 2)) ) (defun process-input () (if (mq-is-key-pressed key-left) (setq player-direction key-left)) (if (mq-is-key-pressed key-right) (setq player-direction key-right)) (if (mq-is-key-pressed key-up) (setq player-direction key-up)) (if (mq-is-key-pressed key-down) (setq player-direction key-down)) ) (defun move-player-body (dir) (setq player-body (move-player-body-aux player-body (sum-pos (car player-body) dir))) ) (defun move-player-body-aux (body pos) (if (not (null (cdr body))) (cons pos (move-player-body-aux (cdr body) (car body))) (cons pos ())) ) (defun push-new-tile () (setq player-body (push-new-tile-aux player-body)) ) (defun push-new-tile-aux (body) (if (null (cdr body)) (list (car body) (car body)) (cons (car body) (push-new-tile-aux (cdr body))) )) (defun check-collision-self () (if (null (cdr player-body)) () (check-collision-self-aux (cdr player-body) (car player-body))) ) (defun check-collision-self-aux (body pos) (if (is-tile-equal? (car body) pos) 1 (if (null (cdr body)) () (check-collision-self-aux (cdr body) pos)) ) ) (defun process-frame () ;; Set frame timer to 0 (game is running at 60 FPS) (setq frame-timer 0.0) ;; Move player (if (== player-direction key-left) (move-player-body (list -1 0)) ) (if (== player-direction key-up) (move-player-body (list 0 -1)) ) (if (== player-direction key-right) (move-player-body (list 1 0)) ) (if (== player-direction key-down) (move-player-body (list 0 1)) ) ;; Check collision with self (if (check-collision-self) (setq gameover 1)) ;; Check collision border (if (or (<= (car (car player-body)) 2) (>= (car (car player-body)) 31) (<= (cadr (car player-body)) 1) (>= (cadr (car player-body)) 22)) (setq gameover 1)) ;; Check collision with fruit (if (is-tile-equal? (car player-body) fruit-tile) (begin (push-new-tile) (setq fruit-tile (list (randi-range 3 30) (randi-range 2 21))))) ) (defun update (dt) (process-input) (setq frame-timer (+ frame-timer dt)) (if (and (not gameover) (> frame-timer frame-timer-duration)) (process-frame)) ) (defun draw () (mapcar (lambda (tile) (draw-snake-tile tile)) player-body) (mapcar (lambda (i) (draw-vertical-line (list 2 i)) (draw-vertical-line (list 31 i))) (range 2 22)) (mapcar (lambda (i) (draw-horizontal-line (list i 1)) (draw-horizontal-line (list i 22))) (range 3 31)) (draw-corner-tl (list 2 1)) (draw-corner-tr (list 31 1)) (draw-corner-bl (list 2 22)) (draw-corner-br (list 31 22)) (draw-fruit fruit-tile) )