#lang scribble/manual @title{DynaBlaster: Htdp version of Dynablaster game} @section{How to play} To run the game, type @racketblock[(require (planet "dynablaster.rkt" ("jeeve" "dynablaster.plt" 1 8))) (run)] Use left, right, up and down keys to move blue player in the scene. Drop bombs with space key and attack the red player. Good luck ! @section{Customize the behavior of the robot} @racket[(run my-move-robot-function)] Before, define a basic custom move-robot function. For example : @racketblock[(define (my-move-robot-function r d) (if (empty? r) ;; robot is not dead ? d (if (empty? (sprite-left r (lambda (x) #t) d)) ;; something at left of robot ? (go-left r d) ;; go to left ! d)))] Also, you can start the game in automatically mode, the blue player is controlled by a function like the robot. So you can easily compare the behavior of two algorithms. @racket[(run my-move-robot-function my-move-player-function)] You can use these functions and predicates : @itemlist[ @item{The player and robot sprite : @racket[player robot]} @item{Sprite informations : @racket[sprite-x sprite-y sprite-dx sprite-dy sprite-energy]} @item{Sprite actions : @racket[go-left go-right go-up go-down drop-bomb]} @item{Sprite predicates : @racket[bomb? fire? player? robot? blocked? brick? rock?]} @item{Sprite search : @racket[sprite-left sprite-right sprite-up sprite-down search-sprite]} @item{Distance between two sprites : @racket[distance]} @item{Default move robot function : @racket[move-robot-default]}] Do not hesitate to send me your move-robot functions (@author+email["jeeve" "jvjulien@free.fr"]) @section{Default move-robot fuuction} For information, the default move-robot has only random and defensive behavior. The code corresponding is @racketblock[(define (move-robot-default r d) (let* ([x (random 100)] [danger? (lambda (x) (or (bomb? x) (fire? x)))] [something? (lambda (x) #t)] [escape (lambda (r d) (cond [(not (empty? (sprite-left r danger? d))) (go-right r d)] [(not (empty? (sprite-right r danger? d))) (go-left r d)] [(not (empty? (sprite-up r danger? d))) (go-down r d)] [(not (empty? (sprite-down r danger? d))) (go-up r d)] [(not (empty? (search-sprite (sprite-x r) (sprite-y r) bomb? d))) (cond [(empty? (sprite-left r something? d)) (go-left r d)] [(empty? (sprite-right r something? d)) (go-right r d)] [(empty? (sprite-up r something? d)) (go-up r d)] [(empty? (sprite-down r something? d)) (go-down r d)] [else d])]))]) (if (empty? r) d (cond ; fear of fire [(or (not (empty? (sprite-left r danger? d))) (not (empty? (sprite-right r danger? d))) (not (empty? (search-sprite (sprite-x r) (sprite-y r) bomb? d)))) (if (empty? (sprite-up r something? d)) (go-up r d) (if (empty? (sprite-down r something? d)) (go-down r d) (escape r d)))] [(or (not (empty? (sprite-up r danger? d))) (not (empty? (sprite-down r danger? d))) (not (empty? (search-sprite (sprite-x r) (sprite-y r) bomb? d)))) (if (empty? (sprite-left r something? d)) (go-left r d) (if (empty? (sprite-right r something? d)) (go-right r d) (escape r d)))] ; intention [(and (> x 0) (<= x 10) (empty? (sprite-up r fire? d))) (go-up r d)] [(and (> x 10) (<= x 20) (empty? (sprite-down r fire? d))) (go-down r d)] [(and (> x 20) (<= x 30) (empty? (sprite-left r fire? d))) (go-left r d)] [(and (> x 30) (<= x 40) (empty? (sprite-right r fire? d))) (go-right r d)] [(and (> x 40) (<= x 42) (not (blocked? r d))) (drop-bomb r d)] [else d]))))]