crobs/robbie.r

001/* robbie the robot                                            */
002/*                                                             */
003/* Programmer: Bob Guerin                                      */
004/*             4935 Niagara Ave, No. 13                        */
005/*             San Diego, CA 92107                             */
006/*                                                             */
007/* Strategy:                                                   */
008/*           1. Robot moves in clockwise square pattern and    */
009/*              moves diagonally when nearing walls.           */
010/*           2. Robot speed is 100, except when turning, when  */
011/*              speed is reduced to 49.                        */
012/*           3. Robot scans in 20 degree increments until a    */
013/*              target is located.                             */
014/*           4. When target is located, a second scan is done  */
015/*              to narrow the target bearing to +/- 5 degrees. */
016/*           5. Robot calculates firing range based on the     */
017/*              range difference of the two scans and (range   */
018/*              at last scan / 256).                           */
019/*           6. When target is found, the robot will "lock" on */
020/*              to it by constantly changing its scan angle.   */
021/*           7. When target lost during scan, robot checks 180 */
022/*              degrees behind direction of movement.          */
023 
024/* external variables (can be used by any function) */
025 
026int x, y;           /* current x,y position of robot */
027int range;          /* range to target */
028int dir;            /* direction of movement */
029int quadrant;       /* quadrant robot is located */
030int scandir;        /* scan direction */
031int vel;            /* velocity */
032 
033 
034/* main */
035main()
036{
037 
038  /* set initial course */
039  new_course();
040 
041  while (1)                        /* loop is executed forever */
042  {
043    check_pos();
044    range = scan(scandir,10);
045    if (range > 0)
046    {
047      shoot();
048    }
049    scandir = (scandir + 20) % 360;
050  }
051/* end of main */
052 
053/* check for side wall */
054check_pos()
055{
056  if (speed() == 0)
057    drive(dir,vel);
058  if (quadrant == 0)
059  {
060    x = loc_x();
061    if (x > 850)
062      if (x > 900 || speed() < 50)
063      {
064        drive(90,100);
065        quadrant = 1;
066        dir = 90;
067        vel = 100;
068      }
069      else
070      {
071        drive(45,49);
072        dir = 45;
073        vel = 49;
074      }
075  }
076  else
077    if (quadrant == 1)
078    {
079      y = loc_y();
080      if (y > 850)
081        if (y > 900 || speed() < 50)
082        {
083          drive(180,100);
084          quadrant = 2;
085          dir = 180;
086          vel = 100;
087        }
088        else
089        {
090          drive(135,49);
091          dir = 135;
092          vel = 49;
093        }
094    }
095    else
096      if (quadrant == 2)
097      {
098        x = loc_x();
099        if (x < 150)
100          if (x < 100 || speed() < 50)
101          {
102            drive(270,100);
103            quadrant = 3;
104            dir = 270;
105            vel = 100;
106          }
107          else
108          {
109            drive(225,49);
110            dir = 225;
111            vel = 49;
112          }
113      }
114      else
115      {
116        y = loc_y();
117        if (y < 150)
118          if (y < 100 || speed() < 50)
119          {
120            drive(0,100);
121            quadrant = 0;
122            dir = 0;
123            vel = 100;
124          }
125          else
126          {
127            drive(315,49);
128            dir = 315;
129            vel = 49;
130          }
131      }
132}
133 
134/* new course function to find direction to move */
135new_course()
136{
137 
138  x = loc_x();
139  y = loc_y();
140  if (x > 500)
141    if (y > 500)
142      dir = 180;
143    else
144      dir = 90;
145  else
146    if (y > 500)
147      dir = 270;
148    else
149      dir = 0;
150  drive(dir,100);
151 
152  /* initialize variables */
153  scandir = dir;
154  quadrant = dir / 90;
155  vel = 100;
156 
157/* end of new_course */
158 
159/* shoot at target while in range */
160shoot()
161{
162  int angle;                    /* fire angle */
163  int dif;                      /* range difference */
164  int range1;                   /* range for second shot */
165  int range2;                   /* range at second scan */
166  while (range > 0)             /* keep firing while in range */
167  {
168    angle = scandir+5;
169    range2 = scan(angle,5);
170    if (range2 == 0)
171    {
172      angle = scandir-5;
173      range2 = scan(angle,5);
174    }
175    if (range2 > 0)
176    {
177      dif = range - range2;
178      range = range2 - ((range2 * dif) / 256);
179      range1 = range - dif;
180      if (range <= 700)
181      {
182        if (range < 41) range = 41;
183        cannon(angle,range);        /* fire */
184      }
185      if (range1 <= 700)
186      {
187        if (range1 < 41) range1 = 41;
188        cannon(angle,range1);       /* fire */
189      }
190    }
191    range = scan(scandir,10);
192    check_pos();
193    if (range == 0)
194    {
195      scandir = (dir + 180) % 360;
196      range = scan(scandir,10);
197      if (range == 0)
198        scandir = angle;
199    }
200    else
201      scandir = angle;
202  }
203}