home *** CD-ROM | disk | FTP | other *** search
- 0 0
- 1 0 PROCEDURE CHASER;
- 2 0
- 3 0 {
- 4 0
- 5 0 Based on a C-Robot by Kazuhiro Yabe
- 6 0
- 7 0 }
- 8 0
- 9 0 VAR
- 10 0 save_dmg : Integer;
- 11 0 cur_dmg : Integer;
- 12 0 speed : Integer;
- 13 0 dir : Integer;
- 14 0 Range : Integer;
- 15 0 degree : Integer;
- 16 0
- 17 0 PROCEDURE chkdmg;
- 18 0 BEGIN
- 19 0 cur_dmg := damage;
- 20 3 IF (cur_dmg <> save_dmg) THEN
- 21 7 BEGIN
- 22 7 save_dmg := cur_dmg;
- 23 10 speed := 50; {maximum speed that robot can still turn}
- 24 13 dir := Random(359);
- 25 17 END;
- 26 17 END; {chkdmg}
- 27 17
- 28 17 PROCEDURE walking;
- 29 18 BEGIN
- 30 18 speed := 50; {maximum speed that robot can still turn}
- 31 21 IF (loc_x < 200) THEN dir := 0
- 32 27 ELSE IF (loc_x > 800) THEN dir := 180
- 33 35 ELSE IF (loc_y < 200) THEN dir := 90
- 34 43 ELSE IF (loc_y > 800) THEN dir := 270;
- 35 52 drive(dir, speed);
- 36 55 END; {walking}
- 37 55
- 38 55 PROCEDURE shoot;
- 39 56 VAR return : Boolean;
- 40 56 BEGIN
- 41 56 return := False;
- 42 59 REPEAT
- 43 59 REPEAT
- 44 59 Range := scan(degree, 10);
- 45 64 IF (Range > 0) THEN
- 46 68 BEGIN
- 47 68 cannon(degree, Range); {while he's there, shoot at him. }
- 48 71 drive(degree, 100); {charge foe at top speed!}
- 49 74 return := True;
- 50 77 END;
- 51 77 UNTIL Range = 0;
- 52 81 IF (degree >= 360)
- 53 84 THEN degree := 0
- 54 87 ELSE degree := degree+20;
- 55 94 walking;
- 56 97 UNTIL return;
- 57 99 END; {shoot}
- 58 99
- 59 99 BEGIN {Chaser Main}
- 60 100
- 61 100 speed := 50; {maximum speed that robot can still turn}
- 62 103 dir := 0;
- 63 106 degree := 0;
- 64 109 save_dmg := damage;
- 65 112
- 66 112 REPEAT { Until Dead or Winner }
- 67 112 shoot;
- 68 114 chkdmg;
- 69 116 walking; { move at max speed that can still turn }
- 70 118 UNTIL Dead OR Winner;
- 71 122
- 72 122 END; { end of Chaser main }
- 73 122
- 74 122
- 75 122
- 76 122 PROCEDURE M66;
- 77 123 { Based on C-Robot M66 : programmed by OBI-ONE }
- 78 123
- 79 123 VAR
- 80 123 drv_dir : Integer; { drive direction }
- 81 123 scn_dir : Integer; { scan direction }
- 82 123 step : Integer; { scan step }
- 83 123 degs : Integer; { half of scan step }
- 84 123 Range : ARRAY[-2..2] OF Integer; { range to oponent }
- 85 123 range_sv : Integer; { range of last scan }
- 86 123 found : Boolean; { foe found ? }
- 87 123 x, y : Integer;
- 88 123
- 89 123 PROCEDURE Move;
- 90 123 BEGIN
- 91 123 x := loc_x;
- 92 126 y := loc_y;
- 93 129 IF (x < 200)
- 94 132 THEN drv_dir := Random(45)
- 95 136 ELSE IF (x > 800) THEN drv_dir := Random(45)+180;
- 96 148
- 97 148 IF (y < 200)
- 98 151 THEN drv_dir := Random(45)+90
- 99 156 ELSE IF (y > 800) THEN drv_dir := Random(45)+270;
- 100 169
- 101 169 drive(drv_dir, 100);
- 102 172 END; {Move}
- 103 172
- 104 172 PROCEDURE attack;
- 105 173 VAR I, Pick : Integer;
- 106 173 BEGIN
- 107 173 cannon(scn_dir, range_sv); {shoot at last foe postion}
- 108 176 Pick := 99;
- 109 179 FOR I := -2 TO 2 DO
- 110 184 BEGIN
- 111 184 Range[I] := scan(scn_dir+step*I, degs);
- 112 195 IF Range[I] > 40 THEN
- 113 202 BEGIN
- 114 202 Pick := I;
- 115 205 I := 2;
- 116 208 END;
- 117 208 END;
- 118 209 IF Pick <> 99 THEN
- 119 213 BEGIN
- 120 213 found := True;
- 121 216 range_sv := Range[Pick];
- 122 222 scn_dir := scn_dir+step*Pick;
- 123 229 cannon(scn_dir, range_sv);
- 124 232 END
- 125 232 ELSE scn_dir := scn_dir+120;
- 126 238 END; {Attack}
- 127 238
- 128 238 BEGIN {M66 Main}
- 129 239 drv_dir := Random(360); { initialize }
- 130 243 scn_dir := drv_dir+120;
- 131 248 found := False;
- 132 251 range_sv := 700;
- 133 254 step := 20;
- 134 257 degs := step DIV 2;
- 135 262
- 136 262 REPEAT { main loop }
- 137 262
- 138 262 { drive at full speed. }
- 139 262 { when close to wall, turn around at random. }
- 140 262
- 141 262 Move;
- 142 264
- 143 264 { scan every 20 degrees resolution. }
- 144 264 { if you find a foe, then attack it with your cannon. }
- 145 264
- 146 264 attack;
- 147 266
- 148 266 UNTIL Dead OR Winner; { end of main loop }
- 149 270
- 150 270 END; {M66 Main}
- 151 270 PROCEDURE Ninja;
- 152 271
- 153 271 { Author unknown }
- 154 271
- 155 271 { Based on C-Robot Ninja }
- 156 271
- 157 271 { Locks on to a target and attacks }
- 158 271
- 159 271 VAR vector : Integer; { current attack vector }
- 160 271
- 161 271
- 162 271 PROCEDURE charge(vec, Range, maxspd : Integer); { charge at an enemy }
- 163 271 { vec : attack vector to use }
- 164 271 { range : range to target }
- 165 271 { maxspd : maximum speed to use }
- 166 271 BEGIN
- 167 271 IF (Range > 40) AND (Range < 800) THEN { good shooting range }
- 168 279 cannon(vec, Range); { fire! }
- 169 282 drive(vec, maxspd); { charge! }
- 170 285 END; { charge }
- 171 285
- 172 285
- 173 285 FUNCTION Pin(vec : Integer) : Integer; { pin down a target }
- 174 286 { vec : initial vector }
- 175 286 VAR
- 176 286 tv : Integer; { trial vector }
- 177 286 ts : Integer; { trial scan results }
- 178 286 n : Integer; { index }
- 179 286 return : Integer;
- 180 286 BEGIN
- 181 286 tv := vec-10; { coarse screen }
- 182 291 n := 2;
- 183 294 ts := scan(tv, 10);
- 184 299 WHILE (n > 0) AND (ts = 0) DO
- 185 307 BEGIN
- 186 307 tv := tv+20;
- 187 312 n := n-1;
- 188 317 ts := scan(tv, 10);
- 189 322 END;
- 190 323 IF ts = 0
- 191 325 THEN return := 0
- 192 329 ELSE BEGIN
- 193 331 charge(tv, ts, 50);
- 194 337
- 195 337 tv := tv-10; { medium screen }
- 196 342 n := 4;
- 197 345 ts := scan(tv, 5);
- 198 350 WHILE (n > 0) AND (ts = 0) DO
- 199 358 BEGIN
- 200 358 tv := tv+10;
- 201 363 n := n-1;
- 202 368 ts := scan(tv, 5);
- 203 373 END;
- 204 374
- 205 374 IF ts = 0
- 206 376 THEN return := 0
- 207 380 ELSE BEGIN
- 208 382 charge(tv, ts, 50);
- 209 388
- 210 388 tv := tv-4; { fine screen }
- 211 393 n := 3;
- 212 396 ts := scan(tv, 2);
- 213 401 WHILE (n > 0) AND (ts = 0) DO
- 214 409 BEGIN
- 215 409 tv := tv-4;
- 216 414 n := n-1;
- 217 419 ts := scan(tv, 2);
- 218 424 END;
- 219 425
- 220 425 IF ts = 0
- 221 427 THEN return := 0
- 222 431 ELSE BEGIN { found it! }
- 223 433 return := ts; { say how far away it is }
- 224 436 vector := tv;
- 225 439 END;
- 226 439 END; { fine screen }
- 227 439 END; { medium screen }
- 228 439
- 229 439 Pin := return;
- 230 442 END; { Pin }
- 231 442
- 232 442
- 233 442 PROCEDURE attack;
- 234 443 VAR
- 235 443 Range : Integer; { range to locked target }
- 236 443 return : Boolean;
- 237 443 BEGIN
- 238 443 return := False;
- 239 446 REPEAT
- 240 446 Range := scan(vector, 0);
- 241 451 IF (Range > 0)
- 242 454 THEN charge(vector, Range, 100) { got him! }
- 243 459 ELSE IF Pin(vector) = 0 THEN { lost him! }
- 244 469 return := True; { can't find him }
- 245 472 UNTIL return;
- 246 474 END; { Attack }
- 247 474
- 248 474
- 249 474 FUNCTION Find : Integer; { find a new target }
- 250 475 VAR
- 251 475 off : Integer; { offset }
- 252 475 dir : Boolean; { direction }
- 253 475 tv : Integer; { trial vector }
- 254 475 return : Integer;
- 255 475
- 256 475 BEGIN {Find}
- 257 475 off := 180; { half circle sweep }
- 258 478 dir := False; { counter-clockwise first }
- 259 481 tv := (vector+180) MOD 360; { look behind us first }
- 260 488 return := 0; {no target found - default}
- 261 491
- 262 491 WHILE (off >= 0) AND (return = 0) DO { full scan }
- 263 499 BEGIN
- 264 499 IF (scan(tv, 10) > 0) THEN { see anyone? }
- 265 505 return := Pin(tv); { nail him! }
- 266 511 dir := NOT dir;
- 267 515 IF dir { alternate sides }
- 268 515 THEN BEGIN
- 269 517 off := off-20;
- 270 522 tv := vector+off;
- 271 527 END
- 272 527 ELSE tv := vector-off+360;
- 273 535 tv := tv MOD 360;
- 274 540 END;
- 275 541
- 276 541 Find := return;
- 277 544 END; {Find}
- 278 544
- 279 544
- 280 544 BEGIN {Ninja Main}
- 281 545 vector := Random(360);
- 282 549 REPEAT
- 283 549 IF (speed = 0) THEN drive(vector, 30)
- 284 556 ELSE IF (Find > 0)
- 285 561 THEN attack { if we see anyone attack }
- 286 562 ELSE vector := Random(360);
- 287 569 UNTIL Dead OR Winner;
- 2