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