Refactor(Tijdslimiet ADT): Encapsulate time limit as message-passing ADT
Pure logic ADT with verlaag!/verhoog! mutators, tijd-op? predicate, and formatteer-tijd method. No graphics code. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
63
pacman-project/adt-tijdslimiet.rkt
Normal file
63
pacman-project/adt-tijdslimiet.rkt
Normal file
@@ -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))))
|
||||
Reference in New Issue
Block a user