diff --git a/pacman-project/adt-tijdslimiet.rkt b/pacman-project/adt-tijdslimiet.rkt new file mode 100644 index 0000000..8a553ce --- /dev/null +++ b/pacman-project/adt-tijdslimiet.rkt @@ -0,0 +1,63 @@ +#lang r7rs + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Tijdslimiet ADT ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Beheert de aftellende tijdslimiet van het spel. Bevat GEEN grafische code. + +(define-library (pacman-project adt-tijdslimiet) + (import (scheme base) + (pacman-project constanten)) + (export maak-tijdslimiet) + + (begin + + ;; maak-tijdslimiet :: -> tijdslimiet + ;; Maakt een nieuw tijdslimiet-object aan. + (define (maak-tijdslimiet) + (let ((resterende-tijd start-tijd-seconden) + (tijd-sinds-laatste-tick 0)) + + ;; verlaag! :: number -> / + ;; Verlaagt de tijd op basis van het aantal verstreken milliseconden. + (define (verlaag! ms) + (set! tijd-sinds-laatste-tick (+ tijd-sinds-laatste-tick ms)) + (when (>= tijd-sinds-laatste-tick ms-per-seconde) + (set! tijd-sinds-laatste-tick 0) + (when (> resterende-tijd 0) + (set! resterende-tijd (- resterende-tijd 1))))) + + ;; verhoog! :: -> / + ;; Verhoogt de resterende tijd met een bonus (bij het eten van een muntje). + (define (verhoog!) + (set! resterende-tijd (+ resterende-tijd tijd-bonus-per-muntje))) + + ;; tijd-op? :: -> boolean + ;; Controleert of de tijd verstreken is. + (define (tijd-op?) + (= resterende-tijd 0)) + + ;; formatteer-tijd :: -> string + ;; Geeft de resterende tijd terug als "m:ss" string. + (define (formatteer-tijd) + (let* ((minuten (quotient resterende-tijd 60)) + (seconden (remainder resterende-tijd 60)) + (min-str (number->string minuten)) + (sec-str (number->string seconden))) + (string-append min-str + ":" + (if (< seconden 10) + (string-append "0" sec-str) + sec-str)))) + + ;; dispatch-tijdslimiet :: symbol -> any + (define (dispatch-tijdslimiet msg) + (cond ((eq? msg 'resterende-tijd) resterende-tijd) + ((eq? msg 'verlaag!) verlaag!) + ((eq? msg 'verhoog!) verhoog!) + ((eq? msg 'tijd-op?) tijd-op?) + ((eq? msg 'formatteer-tijd) formatteer-tijd) + (else (error "Tijdslimiet ADT -- Onbekend bericht:" msg)))) + + dispatch-tijdslimiet))))