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