Spaghetti Code

I've talked about the danger of spaghetti code; here's where you get to see it in action. Below is a program written in an early version of BASIC. Just try to read through it and figure out how it works.

10 PRINT "HURKLE" 20 PRINT:PRINT:PRINT 110 N=5 120 G=10 210 PRINT 220 PRINT "A HURKLE IS HIDING ON A";G;"BY";G;"GRID. HOMEBASE" 230 PRINT "ON THE GRID IS POINT 0,0 AND ANY GRIDPOINT IS A" 240 PRINT "PAIR OF WHOLE NUMBERS SEPARATED BY A COMMA. TRY TO" 250 PRINT "GUESS THE HURKLE'S GRIDPOINT. YOU GET";N;"TRIES." 260 PRINT "AFTER EACH TRY, I WILL TELL YOU THE APPROXIMATE" 270 PRINT "DIRECTION TO GO LOOK FOR THE HURKLE." 280 PRINT 285 A=INT(G*RND(1)) 286 B=INT(G*RND(1)) 310 FOR K=1 TO N 320 PRINT "GUESS #";K; 330 INPUT X,Y 340 IF ABS(X-A)+ABS(Y-B)=0 THEN 500 350 REM PRINT INFO 360 GOSUB 610 370 PRINT 380 NEXT K 410 PRINT 420 PRINT "SORRY, THAT'S";N;"GUESSES." 430 PRINT "THE HURKLE IS AT ";A;",";B 440 PRINT 450 PRINT "LET'S PLAY AGAIN. HURKLE IS HIDING." 460 PRINT 470 GOTO 285 500 REM 510 PRINT 520 PRINT "YOU FOUND HIM IN";K;"GUESSES!" 540 GOTO 440 610 PRINT "GO "; 620 IF Y=B THEN 670 630 IF Y<B THEN 660 640 PRINT "SOUTH"; 650 GOTO 670 660 PRINT "NORTH"; 670 IF X=A THEN 720 680 IF X<A THEN 710 690 PRINT "WEST"; 700 GOTO 720 710 PRINT "EAST"; 720 PRINT 730 RETURN 999 END </PLAINTEXT></TD></TR></TABLE> <P>Yikes! Let's try this again, this time using a program that was logically designed and written out in pseudocode before coding began:</P> <TABLE BORDER=1><TR><TD><PLAINTEXT> 10 PRINT "HURKLE" 20 PRINT:PRINT:PRINT 30 REM N=# OF GUESSES, G=SIZE OF GRID 40 N=5 : G=10 50 PRINT "A HURKLE IS HIDING ON A";G;"BY";G;"GRID. HOMEBASE" 60 PRINT "ON THE GRID IS POINT 0,0 AND ANY GRIDPOINT IS A" 70 PRINT "PAIR OF WHOLE NUMBERS SEPARATED BY A COMMA. TRY TO" 80 PRINT "GUESS THE HURKLE'S GRIDPOINT. YOU GET";N;"TRIES." 90 PRINT "AFTER EACH TRY, I WILL TELL YOU THE APPROXIMATE" 100 PRINT "DIRECTION TO GO LOOK FOR THE HURKLE." 110 PRINT 120 REM ----- START NEW GAME 130 REM A,B=LOCATION OF HURKLE 140 A=INT(G*RND(1)) 150 B=INT(G*RND(1)) 160 REM K = CURRENT TURN 170 K=0 180 REM ----- NEXT TURN 190 K=K+1 200 PRINT "GUESS #";K; 210 INPUT x,y 220 IF ABS(X-A)+ABS(Y-B)=0 THEN GOSUB 280 ELSE GOSUB 320 230 IF K < N GOTO 180 240 IF K < 100 THEN GOSUB 390 250 PRINT 260 PRINT "LET'S PLAY AGAIN. HURKLE IS HIDING." 270 GOTO 100 280 REM ----- PLAYER FOUND THE HURKLE 290 PRINT "YOU FOUND HIM IN";K;"GUESSES!" 300 K = 100 310 RETURN 320 REM ----- PRINT DIRECTION TO HURKLE 330 PRINT "GO "; 340 IF Y<B THEN PRINT "NORTH" 350 IF Y>B THEN PRINT "SOUTH" 360 IF X<A THEN PRINT "EAST" 370 IF X>A THEN PRINT "WEST" 380 RETURN 390 REM ----- DIDN'T FIND HURKLE 400 PRINT "SORRY, THAT'S";N;"GUESSES." 410 PRINT "THE HURKLE WAS AT";A;",";B 420 RETURN </PLAINTEXT></TD></TR></TABLE> <hr> <center><b>The Intro to Visual Basic homepage is hosted by <a href="/">GeoCities</a></b></center> </BODY> </HTML> <!-- --> <SCRIPT LANGUAGE="JavaScript"> <!-- window.open("http://www.oocities.org/cgi-bin-local/GeoAD?pageID=/gp/SiliconValley/Peaks", "w3adYBAAIYBI", "width=515,height=125"); //--> </SCRIPT>