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