home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug086.arc / GAMES.LBR / RABBIT.PZS / RABBIT.PAS
Pascal/Delphi Source File  |  1979-12-31  |  5KB  |  213 lines

  1. program RABBIT;
  2. {Originally in BASIC for VIC-20. Conversion started 3 Sep 87.}
  3. {$R+}
  4.  
  5. const
  6.   radius :integer = 10;
  7.   req_moves :integer = 10;
  8.  
  9. type
  10.   location = record
  11.                x,y :integer;
  12.              end;
  13.  
  14. var
  15.   died, ended, nomore :boolean;
  16.   human, rabbit :location;
  17.   move :integer;
  18.   d :real;
  19.  
  20.  
  21. procedure Instruct;
  22.  
  23. var
  24.   ch :char;
  25.  
  26. begin
  27. writeln('You are in a pit with a man-eating rabbit.');
  28. writeln('The centre is (0,0) and it has a radius of ',radius,'.');
  29. writeln('If you can avoid the rabbit for ',req_moves,' moves you will be released.');
  30. writeln('You and the rabbit can move only one space each, but the rabbit can do');
  31. writeln('multiple jumps.');
  32. writeln('You can travel at these angles: 0, 45, 90, 135, 180, 225, 270, 315, 360.');
  33. writeln; writeln;
  34. write('Press RETURN to begin... ');
  35. readln(ch);
  36. end; (* Instruct *)
  37.  
  38.  
  39. function Distance :real;
  40.  
  41. begin
  42. distance := sqrt(sqr(rabbit.x - human.x) + sqr(rabbit.y - human.y));
  43. end; (* Distance *)
  44.  
  45.  
  46. function Within_Radius (x,y :integer) :boolean;
  47.  
  48. begin
  49. within_radius := sqrt(sqr(x) + sqr(y)) <= radius;
  50. end; (* Within_Radius *)
  51.  
  52.  
  53. procedure Initialise;
  54.  
  55. var
  56.   dropx, dropy :integer;
  57.  
  58. begin
  59. ended := false; died := false; move := 1;
  60. human.x := 0; human.y := 0;
  61. randomize;
  62. repeat
  63.   rabbit.x := random(2*radius+1) - radius;
  64.   rabbit.y := random(2*radius+1) - radius;
  65. until distance <= radius;
  66. repeat
  67.   write('Where would you like to be dropped (x y)? ');
  68.   readln(dropx,dropy);
  69. until within_radius(dropx,dropy);
  70. human.x := dropx;
  71. human.y := dropy;
  72. if (human.x = rabbit.x) and (human.y = rabbit.y)
  73.   then begin
  74.        writeln('******* SQUISH *******');
  75.        writeln('You crushed the rabbit! You are set free!!!');
  76.        ended := true;
  77.        end;
  78. end; (* Initialise *)
  79.  
  80.  
  81. procedure New_Coords (angle :integer; var x,y :integer);
  82.  
  83. var
  84.   m :real;
  85.  
  86. begin
  87. m := 1;
  88. if (angle div 45) in [1,3,5,7] then m := sqrt(2);
  89. x := round(m * cos(angle * (pi / 180)));
  90. y := round(m * sin(angle * (pi / 180)));
  91. end; (* New_Coords *)
  92.  
  93.  
  94. procedure Human_Turn;
  95.  
  96. var
  97.   x,y,angle :integer;
  98.   valid :boolean;
  99.  
  100. begin
  101. writeln; writeln('Move #',move,'. Human at (',human.x,',',human.y,')');
  102. repeat
  103.   repeat
  104.     write('At what angle will you run? ');
  105.     readln(angle);
  106.   until (angle mod 45) = 0;
  107.   writeln('Running...');
  108.   new_coords(angle,x,y);
  109.   valid := within_radius(x+human.x,y+human.y);
  110.   if not valid then writeln('You can''t run into a wall!');
  111. until valid;
  112. human.x := human.x + x;
  113. human.y := human.y + y;
  114. writeln('Human, you are now at (',human.x,',',human.y,')');
  115. if (human.x = rabbit.x) and (human.y = rabbit.y)
  116.   then begin
  117.        writeln('You ran right into the rabbit!!');
  118.        ended := true; died := true;
  119.        end;
  120. end; (* Human_Turn *)
  121.  
  122.  
  123. procedure Rabbit_Turn;
  124.  
  125. var
  126.   stop_pouncing :boolean;
  127.   pounce_prob, dx, dy, x, y, angle :integer;
  128.  
  129. begin
  130. pounce_prob := 1;
  131. repeat
  132.   stop_pouncing := true;
  133.   write('The rabbit is pouncing at angle ');
  134.   pounce_prob := succ(pounce_prob);
  135.   dx := human.x - rabbit.x;
  136.   dy := human.y - rabbit.y;
  137.   if dx = 0
  138.     then if dy < 0
  139.            then angle := 270
  140.            else angle := 90
  141.     else if dy = 0
  142.            then if dx < 0
  143.                   then angle := 180
  144.                   else angle := 0
  145.            else begin
  146.                 angle := trunc( arctan(abs(dy div dx)) * 180 / pi );
  147.                 if angle > 45+22   (* make angle a multiple of 45 degrees *)
  148.                   then angle := 90
  149.                   else if angle < 45-23
  150.                          then angle := 0
  151.                          else angle := 45;
  152.                 if dx < 0
  153.                   then if dy < 0
  154.                          then angle := angle + 180
  155.                          else angle := 180 - angle
  156.                   else if dy < 0
  157.                          then angle := 360 - angle;
  158.                 end;
  159.   writeln(angle);
  160.   new_coords(angle,x,y);
  161.   rabbit.x := rabbit.x + x;
  162.   rabbit.y := rabbit.y + y;
  163.   if distance <> 0
  164.     then if random(pounce_prob)+1 = 1 then stop_pouncing := false;
  165. until stop_pouncing;
  166. end; (* Rabbit_Turn *)
  167.  
  168.  
  169. function Another :boolean;
  170.  
  171. var
  172.   ans :char;
  173.  
  174. begin
  175. writeln;
  176. repeat
  177.   write('Another run? ');
  178.   readln(ans);
  179. until ans in ['Y','N','y','n'];
  180. another := ans in ['Y','y'];
  181. end; (* Another *)
  182.  
  183.  
  184. begin
  185. nomore := false;
  186. repeat
  187.   writeln;
  188.   writeln('RABBIT converted from BASIC by E. Reaburn: ver 1.0  3 Sep 87');
  189.   writeln;
  190.   instruct;
  191.   initialise;
  192.   while (not ended) and (move <= req_moves) do
  193.     begin
  194.     d := distance;
  195.     writeln('Rabbit at (',rabbit.x,',',rabbit.y,') and distance ',d:1:2);
  196.     if d = 0
  197.       then begin
  198.            ended := true;
  199.            died := true;
  200.            end
  201.       else begin
  202.            human_turn;
  203.            if not died then rabbit_turn;
  204.            end;
  205.     move := succ(move);
  206.     end;
  207.   if died
  208.     then writeln('*** CRUNCH ***   R.I.P.')
  209.     else writeln('You are released!');
  210.   nomore := not another;
  211. until nomore;
  212. end.
  213.