cylon.c  <rrognlie@gamerz.net>

//  Randomly move around the arena.  While moving, scan back and forth up 
//  to 45 degrees (like the cylon robots from "Battlestar Galactica".  
//  If it sees something, it shoots it...

#include "robots.h"

int Distance(int x1, int y1, int x2, int y2)
{
    int dx = x1-x2;
    int dy = y1-y2;
    return sqrt(dx*dx + dy*dy);
}

void Goto(int x, int y)
{
    int dir = atan2(y-loc_y(),x-loc_x());
    int dist = Distance(x,y,loc_x(),loc_y());
    int t = time();
    int sc = 0;
    int sd = 1;
    int range=0;

    drive(dir,100);

    while (speed() && time()-t < dist) {
        if (abs(sc) == 45)
            sd *= -1;
        sc += 3*sd;
        range = scan(dir+sc,5);
        if (range > 200 && range < 7000)
            cannon(dir+sc,range);
        int tdir = atan2(y-loc_y(),x-loc_x());
        if (tdir != dir)
            drive(dir=tdir,100);
    }

    drive(dir,0);
    while (speed())
        ;
}

int main()
{
    while (1)
        Goto(rand(9000)+500,rand(9000)+500);
}

tracker.c  <rrognlie@gamerz.net>

// 1) Move around the arena in a box pattern.  Full speed.  staying
//    about 2000 units inside from the wall.
// 2) Scan for a target, and shoot it.  If you had seen a target, and
//    have lost sight, back up the scan a bit and continue scanning.

#include "robots.h"

#define BORDER 2000

// Shoot at a target if it's in range (<= 7000 units) *and* it's far
// enough away that we'll only be slightly damaged (>200 units) by the
// resulting explosion.
inline void shoot(int dir,int range)
{
   if (range > 200 && range <= 7000)
      cannon(dir,range);
}

int main()
{
   int sdir=0;     // current scan direction
   int dir=0;      // current movement direction
   int range;      // range to opponent
   int hadfix=0;   // did I have a fix on my opponent from the last scan?
   int cx,cy;      // current x and y position

   drive(dir,100); // start moving right away.  Don't *ever* sit still!

   while (1) {
      int tdir=dir;    // save current direction
      cx = loc_x();
      cy = loc_y();

      // do we need to change direction?  (e.g.  are we approaching a wall?)
      if (cx > 10000-BORDER)
         if (cy < 10000-BORDER)
             tdir = 90;              // approaching east wall
         else
             tdir = 180;             // approaching northeast corner
      else if (cx < BORDER)
         if (cy < BORDER)
             tdir = 0;               // approaching southwest corner
         else
             tdir = 270;             // approaching west wall
      else if (cy > 10000-BORDER)
         tdir = 180;                 // approaching north wall
      else if (cy < BORDER)
         tdir = 0;                   // approaching south wall

      // if speed() == 0,    restart the drive unit...
      // if dir != tdir,     we need to change direction...
      if (!speed() || dir != tdir)
         drive(dir=tdir,100);

      if ((range=scan(sdir,10))) {   // scan for a target...
         shoot(sdir,range);          //   got one.  shoot it!
         hadfix=1;                   //   remember we saw a target
      }
      else if (hadfix) {             //   did we lose a target?
         sdir += 40;                 //        back up the scan
         hadfix=0;                   //        forget we had a target
      }
      else
         sdir -= 20;                 //   increment the scan
   }
}