summaryrefslogtreecommitdiff
path: root/scheme/greedy.scm
diff options
context:
space:
mode:
authorBradley Smith2008-01-21 00:16:45 +0000
committerBradley Smith2008-01-21 00:16:45 +0000
commite6e7222d5a730368ed4e84c2e0f55427460e5230 (patch)
treee608410401099ccebe7ffa21de9336d78c78efc9 /scheme/greedy.scm
downloadgnurobots-e6e7222d5a730368ed4e84c2e0f55427460e5230.tar.gz
Imported GNU robots from CVS.
Signed-off-by: Bradley Smith <brad@brad-smith.co.uk>
Diffstat (limited to 'scheme/greedy.scm')
-rw-r--r--scheme/greedy.scm112
1 files changed, 112 insertions, 0 deletions
diff --git a/scheme/greedy.scm b/scheme/greedy.scm
new file mode 100644
index 0000000..79a57f8
--- /dev/null
+++ b/scheme/greedy.scm
@@ -0,0 +1,112 @@
+;;;
+;;; Greedy robot for GNU Robots 0.77
+;;; 1998-08-15 by Kyle Hasselbacher <kyle@toehold.com>
+;;;
+
+;;; Greedy Robot wanders around looking for food and valuable prizes.
+;;; The definitions for thing-one and thing-two determine which it thinks
+;;; is more important (thing-one is).
+;;; It's not always very efficient in its gathering and can easily walk in
+;;; a circle if it can't see anything worth grabbing. It also assumes that
+;;; there is nothing interesting behind it, and that's not always true.
+;;; It treats baddies and walls the same way in that they are not
+;;; food, prizes, or open space. It just avoids running into them.
+
+(define thing-one "food")
+(define thing-two "prize")
+
+;;; If something interesting has been spotted, in-sights holds the name
+;;; of the thing we're headed for. Once it's grabbed, we set! in-sights
+;;; back to #f. Using the variable saves us a little energy since we don't
+;;; have to keep looking at the same thing over and over.
+(define in-sights #f)
+
+;;; grab a single prize (and move onto the space that had it)
+(define (grab)
+ (if (robot-grab)
+ (robot-move 1))
+ (set! in-sights #f))
+
+;;; Look around!
+(define (look-left-right thing)
+ (if (not (equal? in-sights thing))
+ (robot-turn 1))
+ (if (and (not (equal? in-sights thing)) (robot-look thing))
+ (set! in-sights thing))
+ (if (not (equal? in-sights thing))
+ (robot-turn 2))
+ (if (and (not (equal? in-sights thing)) (robot-look thing))
+ (set! in-sights thing)))
+
+(define (seek-thing thing)
+ (if (and (not (equal? in-sights thing)) (robot-look thing))
+ (set! in-sights thing))
+ (look-left-right thing)
+ (if (not (equal? in-sights thing))
+ (robot-turn 1))
+ (equal? in-sights thing))
+
+;;; Book it for a priority-one item. We don't look around for anything
+;;; else, but we do sniff the air for items of the same type we might pass
+;;; on the way.
+(define (get-thing thing)
+ (if (robot-feel thing)
+ (grab)
+ (begin (smell-test thing)
+ (if (robot-move 1)
+ (get-thing thing)))))
+
+;;; This doesn't do any smelling. It's called by smell-test when it thinks
+;;; there might be something to the left (it's already checked to the right).
+(define (smell-behind thing)
+ (robot-turn 2)
+ (if (robot-feel thing)
+ (robot-grab))
+ (robot-turn 1))
+
+;;; This feels to the right and left if it smells the thing its asked about.
+;;; Do the smell test after (robot-feel thing) fails.
+;;; Otherwise you spin around from smelling what's in front of you.
+;;; smell-test does a lot of turning but leaves you facing the same way.
+(define (smell-test thing)
+ (if (robot-smell thing)
+ (begin
+ (robot-turn 1)
+ (if (robot-feel thing)
+ (begin
+ (robot-grab)
+ (if (robot-smell thing)
+ (smell-behind thing)
+ (robot-turn -1)))
+ (smell-behind thing)))))
+
+;;; The drunkard's walk isn't too drunk.
+;;; Without obstructions, it only turns once in a while (1/10 steps).
+(define (drunkard-walk)
+ (if (and (not (= (random 10) 0)) (robot-feel "space"))
+ (robot-move 1)
+ (begin (robot-turn (+ 1 (random 2))) (drunkard-walk))))
+
+;;; The main loop! We go for our thing-one if we can see it. If we can see
+;;; thing-two, we go for that while checking for thing-one. If we can see
+;;; neither, we drunkards-walk one step.
+(define (main-loop)
+ (cond ((seek-thing thing-one)
+ (get-thing thing-one)
+ (set! in-sights #f))
+
+ ((seek-thing thing-two)
+ (if (robot-feel thing-two)
+ (grab)
+ (begin
+ (smell-test thing-two)
+ (robot-move 1))))
+
+ (#t (drunkard-walk)))
+ (main-loop))
+
+;;; Be random
+;(randomize)
+
+;;; Go to it.
+(main-loop)