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 <noreply@anthropic.com>
This commit is contained in:
56
pacman-project/adt-sleutel.rkt
Normal file
56
pacman-project/adt-sleutel.rkt
Normal file
@@ -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))))
|
||||||
Reference in New Issue
Block a user