(import (scheme base) (scheme write) (pp1 graphics)) ;; 1. Configuration #lang r7rs (define tile-size 40) (define wall-color "blue") (define pellet-color "white") (define pellet-size 10) ; Size of the dot ;; 2. Map Data (1 = Wall, 0 = Pellet) (define map-data '((1 1 1 1 1 1 1 1 1 1) (1 0 0 0 0 0 0 0 0 1) (1 0 1 1 0 0 1 1 0 1) (1 0 1 1 0 0 1 1 0 1) (1 0 0 0 0 0 0 0 0 1) (1 0 1 1 1 1 1 1 0 1) (1 0 0 0 0 0 0 0 0 1) (1 1 1 1 1 1 1 1 1 1))) ;; 3. Setup Window (define screen-width (* 10 tile-size)) (define screen-height (* 8 tile-size)) (define screen (make-window screen-width screen-height "PacMan")) ((screen 'set-background!) "black") (define game-layer ((screen 'new-layer!))) ;; 4. Build Level Function (define (build-level layer grid) (let loop-y ((rows grid) (y 0)) (unless (null? rows) (let loop-x ((cols (car rows)) (x 0)) (unless (null? cols) (let ((val (car cols)) (tile (make-tile tile-size tile-size)[cite_start])) ; Create a fresh transparent tile [cite: 81] (cond ;; CASE 1: WALL ((= val 1) ((tile 'draw-rectangle!) [cite_start]0 0 tile-size tile-size wall-color) [cite: 85] ((tile 'set-x!) (* x tile-size)) ((tile 'set-y!) (* y tile-size)) ((layer 'add-drawable!) [cite_start]tile)) [cite: 158] ;; CASE 2: PELLET (DOT) ((= val 0) ;; Calculate offset to center the dot (let ((offset (/ (- tile-size pellet-size) 2))) ((tile 'draw-ellipse!) [cite_start]offset offset pellet-size pellet-size pellet-color) [cite: 86] ((tile 'set-x!) (* x tile-size)) ((tile 'set-y!) (* y tile-size)) ((layer 'add-drawable!) tile)))) (loop-x (cdr cols) (+ x 1)))) (loop-y (cdr rows) (+ y 1))))) ;; 5. Run it (build-level game-layer map-data) ;; 6. Add Pacman (on top) (generate-mask "/home/joren/Downloads/pp1/PacMan.bmp" "black") ; Ensure background color matches your image (define pacman (make-bitmap-tile "/home/joren/Downloads/pp1/PacMan.bmp" "/home/joren/Downloads/pp1/PacMan_mask.png")) ;; Place Pacman at (1, 1) ((pacman 'set-x!) (* 1 tile-size)) ((pacman 'set-y!) (* 1 tile-size)) ((game-layer 'add-drawable!) pacman)