/* MARVIN - the not-so-paranoid robot */ /* Created by: /* Andrew Broding c/o the TASK Robot Development Factory */ /* 3/7/86 */ int degree; /* degree for motion */ int course; /* degree for firing */ main() { int old_dam; /* last damage check */ int range; int res; int srdegree; res = 10; /* scan resolotion */ degree = 180; /* initialize degree */ srdegree = degree; /* initialize cannon */ chkloc(); /* out of bounds ? */ while(1) { old_dam = damage(); while(old_dam == damage()) { chkloc(); /* out of bounds ? */ drive(degree,100); course = srdegree; /* set fire direction to current scan */ while(((range = scan(srdegree,res)) > 0) && old_dam == damage()) { /* shoot while you can */ if(range>40 && range<800) /* good shooting range */ { hitem(); srdegree = course; } if(!chkloc()) /* change direction if necessary */ drive(degree,100); } srdegree = srdegree - 20; /* next degree to scan */ } degree -= 90; /* try again */ } } /* end of main */ hitem() /* hit a target */ { int fdeg; /* fire degree */ int frange; /* firing range */ int index; fdeg = course - 5; /* set resolution to +- 5 */ index = 2; while(index && !(frange=scan(fdeg,5))) { fdeg += 10; --index; } if(!frange) /* lost him */ return 0; if(frange>40 && frange<800) /* good shooting range */ cannon(fdeg,frange); fdeg -= 4; /* set resolution +- 1 */ index = 4; while(index && !(frange=scan(fdeg,1))) { fdeg += 3; --index; } if(!frange) /* lost him */ return 0; if(frange>40 && frange<800) /* good shooting range */ cannon(fdeg,frange); fdeg -= 1; /* set resolution +- 0 */ index = 3; while(index && !(frange=scan(fdeg,0))) { ++fdeg; --index; } if(!frange) /* lost him */ return 0; if(frange>40 && frange<800) /* good shooting range */ { cannon(fdeg,frange); cannon(fdeg,frange); } course = fdeg; return frange; } chkloc() /* redirect robot to new degree if its nearing a wall */ { if(loc_x() < 200) /* left side */ { if(loc_y() < 200) /* bottom left */ degree = 45; else { if(loc_y() > 800) /* top left */ degree = 315; else degree = 0; } return(0); } if (loc_x() > 800) /* right side */ { if(loc_y() < 200) /* bottom right */ degree = 125; else { if(loc_y() > 800) /* top right */ degree = 225; else degree = 180; } return(0); } if(loc_y() < 200) /* bottom side */ { if(loc_x() < 200) degree = 45; else { if(loc_x() > 800) degree = 125; else degree = 90; } return(0); } if (loc_y() > 800) /* top side */ { if(loc_x() < 200) degree = 315; else { if(loc_x() > 800) degree = 225; else degree = 270; } return(0); } return(1); }