home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / elan / demo / hanoi.eln < prev    next >
Text File  |  1987-08-18  |  2KB  |  86 lines

  1.  
  2. PROC think (INT CONST a):
  3.   sleep (random (0, a))
  4. ENDPROC think;
  5.  
  6. PROC spaces (INT CONST n):
  7.   put (n * " ")
  8. ENDPROC spaces;
  9.  
  10. PROC showstack (ROW 3 INT CONST s):
  11.   INT VAR i, j;
  12.   FOR i FROM 1 UPTO 3
  13.   REP
  14.     locate (i, 0);
  15.     put (text (i, 1));
  16.     FOR j FROM 1 UPTO stack [i]
  17.     REP
  18.       locate (i, j);
  19.       put (disk (depth - j + 1))
  20.     ENDREP;
  21.     FOR j FROM stack [i] + 1 UPTO depth
  22.     REP
  23.       locate (i, j);
  24.       put (nodisk (depth))
  25.     ENDREP
  26.   ENDREP
  27. ENDPROC showstack;
  28.  
  29. PROC report (INT CONST a, TEXT CONST msg):
  30.   line;
  31.   put (msg);
  32.   put ("=");
  33.   put (a)
  34. ENDPROC report;
  35.  
  36. TEXT PROC nodisk (INT CONST width):
  37.   width * left + width * " " + pillar + width * " "
  38. ENDPROC nodisk;
  39.  
  40. PROC move tower (INT CONST height, from, to, via):
  41.   IF height > 0
  42.   THEN
  43.     move tower (height - 1, from, via, to);
  44.     move piece (height, from, to);
  45.     move tower (height - 1, via, to, from)
  46.   FI
  47. ENDPROC move tower;
  48.  
  49. PROC move piece (INT CONST number, from, to):
  50.   locate (from, stack [from]);
  51.   put (nodisk (number));
  52.   stack [from] DECR 1;
  53.   stack [to] INCR 1;
  54.   locate (to, stack [to]);
  55.   put (disk (number));
  56.   think (delay)
  57. ENDPROC move piece;
  58.  
  59. PROC locate (INT CONST a, b):
  60.   cursor (36 + 2 * (a - 2) * depth + a, 20 - b)
  61. ENDPROC locate;
  62.  
  63. PROC indent (INT CONST indentation):
  64.   line;
  65.   spaces (indentation)
  66. ENDPROC indent;
  67.  
  68. TEXT PROC disk (INT CONST width):
  69.   (width - 1) * left + (width - 1) * disk elem + disk center + (width - 1) * disk elem
  70. ENDPROC disk;
  71.  
  72. program:
  73.   LET left = ""6"";
  74.   LET disk elem = ""220"";
  75.   LET disk center = ""220"";
  76.   LET pillar = ""186"";
  77.   LET depth = 9;
  78.   LET delay = 2;
  79.   report (depth, "Depth");
  80.   report (delay, "delay");
  81.   ROW 3 INT VAR stack :: [depth, 0, 0];
  82.   showstack (stack);
  83.   move tower (depth, 1, 2, 3);
  84.   cursor (1, 21).
  85.  
  86.