diff --git a/pacman-project/adt-positie.rkt b/pacman-project/adt-positie.rkt new file mode 100644 index 0000000..ef9af86 --- /dev/null +++ b/pacman-project/adt-positie.rkt @@ -0,0 +1,52 @@ +#lang r7rs + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Positie ADT ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Een positie stelt een locatie voor op het logische grid van het doolhof. +;; Coordinaten zijn in grid-eenheden (rij, kolom), NIET in pixels. + +(define-library (pacman-project adt-positie) + (import (scheme base)) + (export maak-positie) + + (begin + + ;; maak-positie :: number, number -> positie + ;; Maakt een nieuw positie-object aan met rij en kolom op het grid. + (define (maak-positie rij kolom) + + ;; rij! :: number -> / + ;; Past de rij-coordinaat aan. + (define (rij! nieuwe-rij) + (set! rij nieuwe-rij)) + + ;; kolom! :: number -> / + ;; Past de kolom-coordinaat aan. + (define (kolom! nieuwe-kolom) + (set! kolom nieuwe-kolom)) + + ;; vergelijk? :: positie -> boolean + ;; Controleert of twee posities dezelfde coordinaten hebben. + (define (vergelijk? andere-positie) + (and (= rij (andere-positie 'rij)) + (= kolom (andere-positie 'kolom)))) + + ;; beweeg :: number, number -> positie + ;; Geeft een nieuwe positie terug verschoven met delta-rij en delta-kolom. + (define (beweeg delta-rij delta-kolom) + (maak-positie (+ rij delta-rij) + (+ kolom delta-kolom))) + + ;; dispatch-positie :: symbol -> any + (define (dispatch-positie msg) + (cond ((eq? msg 'rij) rij) + ((eq? msg 'kolom) kolom) + ((eq? msg 'rij!) rij!) + ((eq? msg 'kolom!) kolom!) + ((eq? msg 'vergelijk?) vergelijk?) + ((eq? msg 'beweeg) beweeg) + (else (error "Positie ADT -- Onbekend bericht:" msg)))) + + dispatch-positie)))