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 Fromc