home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HomeWare 14
/
HOMEWARE14.bin
/
windows
/
win31
/
lb09d.arj
/
HANOI.BAS
< prev
next >
Wrap
BASIC Source File
|
1993-08-10
|
7KB
|
273 lines
' Hanoi.bas, copyright 1993, Shoptalk Systems
' This simple Liberty BASIC program let's the user
' play the puzzle "Tower of Hanoi".
' Instructions:
'
' Move all the disks from Peg 1 to Peg 3, one disk at a
' time, by taking each disk from one peg and placing it onto
' another peg. You can only take one disk at a time, and
' only the top disk may be removed. When placing a
' disk, it can only be placed onto an unoccupied peg or
' onto a peg occupied with larger disks. You cannot place
' a larger disk onto a smaller one.
'
' By shuffling the disks around, it is possible to complete
' the puzzle. When all the disks are finally moved to peg 3,
' you will be given the chance to play again.
'
' Prepare the variables that hold the disk data
tiny = 1
small = 1
medium = 1
large = 1
' Set the movement state
state$ = "begin"
gosub [openWindow]
gosub [drawPuzzle]
[inputLoop]
if hanoiStarted = 0 then print #hanoi, "redraw" ; : hanoiStarted = 1
input r$
goto [inputLoop]
[openWindow] 'Open the puzzle's window
WindowWidth = 430
WindowHeight = 320
button #hanoi, " Peg 1 ", [pegOne], UL, 70, 240
button #hanoi, " Peg 2 ", [pegTwo], UL, 170, 240
button #hanoi, " Peg 3 ", [pegThree], UL, 270, 240
open "Tower of Hanoi" for graphics as #hanoi
return
[drawPuzzle] ' Draw the pegs
print #hanoi, "cls ; down" ;
print #hanoi, "color darkgray ; size 10 ; line 100 120 100 220" ;
print #hanoi, "line 200 120 200 220" ;
print #hanoi, "line 300 120 300 220" ;
print #hanoi, "color lightgray ; size 15 ; line 0 220 400 220" ;
[drawDisks] ' Draw the disks
peg1 = 207
peg2 = 207
peg3 = 207
if large <> 1 then [largeIsNotOne]
print #hanoi, "size 10 ; color red" ;
print #hanoi, "line 60 "; peg1; " 140 "; peg1 ;
peg1 = peg1 - 10
goto [drawMedium]
[largeIsNotOne]
if large <> 2 then [largeIsNotTwo]
print #hanoi, "size 10 ; color red" ;
print #hanoi, "line 160 "; peg2; " 240 "; peg2 ;
peg2 = peg2 - 10
goto [drawMedium]
[largeIsNotTwo]
print #hanoi, "size 10 ; color red" ;
print #hanoi, "line 260 "; peg3; " 340 "; peg3 ;
peg3 = peg3 - 10
[drawMedium] ' Draw the medium size disk
if medium <> 1 then [mediumIsNotOne]
print #hanoi, "size 10 ; color green" ;
print #hanoi, "line 70 "; peg1; " 130 "; peg1 ;
peg1 = peg1 - 10
goto [drawSmall]
[mediumIsNotOne]
if medium <> 2 then [mediumIsNotTwo]
print #hanoi, "size 10 ; color green" ;
print #hanoi, "line 170 "; peg2; " 230 "; peg2 ;
peg2 = peg2 - 10
goto [drawSmall]
[mediumIsNotTwo]
print #hanoi, "size 10 ; color green" ;
print #hanoi, "line 270 "; peg3; " 330 "; peg3 ;
peg3 = peg3 - 10
[drawSmall] ' Draw the small size disk
if small <> 1 then [smallIsNotOne]
print #hanoi, "size 10 ; color blue" ;
print #hanoi, "line 80 "; peg1; " 120 "; peg1 ;
peg1 = peg1 - 10
goto [drawTiny]
[smallIsNotOne]
if small <> 2 then [smallIsNotTwo]
print #hanoi, "size 10 ; color blue" ;
print #hanoi, "line 180 "; peg2; " 220 "; peg2 ;
peg2 = peg2 - 10
goto [drawTiny]
[smallIsNotTwo]
print #hanoi, "size 10 ; color blue" ;
print #hanoi, "line 280 "; peg3; " 320 "; peg3 ;
peg3 = peg3 - 10
[drawTiny] ' Draw the tiny size disk
if tiny <> 1 then [tinyIsNotOne]
print #hanoi, "size 10 ; color yellow" ;
print #hanoi, "line 90 "; peg1; " 110 "; peg1 ;
peg1 = peg1 - 10
goto [finishDrawing]
[tinyIsNotOne]
if tiny <> 2 then [tinyIsNotTwo]
print #hanoi, "size 10 ; color yellow" ;
print #hanoi, "line 190 "; peg2; " 210 "; peg2 ;
peg2 = peg2 - 10
goto [finishDrawing]
[tinyIsNotTwo]
print #hanoi, "size 10 ; color yellow" ;
print #hanoi, "line 290 "; peg3; " 310 "; peg3 ;
peg3 = peg3 - 10
[finishDrawing]
print #hanoi, "flush" ;
return
[pegOne]
pegInQuestion = 1
if state$ = "begin" then [beginMove] else [endMove]
[pegTwo]
pegInQuestion = 2
if state$ = "begin" then [beginMove] else [endMove]
[pegThree]
pegInQuestion = 3
if state$ = "begin" then [beginMove] else [endMove]
[beginMove] ' Start to move a disk
peg = pegInQuestion
noDisks$ = "There are no disk on that peg!"
if tiny <> peg and small <> peg and medium <> peg and large <> peg then notice noDisks$ : goto [inputLoop]
print #hanoi, "place 10 10 ; color black " ;
print #hanoi, "\\ Peg "; peg; " has been selected.\ Please select a destination peg." ;
state$ = "end"
goto [inputLoop]
[endMove] ' Finish moving a disk
state$ = "begin"
ontoPeg = pegInQuestion
if ontoPeg = peg then [resetSelection]
' Determine which disk to move
if large = peg then disk$ = "large"
if medium = peg then disk$ = "medium"
if small = peg then disk$ = "small"
if tiny = peg then disk$ = "tiny"
' Determine if move is legal
moveOnto$ = "nothing"
if large = ontoPeg then moveOnto$ = "large"
if medium = ontoPeg then moveOnto$ = "medium"
if small = ontoPeg then moveOnto$ = "small"
if tiny = ontoPeg then moveOnto$ = "tiny"
if moveOnto$ = "nothing" then [finishMove]
if disk$ = "large" and moveOnto$ = "medium" then [illegalMove]
if disk$ = "large" and moveOnto$ = "small" then [illegalMove]
if disk$ = "medium" and moveOnto$ = "small" then [illegalMove]
if disk$ = "medium" and moveOnto$ = "tiny" then [illegalMove]
if disk$ = "small" and moveOnto$ = "tiny" then [illegalMove]
[finishMove]
if disk$ = "large" then large = ontoPeg
if disk$ = "medium" then medium = ontoPeg
if disk$ = "small" then small = ontoPeg
if disk$ = "tiny" then tiny = ontoPeg
gosub [drawPuzzle]
if tiny = 3 and small = 3 and medium = 3 and large = 3 then [youWin]
goto [inputLoop]
[illegalMove]
notice "That move is not allowed!"
[resetSelection]
state$ = "begin"
print #hanoi, "place 10 10 ; color white" ;
print #hanoi, "\\ Peg "; peg; " has been selected.\ Please select a destination peg." ;
goto [inputLoop]
[youWin]
beep
notice "You win!"
confirm "Play another?"; answer$
if answer$ = "no" then [quitHanoi]
tiny = 1
small = 1
medium = 1
large = 1
gosub [drawPuzzle]
goto [inputLoop]
[quitHanoi]
close #hanoi
end