home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MISC / EDUCATIO / PROBOTS.ZIP / LISTING.TXT < prev    next >
Encoding:
Text File  |  1990-09-04  |  10.9 KB  |  289 lines

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