Skip to content

Instantly share code, notes, and snippets.

@heidisu
Last active September 20, 2016 21:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heidisu/f721f87e552bb285649b39358cddc3cc to your computer and use it in GitHub Desktop.
Save heidisu/f721f87e552bb285649b39358cddc3cc to your computer and use it in GitHub Desktop.
#lang racket
(require 2htdp/universe)
(require 2htdp/image)
(require lang/posn)
(define speed 5)
(define (create-snake-scene snake)
(place-images (create-rectangles (length snake)) (create-positions snake) (rectangle 500 500 "solid" "white")))
(define (create-positions l)
(map (lambda (x) (make-posn (car x) (cadr x))) l))
(define (create-rectangles n)
(build-list n (lambda (x) (rectangle 10 10 "solid" "green"))))
(define snake0 (list (list 40 250 'e) (list 30 250 'e) (list 20 250 'e) (list 10 250 'e) (list 0 250 'e)))
(define (update snake)
(let ([fst (first snake)])
(cons (create-dir-snake-piece fst (caddr fst)) (take snake (- (length snake) 1)))))
(define (update-dir snake dir)
(cons (create-dir-snake-piece (first snake) dir) (take snake (- (length snake) 1))))
(define (create-dir-snake-piece l dir)
(let ([x (car l)]
[y (cadr l)])
(case dir
['e (list (+ x speed) y dir)]
['w (list (- x speed) y dir)]
['s (list x (+ y speed) dir)]
['n (list x (- y speed) dir)]
)))
(define (change-dir snake key)
(cond
[(key=? key "left") (update-dir snake 'w)]
[(key=? key "right")(update-dir snake 'e)]
[(key=? key "up")(update-dir snake 'n)]
[(key=? key "down")(update-dir snake 's)]))
(big-bang snake0 (to-draw create-snake-scene) (on-tick update) (on-key change-dir))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment