home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / COMAL3-1.DMS / in.adf / Demos / Hanoi < prev    next >
Encoding:
Text File  |  1993-03-30  |  1.9 KB  |  84 lines

  1. // Towers of Hanoi
  2. //
  3. // This program is the classical demonstration of
  4. // recursion.
  5. //
  6. // Note that the current time is printed in the upper
  7. // right corner of the window. This is done by an inter-
  8. // rupt procedure that is called once every second.
  9.  
  10. USE Timer
  11.  
  12. PAGE
  13.  
  14. TimerEvent(1,IntProc)
  15.  
  16. DIM Number OF NumType
  17. PRINT "The towers of HANOI"
  18. PRINT
  19. INPUT "Height of the tower ( 1-10): ": Number
  20. init
  21. Move(Number,1,2,3)
  22.  
  23. // ****   end of main program    *****
  24.  
  25. PROC Move(n OF NumType,Tower1 OF NumType,Tower2 OF NumType,Tower3 OF NumType)
  26.   IF n>1 THEN Move(n-1,Tower1,Tower3,Tower2)
  27.   Show(n,Tower1,Tower2)
  28.   IF n>1 THEN Move(n-1,Tower3,Tower2,Tower1)
  29. ENDPROC Move
  30.  
  31. PROC init
  32.   PAGE
  33.   DIM Height(3) OF NumType, pos(3) OF NumType
  34.   DIM i OF NumType, y OF NumType
  35.   Height(1):=Number
  36.   pos(1):=5; pos(2):=30; pos(3):=55
  37.   DIM Disk$(Number) OF 24
  38.   DIM Empty$ OF 22
  39.   DIM block$ OF 1
  40.   block$:="#"
  41.   Empty$:="                     "
  42.   Disk$(1):="          "+block$+block$+"         "
  43.   FOR i:=2 TO Number DO
  44.     Disk$(i):=Disk$(i-1)(2..11)+block$+block$+Disk$(i-1)(12..21)
  45.   ENDFOR i
  46.   FOR i:=1 TO Number DO
  47.     Disk$(i):=CHR$(129+i MOD 3)+Disk$(i)+CHR$(129)
  48.   ENDFOR i
  49.   FOR y:=20 TO 21-Number STEP -1 DO
  50.     PRINT AT y,pos(1): Disk$(Number+y-20)
  51.   ENDFOR y
  52. ENDPROC init
  53.  
  54. PROC Show(n OF NumType,From OF NumType,To OF NumType)
  55.   LOCAL x OF NumType, y OF NumType, Direction OF NumType
  56.   x:=pos(From)
  57.   FOR y:=20-Height(From) TO 20-Number STEP -1 DO
  58.     PRINT AT y,x: Disk$(n)
  59.     PRINT AT y+1,x: Empty$
  60.   ENDFOR y
  61.   Direction:=SGN(To-From)
  62.   WHILE x<>pos(To) DO
  63.     PRINT AT 20-Number,x: Disk$(n)
  64.     x:+Direction
  65.   ENDWHILE
  66.   FOR y:=20-Number TO 20-Height(To) DO
  67.     PRINT AT y,x: Disk$(n)
  68.     PRINT AT y-1,x: Empty$
  69.   ENDFOR y
  70.   Height(From):=Height(From)-1; Height(To):=Height(To)+1
  71. ENDPROC Show
  72.  
  73. PROC IntProc
  74.   LOCAL x OF SHORT, y OF SHORT
  75.  
  76.   x:=CURCOL
  77.   y:=CURROW
  78.   PRINT AT 2,60: TIME$
  79.   CURSOR  y,x
  80.   TimerEvent(1,IntProc)
  81. ENDPROC IntProc
  82.  
  83. TYPE NumType=LONG
  84.