diff --git a/pacman-project/adt-doolhof.rkt b/pacman-project/adt-doolhof.rkt new file mode 100644 index 0000000..0420ee2 --- /dev/null +++ b/pacman-project/adt-doolhof.rkt @@ -0,0 +1,118 @@ +#lang r7rs + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Doolhof ADT ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Het doolhof bevat het logische grid met cellen. Elke cel heeft een type +;; (muur, muntje, leeg, sleutel, deur). Dit ADT bevat GEEN grafische code. + +(define-library (pacman-project adt-doolhof) + (import (scheme base) + (pacman-project constanten)) + (export maak-doolhof) + + (begin + + ;; maak-doolhof :: -> doolhof + ;; Maakt een nieuw doolhof-object aan met het volledige grid. + (define (maak-doolhof) + + ;; Het doolhof grid: 31 rijen x 28 kolommen. + ;; vector wordt gebruikt omdat het mutable is (i.t.t. #()). + (define grid + (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 aantal-rijen (vector-length grid)) + (define aantal-kolommen (vector-length (vector-ref grid 0))) + + ;; cel-ref :: number, number -> number + ;; Geeft het celtype terug op de opgegeven positie. + (define (cel-ref rij kolom) + (vector-ref (vector-ref grid rij) kolom)) + + ;; cel-set! :: number, number, number -> / + ;; Past het celtype aan op de opgegeven positie. + (define (cel-set! rij kolom waarde) + (vector-set! (vector-ref grid rij) kolom waarde)) + + ;; muur? :: number, number -> boolean + (define (muur? rij kolom) + (= (cel-ref rij kolom) cel-type-muur)) + + ;; muntje? :: number, number -> boolean + (define (muntje? rij kolom) + (= (cel-ref rij kolom) cel-type-muntje)) + + ;; leeg? :: number, number -> boolean + (define (leeg? rij kolom) + (= (cel-ref rij kolom) cel-type-leeg)) + + ;; sleutel? :: number, number -> boolean + (define (sleutel? rij kolom) + (= (cel-ref rij kolom) cel-type-sleutel)) + + ;; deur? :: number, number -> boolean + (define (deur? rij kolom) + (= (cel-ref rij kolom) cel-type-deur)) + + ;; verwijder-deur! :: number, number -> / + ;; Verwijdert een deur uit het grid (maakt de cel leeg). + (define (verwijder-deur! rij kolom) + (cel-set! rij kolom cel-type-leeg)) + + ;; voor-elke-cel :: (number, number, number -> /) -> / + ;; Itereert over alle cellen en roept de callback op met rij, kolom en celtype. + (define (voor-elke-cel callback) + (do ((rij 0 (+ rij 1))) + ((= rij aantal-rijen)) + (do ((kolom 0 (+ kolom 1))) + ((= kolom aantal-kolommen)) + (callback rij kolom (cel-ref rij kolom))))) + + ;; dispatch-doolhof :: symbol -> any + (define (dispatch-doolhof msg) + (cond ((eq? msg 'rijen) aantal-rijen) + ((eq? msg 'kolommen) aantal-kolommen) + ((eq? msg 'cel-ref) cel-ref) + ((eq? msg 'cel-set!) cel-set!) + ((eq? msg 'muur?) muur?) + ((eq? msg 'muntje?) muntje?) + ((eq? msg 'leeg?) leeg?) + ((eq? msg 'sleutel?) sleutel?) + ((eq? msg 'deur?) deur?) + ((eq? msg 'verwijder-deur!) verwijder-deur!) + ((eq? msg 'voor-elke-cel) voor-elke-cel) + (else (error "Doolhof ADT -- Onbekend bericht:" msg)))) + + dispatch-doolhof)))