1 REM Ins{nt av 1789 1 REM Ins{nt av 1789 10 ! -----------------------------------! 20 ! * H A N O I . B A C ! 30 ! * ================= ! 40 ! * K|r 'Tower of Hanoi' p} sk{rmen ! 50 ! * Torbj|rn Alm ABC-116 831112 ! 60 ! * Efter HANOI.C DECUS C-tape ! 70 ! * ! 80 ! -----------------------------------! 85 INTEGER : EXTEND 90 ; CHR$(12) TAB(25) 'Tornet i HANOI' : ; TAB(25) '==============' 100 ; : INPUT 'Ange antal skivor (max 13): ';N : IF N<1 OR N>13 GOTO 90 105 FOR I=0 TO 2 : Top(I)=22 : NEXT I 110 H=FNSetup(N) 120 Depth=0 130 H=FNHanoi(N,0,2,1) 140 ; CUR(23,75) 'Done'; : GET A$ : GOTO 90 150 ! --------------------------------- 160 ! FNHanoi(n,a,b,c) Rekursiv rutin 170 ! --------------------------------- 180 DEF FNHanoi(N,A,B,C) 190 IF N=0 RETURN 0 195 Depth=Depth+1 : ; CUR(0,70) Depth ' '; 200 H=FNHanoi(N-1,A,C,B) : H=FNMovering(N,A,B) : H=FNHanoi(N-1,C,B,A) 205 Depth=Depth-1 : ; CUR(0,70) Depth ' '; 210 RETURN 0 220 FNEND 230 ! ---------------------------------- 240 ! * FNSetup(n) Set up discs on stick 1 250 ! ---------------------------------- 260 DEF FNSetup(N) LOCAL I 270 I=11 : WHILE I<23 : ; CUR(I,15) '!' CUR(I,40) '!' CUR(I,65) '!'; : I=I+1 : WEND 280 ; CUR(23,5) STRING$(70,45); 290 I=N : WHILE I>0 : H=H=FNDraw(I,15,Top(0),ASCII('x')) : Top(0)=Top(0)-1 : I=I-1 : WEND 300 RETURN 0 310 FNEND 320 ! ---------------------------------- 330 ! * FNDraw(Ring,Centre,Y,Ch) 340 ! * Insert/Delete a ring 350 ! ---------------------------------- 360 DEF FNDraw(Ring,Centre,Y,Ch) 370 ; CUR(Y,Centre-Ring) STRING$(Ring,Ch) CUR(Y,Centre+1) STRING$(Ring,Ch); 380 RETURN 0 390 FNEND 400 ! ----------------------------------- 410 ! * FNMovering(Ring,From,To) Move a ring 420 ! ----------------------------------- 430 DEF FNMovering(Ring,From,To) LOCAL Fromc,Toc,Fromy,Toy 440 Fromc=15+From*25 : Toc=15+To*25 450 Top(From)=Top(From)+1 : Fromy=Top(From) 460 Toy=Top(To) : Top(To)=Top(To)-1 470 WHILE Fromy<>10 : H=FNDraw(Ring,Fromc,Fromy,ASCII(' ')) 480 Fromy=Fromy-1 : H=FNDraw(Ring,Fromc,Fromy,ASCII('x')) 490 WEND 510 WHILE FromcToc : ; CUR(Fromy,Fromc+Ring) ' '; : ; CUR(Fromy,Fromc) 'x'; 550 ; CUR(Fromy,Fromc-1) ' '; : ; CUR(Fromy,Fromc-Ring-1) 'x'; 560 Fromc=Fromc-1 : WEND 570 WHILE Fromy<>Toy 580 H=FNDraw(Ring,Fromc,Fromy,ASCII(' ')) : Fromy=Fromy+1 590 H=FNDraw(Ring,Fromc,Fromy,ASCII('x')) 600 WEND 610 RETURN 0 620 FNEND