#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)))