129 lines
5.0 KiB
Racket
129 lines
5.0 KiB
Racket
#lang r7rs
|
|
|
|
; Maze ADT ;
|
|
|
|
|
|
(define-library (pacman-project maze)
|
|
(import (scheme base)
|
|
(pp1 graphics)
|
|
(pacman-project screen))
|
|
|
|
(export maze-rows
|
|
maze-cols
|
|
cell-size
|
|
maze-offset-y
|
|
cell-ref
|
|
cell-set!
|
|
cell-wall?
|
|
cell-coin?
|
|
cell-empty?
|
|
cell-key?
|
|
cell-door?
|
|
draw-maze!
|
|
remove-door!)
|
|
|
|
(begin
|
|
|
|
;conmstanten
|
|
(define cell-size 24)
|
|
(define maze-offset-y 97) ;offsets om de maze mooi te kunnen plaatsen
|
|
(define maze-size-offset 6)
|
|
|
|
;we maken een maze aan van 31 rijen x 28 kolommen
|
|
;vector ipv #() omda vector mutable is en #() ni.
|
|
|
|
;0 = muntje
|
|
;1 = muur
|
|
;2 = leeg
|
|
;3 = sleutel
|
|
;4 = deur
|
|
(define maze
|
|
(vector (vector 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
|
(vector 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1)
|
|
(vector 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 1 4 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1)
|
|
(vector 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1)
|
|
(vector 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1)
|
|
(vector 2 2 2 2 2 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 2 2 2 2 2)
|
|
(vector 2 2 2 2 2 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 2 2 2 2 2)
|
|
(vector 2 2 2 2 2 1 0 1 1 0 1 1 1 4 4 1 1 1 0 1 1 0 1 2 2 2 2 2)
|
|
(vector 1 1 1 1 1 1 0 1 1 0 1 2 2 2 2 2 2 1 0 1 1 0 1 1 1 1 1 1)
|
|
(vector 2 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 2)
|
|
(vector 1 1 1 1 1 1 0 1 1 0 1 2 2 2 2 2 2 1 0 1 1 0 1 1 1 1 1 1)
|
|
(vector 2 2 2 2 2 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 2 2 2 2 2)
|
|
(vector 2 2 2 2 2 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 2 2 2 2 2)
|
|
(vector 2 2 2 2 2 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 2 2 2 2 2)
|
|
(vector 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1)
|
|
(vector 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1)
|
|
(vector 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1)
|
|
(vector 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1)
|
|
(vector 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1)
|
|
(vector 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1)
|
|
(vector 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 4 1 0 0 0 0 0 0 1)
|
|
(vector 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 1 0 1)
|
|
(vector 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1)
|
|
(vector 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1)
|
|
(vector 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)))
|
|
|
|
(define maze-rows (vector-length maze))
|
|
(define maze-cols (vector-length (vector-ref maze 0)))
|
|
|
|
|
|
;geeft waarde terug v/e cell
|
|
(define (cell-ref row col)
|
|
(vector-ref (vector-ref maze row) col))
|
|
|
|
;past waarde aan v/e cell
|
|
(define (cell-set! row col value)
|
|
(vector-set! (vector-ref maze row) col value))
|
|
|
|
(define (cell-wall? row col)
|
|
(= (cell-ref row col) 1))
|
|
|
|
(define (cell-coin? row col)
|
|
(= (cell-ref row col) 0))
|
|
|
|
(define (cell-empty? row col)
|
|
(= (cell-ref row col) 2))
|
|
|
|
(define (cell-key? row col)
|
|
(= (cell-ref row col) 3))
|
|
|
|
(define (cell-door? row col)
|
|
(= (cell-ref row col) 4))
|
|
|
|
|
|
(define maze-layer (make-new-layer!))
|
|
(define maze-tile (make-tile screen-width screen-height))
|
|
((maze-layer 'add-drawable!) maze-tile)
|
|
|
|
;tekent de maze
|
|
(define (draw-maze!)
|
|
(do ((row 0 (+ row 1)))
|
|
((= row maze-rows))
|
|
(do ((col 0 (+ col 1)))
|
|
((= col maze-cols))
|
|
(let ((cell (cell-ref row col)))
|
|
(cond
|
|
((= cell 1)
|
|
((maze-tile 'draw-rectangle!) (* col cell-size) (+ (* row cell-size) maze-offset-y) (- cell-size maze-size-offset) (- cell-size maze-size-offset) "blue"))
|
|
((= cell 4)
|
|
((maze-tile 'draw-rectangle!) (* col cell-size) (+ (* row cell-size) maze-offset-y) (- cell-size maze-size-offset) (- cell-size maze-size-offset) "pink"))))))) ;we tekenen hier ook de deuren aangezien ze deel uitmaken van de maze
|
|
|
|
(draw-maze!)
|
|
|
|
;verwijdert een deur uit de maze
|
|
(define (remove-door! row col)
|
|
(cell-set! row col 2)
|
|
((maze-tile 'draw-rectangle!)
|
|
(* col cell-size)
|
|
(+ (* row cell-size) maze-offset-y)
|
|
(- cell-size maze-size-offset)
|
|
(- cell-size maze-size-offset)
|
|
"black"))))
|