#lang r7rs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Pac-Man ADT ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Manages the logical state of the player: grid position, direction, and ;; previous position for smooth rendering interpolation. Contains NO ;; graphics code. (define-library (pacman-project adt pacman) (import (scheme base) (pacman-project adt position)) (export make-pacman) (begin ;; make-pacman :: number, number -> pacman ;; Creates a Pac-Man object at the given start position (row, col). (define (make-pacman start-row start-col) (let ((position (make-position start-row start-col)) (direction 'right) (prev-row start-row) (prev-col start-col)) ;; position! :: position -> / (define (position! new-position) (set! position new-position)) ;; direction! :: symbol -> / (define (direction! new-direction) (set! direction new-direction)) ;; move! :: number, number -> / ;; Saves previous position, then moves by delta on the grid. (define (move! delta-row delta-col) (set! prev-row (position 'row)) (set! prev-col (position 'col)) ((position 'row!) (+ (position 'row) delta-row)) ((position 'col!) (+ (position 'col) delta-col))) ;; sync-prev! :: -> / ;; Sets previous position to current. Call after teleportation ;; to prevent interpolation across the map. (define (sync-prev!) (set! prev-row (position 'row)) (set! prev-col (position 'col))) ;; dispatch-pacman :: symbol -> any (define (dispatch-pacman msg) (cond ((eq? msg 'position) position) ((eq? msg 'position!) position!) ((eq? msg 'direction) direction) ((eq? msg 'direction!) direction!) ((eq? msg 'move!) move!) ((eq? msg 'prev-row) prev-row) ((eq? msg 'prev-col) prev-col) ((eq? msg 'sync-prev!) sync-prev!) (else (error "Pac-Man ADT -- Unknown message:" msg)))) dispatch-pacman))))