home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / elan / karel / charles.eln next >
Text File  |  1987-08-18  |  3KB  |  152 lines

  1.  
  2. PROC turn right:
  3.   dx INCR dy;
  4.   dy DECR dx;
  5.   dx INCR dy;
  6.   draw karel
  7. ENDPROC turn right;
  8.  
  9. PROC turn left:
  10.   dy INCR dx;
  11.   dx DECR dy;
  12.   dy INCR dx;
  13.   draw karel
  14. ENDPROC turn left;
  15.  
  16. PROC take beeper:
  17.   IF beeper
  18.   THEN corner [xpos] [ypos] DECR ball
  19.   ELSE
  20.     go to screen bottom;
  21.     put (" There is no beeper at this corner.");
  22.     assert (karel error)
  23.   FI
  24. ENDPROC take beeper;
  25.  
  26. PROC stop:
  27.   go to screen bottom;
  28.   put (" Karel has completed his task.");
  29.   sleep (1);
  30.   disappear karel;
  31.   go to screen bottom
  32. ENDPROC stop;
  33.  
  34. PROC set cursor:
  35.   cursor (xstep * xpos, ystep * (height + 1 - ypos))
  36. ENDPROC set cursor;
  37.  
  38. PROC reset cursor:
  39.   cursor (1, ystep * (height + 1 - ypos))
  40. ENDPROC reset cursor;
  41.  
  42. PROC place karel on corner:
  43.   corner [xpos] [ypos] INCR karel;
  44.   draw karel
  45. ENDPROC place karel on corner;
  46.  
  47. PROC move:
  48.   disappear karel;
  49.   try to move;
  50.   place karel on corner.
  51.   
  52.   try to move:
  53.     IF facing wall
  54.     THEN
  55.       go to screen bottom;
  56.       IF leaves town
  57.       THEN put (" Karel disappeared from sight.")
  58.       ELSE put (" Karel hit the wall.")
  59.       FI
  60.     ELSE
  61.       xpos INCR dx;
  62.       ypos INCR dy
  63.     FI.
  64. ENDPROC move;
  65.  
  66. BOOL PROC leaves town:
  67.   xpos + dx < 1 OR xpos + dx > width OR (ypos + dy < 1 OR ypos + dy > height)
  68. ENDPROC leaves town;
  69.  
  70. PROC go to screen bottom:
  71.   cursor (1, ystep * (height + 1))
  72. ENDPROC go to screen bottom;
  73.  
  74. BOOL PROC facing west:
  75.   dx = - 1
  76. ENDPROC facing west;
  77.  
  78. BOOL PROC facing wall:
  79.   IF leaves town
  80.   THEN true
  81.   ELSE corner [xpos + dx] [ypos + dy] = stone
  82.   FI
  83. ENDPROC facing wall;
  84.  
  85. BOOL PROC facing south:
  86.   dy = - 1
  87. ENDPROC facing south;
  88.  
  89. BOOL PROC facing north:
  90.   dy = 1
  91. ENDPROC facing north;
  92.  
  93. BOOL PROC facing east:
  94.   dx = 1
  95. ENDPROC facing east;
  96.  
  97. PROC drop beeper:
  98.   IF beeper
  99.   THEN
  100.     go to screen bottom;
  101.     put (" There is already a beeper at this corner.");
  102.     assert (karel error)
  103.   ELSE corner [xpos] [ypos] INCR ball
  104.   FI
  105. ENDPROC drop beeper;
  106.  
  107. PROC draw karel:
  108.   set cursor;
  109.   IF facing north
  110.   THEN put ("^")
  111.   ELIF facing east
  112.   THEN put (">")
  113.   ELIF facing south
  114.   THEN put ("v")
  115.   ELSE put ("<")
  116.   FI;
  117.   reset cursor
  118. ENDPROC draw karel;
  119.  
  120. PROC disappear karel:
  121.   corner [xpos] [ypos] DECR karel;
  122.   set cursor;
  123.   IF beeper
  124.   THEN put ("o")
  125.   ELSE put (" ")
  126.   FI;
  127.   reset cursor
  128. ENDPROC disappear karel;
  129.  
  130. BOOL PROC beeper:
  131.   corner [xpos] [ypos] MOD karel = ball
  132. ENDPROC beeper;
  133.  
  134. start karel:
  135.   LET width = 29, height = 21;
  136.   LET xstep = 2, ystep = 1;
  137.   LET empty = 0, ball = 1, stone = 2, karel = 3;
  138.   INT VAR xpos, ypos;
  139.   INT VAR dx :: 0, dy :: 1;
  140.   ROW width ROW height INT VAR corner;
  141.   FOR ypos FROM 1 UPTO height
  142.   REP corner [1] [ypos] := empty
  143.   ENDREP;
  144.   FOR xpos FROM 2 UPTO width
  145.   REP corner [xpos] := corner [1]
  146.   ENDREP;
  147.   xpos := 1;
  148.   ypos := 1;
  149.   BOOL CONST karel error :: FALSE;
  150.   place karel on corner.
  151.  
  152.