1SCREEN 13
2
3CONST CNT = 3
4
5
6DIM SHARED W(0 TO 15, 0 TO 2) AS INTEGER
7
8
9FOR i = 0 TO 2: LINE (50 + i * 100 - 1, 25)-(50 + i * 100 + 1, 184), 6, BF: NEXT
10FOR i = 0 TO 15: W(i, 0) = -1: W(i, 1) = -1: W(i, 2) = -1: NEXT
11FOR i = 0 TO CNT - 1: DrawPlate 0, i, i: W(i, 0) = i: NEXT
12
13
14Hanoi 0, 1, 2, CNT
15
16SLEEP 0
17
18SUB Delay (N)
19 FOR i = 0 TO N * 100: NEXT
20 N = N * .99
21END SUB
22
23SUB DrawPlate (col, row, isize)
24
25 x = 50 + 100 * col
26 y = 170 - row * 11
27 cl = 1 + isize
28 size = 45 - isize * 5
29
30 LINE (x - size, y)-(x + size, y + 10), cl, BF
31 LINE (x - size, y)-(x + size, y + 10), 15, B
32 LINE (x - size, y + 10)-(x + size, y + 10), 8
33 LINE (x + size, y + 10)-(x + size, y), 8
34
35END SUB
36
37SUB Hanoi (A, B, C, N)
38
39
40 IF N > 1 THEN Hanoi A, C, B, N - 1
41
42
43 FOR i = 0 TO CNT
44 IF W(i, A) = -1 THEN irow = i: cl = W(i - 1, A): EXIT FOR
45 NEXT
46
47 FOR i = 0 TO CNT
48 IF W(i, B) = -1 THEN orow = i: EXIT FOR
49 NEXT
50
51
52 W(orow, B) = W(irow - 1, A)
53 W(irow - 1, A) = -1
54
55
56 Move A, irow - 1, cl, B, orow
57
58
59 IF N > 1 THEN Hanoi C, B, A, N - 1
60
61END SUB
62
63
64SUB Move (icol, irow, isize, ocol, orow)
65
66 DL = 25
67 HG = 170
68
69
70 IF icol < ocol THEN dir = 1 ELSE dir = -1
71
72 x = 50 + 100 * icol
73 y = HG - irow * 11
74 cl = 1 + isize
75 size = 45 - isize * 5
76
77
78 icnt = y - 15
79 ocnt = HG - orow * 11 - 15
80
81
82 FOR i = 0 TO icnt
83
84
85 LINE (x - size, y + 10)-(x - 2, y + 10), 0, BF
86 LINE (x - 1, y + 10)-(x + 1, y + 10), 6, BF
87 LINE (x + 2, y + 10)-(x + size, y + 10), 0, BF
88
89
90 LINE (x - size, y + 9)-(x + size, y + 9), 8
91 LINE (x - size + 1, y)-(x + size - 1, y), cl
92 LINE (x - size, y - 1)-(x + size, y - 1), 15
93 PSET (x + size, y), 8
94
95 y = y - 1
96 Delay DL
97
98 NEXT
99
100
101 xl = x - size
102 xr = x + size
103 FOR i = 0 TO 100 * ABS(icol - ocol) - 1
104
105
106 IF dir > 0 THEN
107
108 LINE (xl, y)-(xl, y + 10), 0
109 LINE (xl + 1, y)-(xl + 1, y + 10), 15
110 LINE (xr, y)-(xr, y + 10), cl
111 PSET (xr, y), 15
112 PSET (xr, y + 10), 8
113 LINE (xr + 1, y)-(xr + 1, y + 10), 8
114 xl = xl + 1
115 xr = xr + 1
116 Delay DL
117
118 ELSE
119
120 LINE (xr, y)-(xr, y + 10), 0
121 LINE (xr - 1, y)-(xr - 1, y + 10), 15
122 LINE (xl, y)-(xl, y + 10), cl
123 PSET (xl, y), 15
124 PSET (xl, y + 10), 8
125 LINE (xl - 1, y)-(xl - 1, y + 10), 8
126 xl = xl - 1
127 xr = xr - 1
128 Delay DL
129
130 END IF
131
132 NEXT
133
134
135 FOR i = 0 TO ocnt
136
137 LINE (xl, y)-(xr, y), 0
138 LINE (xl + 1, y + 10)-(xr - 1, y + 10), cl
139 LINE (xl, y + 1)-(xr, y + 1), 15
140 PSET (xl, y + 10), 15
141 LINE (xl, y + 11)-(xr, y + 11), 8
142
143
144 IF i > 10 THEN LINE (xl + size - 1, y)-(xr - size + 1, y), 6
145
146 y = y + 1
147 Delay DL
148
149 NEXT
150
151END SUB