From 22394aae502bff7a6194177f77e1cb107d451faf Mon Sep 17 00:00:00 2001 From: joren Date: Mon, 23 Mar 2026 10:51:06 +0100 Subject: [PATCH] Refactor(Sleutel ADT): Encapsulate key as message-passing ADT without graphics Pure logic ADT with positie, opgepakt? predicate, pak-op! mutator. Random placement logic uses doolhof ADT. No graphics code. Co-Authored-By: Claude Opus 4.6 --- pacman-project/adt-sleutel.rkt | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 pacman-project/adt-sleutel.rkt diff --git a/pacman-project/adt-sleutel.rkt b/pacman-project/adt-sleutel.rkt new file mode 100644 index 0000000..61f73b8 --- /dev/null +++ b/pacman-project/adt-sleutel.rkt @@ -0,0 +1,56 @@ +#lang r7rs + +(#%require (only racket/base random)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Sleutel ADT ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; De sleutel is een object dat op een willekeurige positie in het doolhof +;; geplaatst wordt. Wanneer Pac-Man de sleutel oppakt, worden deuren geopend. +;; Bevat GEEN grafische code. + +(define-library (pacman-project adt-sleutel) + (import (scheme base) + (pacman-project constanten) + (pacman-project adt-positie)) + (export maak-sleutel) + + (begin + + ;; maak-sleutel :: doolhof -> sleutel + ;; Maakt een sleutel aan en plaatst deze op een willekeurige muntje-positie. + (define (maak-sleutel doolhof) + (let ((positie #f) + (opgepakt? #f)) + + ;; plaats-willekeurig! :: -> / + ;; Plaatst de sleutel op een willekeurige cel waar een muntje staat. + (define (plaats-willekeurig!) + (let loop ((pogingen 0)) + (if (>= pogingen max-plaatsing-pogingen) + (error "Geen geldige positie gevonden voor sleutel") + (let ((kolom (random 0 (doolhof 'kolommen))) + (rij (random 0 (doolhof 'rijen)))) + (if ((doolhof 'muntje?) rij kolom) + (begin + (set! positie (maak-positie rij kolom)) + ((doolhof 'cel-set!) rij kolom cel-type-sleutel)) + (loop (+ pogingen 1))))))) + + ;; pak-op! :: -> / + ;; Markeert de sleutel als opgepakt. + (define (pak-op!) + (set! opgepakt? #t)) + + ;; Initialisatie: plaats de sleutel direct bij aanmaak. + (plaats-willekeurig!) + + ;; dispatch-sleutel :: symbol -> any + (define (dispatch-sleutel msg) + (cond ((eq? msg 'positie) positie) + ((eq? msg 'opgepakt?) opgepakt?) + ((eq? msg 'pak-op!) pak-op!) + (else (error "Sleutel ADT -- Onbekend bericht:" msg)))) + + dispatch-sleutel))))