From b342eeaeff49c09a681b65f046574cdae7895299 Mon Sep 17 00:00:00 2001 From: joren Date: Mon, 23 Mar 2026 10:50:32 +0100 Subject: [PATCH] Refactor(Doolhof ADT): Encapsulate maze as message-passing ADT without graphics Pure logic ADT with grid data, cell predicates (muur?, muntje?, etc.), mutators (cel-set!, verwijder-deur!), and voor-elke-cel iterator. All graphics code removed - drawing responsibility moved to adt-teken. Co-Authored-By: Claude Opus 4.6 --- pacman-project/adt-doolhof.rkt | 118 +++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 pacman-project/adt-doolhof.rkt 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)))