From e6e7222d5a730368ed4e84c2e0f55427460e5230 Mon Sep 17 00:00:00 2001 From: Bradley Smith Date: Mon, 21 Jan 2008 00:16:45 +0000 Subject: Imported GNU robots from CVS. Signed-off-by: Bradley Smith --- scheme/greedy.scm | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 scheme/greedy.scm (limited to 'scheme/greedy.scm') 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 +;;; + +;;; 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) -- cgit v1.1