# hanoi.goku # try# # # 12 hanoi # array poles 3; #store n of disks for three poles define noDisks # poleNo -- nDisks 1 - poles + getb; define drawBase # -- 0 0 0 pen 128 128 0 rgb brush 20 60 22 0 rectangle 50 60 52 0 rectangle 80 60 82 0 rectangle 6 4 96 0 2 2 roundRect; define drawDisk # disk pole height -- local disk pole height x width; !height !pole !disk 81 51 21 @pole stack !x drop drop drop @disk 2 * 4 + !width @x @width 2 / - !x @x @height @x @width + @height 4 + rectangle; define setupPoles # n -- local n nn; !n consoleClear 1 2 rowColumn 0 rasterOp 100 -100 scale 0 100 origin drawBase 0 0 0 pen 255 0 0 rgb brush @n poles[0] putb 0 poles[1] putb 0 poles[2] putb @n !nn while @n 0 > do @n 1 @nn @n - 1 + 4 * drawDisk @n 1 - !n end; define drawPoleTop # pole -- local pole len x; !pole 80 50 20 @pole stack !x drop drop drop 56 @pole noDisks 4 * - !len 0 0 0 pen 128 128 0 rgb brush @x 60 @x 2 + 60 @len - rectangle; define moveDiskUp local n pole fromY toY; !toY !fromY !pole !n while @fromY @toY < do 0 0 19 pen 255 255 255 rgb brush @n @pole @fromY drawDisk @pole drawPoleTop 0 0 0 pen 255 0 0 rgb brush @n @pole @fromY 16 + @toY min drawDisk @fromY 16 + !fromY end; define moveDiskOver local n from to; !to !from !n 0 0 0 pen 255 0 0 rgb brush @n @to 64 drawDisk 0 0 19 pen 255 255 255 rgb brush @n @from 64 drawDisk; define moveDiskDown local n pole fromY toY; !toY !fromY !pole !n while @fromY @toY > do 0 0 19 pen 255 255 255 rgb brush @n @pole @fromY drawDisk @pole drawPoleTop 0 0 0 pen 255 0 0 rgb brush @n @pole @fromY 16 - @toY max drawDisk @fromY 16 - !fromY end; define pullDisk # n pole -- local n pole; !pole !n poles[@pole 1 - ] dup getb 1 - swap putb @n @pole dup noDisks 4 * 4 + 64 moveDiskUp; define pushDisk # n pole -- local n pole; !pole !n poles[@pole 1 - ] dup getb 1 + swap putb @n @pole 64 @pole noDisks 4 * moveDiskDown; define moveDisks # n from to with -- local n from to with; nap #give MS Windows a chance !with !to !from !n if @n 0 > then @n @from @to @with #push local statics @n 1 - @from @with @to recurse !with !to !from !n #restore local statics @n @from pullDisk @n @from @to moveDiskOver @n @to pushDisk @n 1 - @with @to @from recurse end; define hanoi # n -- local n; !n if @n 12 > then 12 !n end @n setupPoles "Times New Roman" 24 0 textFont 5 5 "Towers of Hanoi" text @n 1 3 2 moveDisks; 12 hanoi ########################## E O F ###############################