1 How to play
2 Game configuration
3 Customize the behavior of the robot
4 Default move-robot function
Version: 5.0.2

DynaBlaster: Htdp version of Dynablaster game

1 How to play

To run the game, type

  (require (planet "dyna.rkt" ("jeeve" "dynablaster.plt" 1 13)))
  (run) ; or (run #:sound #f) to play without sound effect

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 !

If you want to see the computer play alone, type

  (require (planet "dyna.rkt" ("jeeve" "dynablaster.plt" 1 13)))
  (run move-robot-default move-robot-default)

2 Game configuration

(run #:config (struct-copy configuration (game-size 20 15) [title "my dyna game"]))

3 Customize the behavior of the robot

(run my-move-robot-function)

Before, define a custom move-robot function. For example :

  (define (my-move-robot-function f-r d c)
    (let ([r (f-r d)])
      (if (empty? r) ; robot is not dead ?
          (if (empty? (sprite-left r (lambda (x) #t) d c)) ; something at left of robot ?
              (go-left r d c) ; go to left !

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.

(run my-move-robot-function my-move-player-function)

You can use these functions and predicates :

Do not hesitate to send me your move-robot functions (jeeve <jvjulien@free.fr>)

4 Default move-robot function

For information, the default move-robot has only random and defensive behavior. The code corresponding is

  (define (move-robot-default f-r d c)
    (let* ([r (f-r d)]
           [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 c))) (go-right r d c)]
                           [(not (empty? (sprite-right r danger? d c))) (go-left r d c)]
                           [(not (empty? (sprite-up r danger? d c))) (go-down r d c)]
                           [(not (empty? (sprite-down r danger? d c)))  (go-up r d c)]
                           [(not (empty? (search-sprite (sprite-x r) (sprite-y r) bomb? d c)))
                            (cond  [(empty? (sprite-left r something? d c)) (go-left r d c)]
                                   [(empty? (sprite-right r something? d c)) (go-right r d c)]
                                   [(empty? (sprite-up r something? d c)) (go-up r d c)]
                                   [(empty? (sprite-down r something? d c)) (go-down r d c)]
                                   [else d])]))])
      (if (empty? r)
            ; fear of fire
            [(or (not (empty? (sprite-left r danger? d c)))
                 (not (empty? (sprite-right r danger? d c)))
                 (not (empty? (search-sprite (sprite-x r) (sprite-y r) bomb? d c))))
             (if (empty? (sprite-up r something? d c))
                 (go-up r d c)
                 (if (empty? (sprite-down r something? d c))
                     (go-down r d c)
                     (escape r d)))]
            [(or (not (empty? (sprite-up r danger? d c)))
                 (not (empty? (sprite-down r danger? d c)))
                 (not (empty? (search-sprite (sprite-x r) (sprite-y r) bomb? d c))))
             (if (empty? (sprite-left r something? d c))
                 (go-left r d c)
                 (if (empty? (sprite-right r something? d c))
                     (go-right r d c)
                     (escape r d)))]
            ; intention
            [(and (> x 0) (<= x 10) (empty? (sprite-up r fire? d c))) (go-up r d c)]
            [(and (> x 10) (<= x 20) (empty? (sprite-down r fire? d c))) (go-down r d c)]
            [(and (> x 20) (<= x 30) (empty? (sprite-left r fire? d c))) (go-left r d c)]
            [(and (> x 30) (<= x 40) (empty? (sprite-right r fire? d c))) (go-right r d c)]
            [(and (> x 40) (<= x 42) (not (blocked? r d c))) (drop-bomb r d c)]
            [else d]))))