100 REM ***HANGMAN** 120 REM BY MIKE GLEASON, 1986, 2011 140 REM 160 REM ==WELCOME SCREEN== 180 TEXT : HOME :SW = PEEK (33):ES$ = "": GG = 1: SND = 1: DD = 0.040: JY = 0 188 DD = 0.0010 : SND = 0: GOTO 380: REM Hack to work in the JavaScript emulator 200 IF (GG < 1) THEN 380 220 IF (PEEK(103) <> 1) THEN 280 240 IF (PEEK(104) = 64) AND (PEEK(16384) = 0) THEN 380 260 IF (PEEK(104) = 96) AND (PEEK(24576) = 0) THEN 380 280 PRINT "THIS VERSION OF HANGMAN IS TOO BIG" 300 PRINT "TO RUN WITHOUT HELP FROM YOU.":PRINT 320 PRINT "PLEASE TYPE THE FOLLOWING:":PRINT 340 PRINT "NEW":PRINT "POKE 103, 1":PRINT "POKE 104, 64":PRINT "POKE 16384, 0":PRINT "RUN HANGMAN" 360 END 380 VTAB 12:I = SW / 2 - 6: HTAB I: PRINT "_ _ _ _ _ _ _"; 400 GOSUB 13800 : REM INIT SOUND 420 D = 1: GOSUB 800: HTAB I + 8: PRINT "M"; 440 D = 1: GOSUB 800: HTAB I + 4: PRINT "N";: HTAB I + 12: PRINT "N"; 460 D = 1: GOSUB 800: HTAB I + 6: PRINT "G"; 480 D = 1: GOSUB 800: HTAB I + 2: PRINT "A";: HTAB I + 10: PRINT "A"; 500 D = 1: GOSUB 800: HTAB I + 0: PRINT "H"; 520 D = 2: GOSUB 800: HTAB I + 0: FLASH : PRINT "H A N G M A N": NORMAL : PRINT 540 D = 2: GOSUB 800 560 A$ = "(C) 1986, 2011 by Mike Gleason" 580 I = SW / 2 - ( LEN (A$) - 0) / 2 600 HTAB I: PRINT A$; 620 A$ = "Loading, please wait..." 640 I = SW / 2 - ( LEN (A$) - 3) / 2 660 VTAB 23: HTAB I: PRINT A$;: JY=1 680 GOTO 1100 700 : 720 : 800 REM ==DELAY SUBROUTINE== 820 REM Unfortunately, I don't know of a way to make this delay constant 840 REM across CPU speeds. For example, in an emulator, this code may 860 REM run too fast. You can try changing DD to modulate the speed. 880 IF ( PEEK (49152) > 127) THEN 940: REM SKIP DELAY UPON KEYBOARD INPUT 900 D = D - DD: IF D > 0 THEN 880 920 GOTO 980 940 A$ = CHR$ ( PEEK (49152) - 128) 960 IF (JY=1) THEN POKE 49168,0 980 RETURN 1000 : 1020 : 1100 REM ==INITIALIZE PROGRAM== 1120 DIM GZ%(32) 1140 GOSUB 3200: REM SETUP LIMBS 1160 GOSUB 13200: REM LOAD WORDS 1180 GOSUB 2500: REM SETUP SCREEN 1200 PRINT "Shall I be [e]asy, " 1220 PRINT " [m]edium, " 1240 PRINT " or [h]ard on you? "; 1260 POKE 49168,0: REM CLEAR KEYB BUFFER 1280 GOSUB 1800 1300 IF (A$ = "E") THEN EZ = 1: GOTO 1400 1320 IF (A$ = "M") THEN EZ = 2: GOTO 1400 1340 IF (A$ = "H") THEN EZ = 3: GOTO 1400 1360 PRINT : GOTO 1200 1400 REM ==GAME LOOP== 1420 HOME:VTAB 24 1440 CHEET = 0 1460 PRINT : GOSUB 2100 1480 PRINT "Play again? (Yes/No) ";: GOSUB 1800 1500 IF (A$ = "Y") THEN 1400 1520 ES$ = "": GOTO 1620 1600 REM ==CLEANUP AND EXIT== 1620 TEXT 1640 IF (ES$ = "") THEN 1720 1660 GOSUB 14300: REM RING BELL 1680 PRINT : PRINT "* ERROR: ";ES$;"." 1700 END 1720 HOME 1740 PRINT "GOOD BYE." 1760 END 1800 REM ==GET 1 UPPERCASE CHAR== 1820 GET A$:A$ = LEFT$ (A$,1) 1840 IF (A$ = CHR$ (1)) THEN CHEET = 1: GOTO 1980 1860 IF (A$ = CHR$ (27)) OR (A$ = CHR$ (3)) THEN 1600 1880 A = ASC (A$) 1900 IF ( ASC ("A") < = A) AND (A < = ASC ("Z")) THEN 2020 1920 IF (A < ASC ("a")) OR (A > ASC ("z")) THEN 1980 1940 A$ = CHR$ (A - ( ASC ("a") - ASC ("A"))) 1960 GOTO 2020 1980 GOSUB 14300: REM RING BELL 2000 GOTO 1820 2020 RETURN 2040 : 2060 : 2100 REM ==GAME SUBROUTINE== 2120 GOSUB 3600: REM SETUP GRAPHICS 2140 GOSUB 9600: REM CHOOSE A SECRET WORD 2160 POKE 49168,0: REM CLEAR KEYB BUFFER 2180 NLIMBS = 0:GAMEOVER = 0 2200 FOR I = 0 TO 30:GZ%(I) = 0: NEXT I 2220 HOME: VTAB 21 2300 REM --GUESS LOOP-- 2320 GOSUB 7400: REM DISPLAY STATUS 2340 GOSUB 7700: REM GET A GUESS 2360 GOSUB 8100: REM CHECK GUESS 2380 IF GAMEOVER = 0 THEN 2300 2400 RETURN 2420 : 2440 : 2500 REM ==SETUP SCREEN== 2520 TEXT : HOME : CB$ = "an" : CA$ = "ANIMAL" 2540 A$ = "Welcome to HANGMAN!": GOSUB 3000: PRINT : PRINT 2560 PRINT "You have been condemned for execution." 2580 PRINT "To escape this fate, you must guess" 2600 PRINT "the secret word (";CB$;" ";CA$;") by " 2620 PRINT "choosing letters from the alphabet." 2640 PRINT 2660 PRINT "The secret word's letters will be shown" 2680 PRINT "as dashes at first, and then will" 2700 PRINT "change to letters as you guess them." 2720 PRINT 2740 PRINT "With each incorrect guess, one body" 2760 PRINT "part will be added to the gallows." 2780 PRINT "Guess the secret word before all your" 2800 PRINT "limbs are hanging!" 2820 PRINT 2840 A$ = "Press any key to begin!": GOSUB 3000 2841 POKE 49168,0: REM CLEAR KEYB BUFFER 2842 I=1: REM Initialize random number generator 2845 IF ( PEEK (49152) > 127) THEN 2860 2848 I = I + 1 2850 IF I > 127 THEN 2842 2852 GOTO 2845 2860 GET A$ 2863 L=RND(-I) 2880 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE 2900 RETURN 2920 : 2940 : 3000 REM ==PRINT CENTERED== 3020 HTAB (40 / 2 - LEN (A$) / 2) 3040 PRINT A$; 3060 RETURN 3080 : 3100 : 3200 REM ==SETUP LIMBS== 3220 DIM LIMBS$(11) 3240 LIMBS$(1) = "HEAD" 3260 LIMBS$(2) = "LEFT EYE" 3280 LIMBS$(3) = "RIGHT EYE" 3300 LIMBS$(4) = "NOSE" 3320 LIMBS$(5) = "MOUTH" 3340 LIMBS$(6) = "TORSO" 3360 LIMBS$(7) = "LEFT ARM" 3380 LIMBS$(8) = "RIGHT ARM" 3400 LIMBS$(9) = "LEFT LEG" 3420 LIMBS$(10) = "RIGHT LEG" 3440 LIMBS$(11) = "***HANGMAN***" 3460 RETURN 3480 : 3500 : 3600 REM ==SETUP GRAPHICS== 3620 IF (GG = 0) THEN 3680 3640 HGR : GW=280 : GH=160 : REM THIS IS ALL FOR NOW 3660 GOSUB 3800: REM DRAW GALLOWS 3680 RETURN 3700 : 3720 : 3800 REM ==DRAW GALLOWS== 3820 IF (GG = 0) THEN 3980 3840 HCOLOR=1:FOR I=GH-1 TO 152 STEP -1:HPLOT 0,I TO GW-1,I:NEXT I 3860 HCOLOR=3 3880 FOR I=152 TO 148 STEP -1:HPLOT 70,I TO 210,I:NEXT I 3900 FOR I=80 TO 88:HPLOT I,10 TO I,152:NEXT I 3920 FOR I=10 TO 18:HPLOT 88,I TO 147,I:NEXT I 3940 FOR I=0 TO 7:HPLOT 80,48+I TO 110+I,18:NEXT I 3960 FOR I=147 TO 145 STEP -1:HPLOT I,18 TO I,30:NEXT I 3980 RETURN 4000 : 4020 : 4100 REM ==DRAW LIMB== 4120 IF (GG = 0) THEN 4180 4140 ON NLIMBS GOSUB 4300, 4500, 4700, 4900, 5100, 5500, 5600, 5700, 5800, 5900 4160 GOTO 4200 4180 VTAB 21: HTAB 1: CALL -868: PRINT "Your ";LIMBS$(NLIMBS);" is now hanging!": 4200 RETURN 4220 : 4240 : 4300 REM ==DRAW HEAD== 4320 REM Note: It'd be quicker (and use less code) to just HPLOT out the 4340 REM circle by hand rather than calling my CIRCLE2 subroutine, but 4360 REM then the trigonometry lesson would be wasted. 4380 HCOLOR=2 4400 REM HPLOT 126,30 TO 166,30 TO 166,70 TO 126,70 TO 126,30 4420 RADIUS=20:CX=146:CY=50:FILL=0:GOSUB 6000 4440 RETURN 4460 : 4480 : 4500 REM ==DRAW LEFT EYE== 4520 HCOLOR=6:HPLOT 137,43 TO 140,43 4540 HPLOT 136,44 TO 141,44 4560 HPLOT 137,45 TO 140,45 4580 RETURN 4600 : 4620 : 4700 REM ==DRAW RIGHT EYE== 4720 HCOLOR=6:HPLOT 152,43 TO 155,43 4740 HPLOT 151,44 TO 156,44 4760 HPLOT 152,45 TO 155,45 4780 RETURN 4800 : 4820 : 4900 REM ==DRAW NOSE== 4920 HCOLOR=0: 4940 IF (FILL=1) THEN 4980 4960 HCOLOR=3 4980 HPLOT 146,48 TO 143,52 TO 146,52 5000 RETURN 5020 : 5040 : 5100 REM ==DRAW MOUTH== 5120 HCOLOR=5: HPLOT 140,60 TO 143,56 TO 149,56 TO 152,60 5140 RETURN 5160 : 5180 : 5200 REM ==DRAW SMILEY MOUTH== 5220 IF GG=0 THEN 5440 5240 HCOLOR=0: HPLOT 140,60 TO 143,56 TO 149,56 TO 152,60 5260 HCOLOR=0 5280 HPLOT 146,70 TO 146,106:HPLOT 146,88 TO 116,58:HPLOT 146,88 TO 176,58 5300 HPLOT 146,106 TO 116,140:HPLOT 146,106 TO 176,140 5320 GOSUB 3880 5340 IF (NLIMBS < 1) THEN GOSUB 4380 5360 IF (NLIMBS < 2) THEN GOSUB 4500 5380 IF (NLIMBS < 3) THEN GOSUB 4700 5400 IF (NLIMBS < 4) THEN GOSUB 4900 5420 HCOLOR=5: HPLOT 138,60 TO 143,64 TO 149,64 TO 154,60 5440 RETURN 5460 : 5480 : 5500 REM ==DRAW TORSO== 5520 HCOLOR=2: HPLOT 146,70 TO 146,106 5540 RETURN 5560 : 5580 : 5600 REM ==DRAW LEFT ARM== 5620 HPLOT 146,88 TO 116,58 5640 RETURN 5660 : 5680 : 5700 REM ==DRAW RIGHT ARM== 5720 HPLOT 146,88 TO 176,58 5740 RETURN 5760 : 5780 : 5800 REM ==DRAW LEFT LEG== 5820 HPLOT 146,106 TO 116,140 5840 RETURN 5860 : 5880 : 5900 REM ==DRAW RIGHT LEG== 5920 HPLOT 146,106 TO 176,140 5940 RETURN 5960 : 5980 : 6000 REM *** SUBROUTINE: CIRCLE2 6020 REM * IN: RADIUS 6040 REM * IN: CX (X COORDINATE OF CENTER) 6060 REM * IN: CY (Y COORDINATE OF CENTER) 6080 REM * IN: FILL (0 OR 1) 6100 REM *** 6120 PI = ATN (1) * 4: REM = 3.14159265 6140 I0 = PI / 2:I1 = 0:DI = PI / (RADIUS * 4) 6160 I1 = I1 - 0.1: REM SLOP TO FILL IN LAST LINE 6180 I = I0 6200 IF (I < = I1) THEN 7360 6220 X0 = - 666:X1 = - 666:Y0 = - 666 6300 REM 6320 DX = COS (I) * RADIUS:X = INT (0.5 + CX - DX) 6340 DY = SIN (I) * RADIUS:Y = INT (0.5 + CY - DY) 6400 REM PRINT "X = ";X;", Y = ";Y 6420 IF (X0 = - 666) THEN 6500 6440 IF (Y0 < > Y) THEN 6600 6460 X1 = X 6480 GOTO 7300 6500 REM FIRST POINT IN NEW LINE 6520 X0 = X:X1 = X:Y0 = Y: GOTO 7300 6600 REM END OF LINE 6620 IF X0 < = - 666 THEN 7200 6640 R0X = CX + (CX - X0) 6660 IF R0X < GW THEN 6700 6680 R0X = GW - 1 6700 R1X = CX + (CX - X1) 6720 IF R1X < GW THEN 6760 6740 R1X = GW - 1 6760 IF X0 > = 0 THEN 6800 6780 X0 = 0 6800 IF X1 > = 0 THEN 6840 6820 X1 = 0 6840 Y2 = CY + (CY - Y0) 6900 REM DRAW THE LINE(S) 6920 REM PRINT "HPLOT ";X0;",";Y0;" TO ";R0X;",";Y0 6940 REM GET A$:IF (A$ = "Q") THEN END 6960 IF (Y0 < 0) OR (Y0 > = GH) THEN 7040: REM LINE NOT ON SCREEN 6980 IF FILL = 0 THEN 7020 7000 HPLOT X1,Y0 TO R1X,Y0: GOTO 7040 7020 HPLOT X1,Y0 TO X0,Y0: HPLOT R0X,Y0 TO R1X,Y0 7040 IF (Y2 < 0) OR (Y2 > = GH) THEN 7120 7060 IF FILL = 0 THEN 7100 7080 HPLOT X1,Y2 TO R1X,Y2: GOTO 7120 7100 HPLOT X1,Y2 TO X0,Y2: HPLOT R0X,Y2 TO R1X,Y2 7120 Y0 = Y0 + 1:Y2 = Y2 - 1 7140 IF Y0 < = Y THEN 6960 7200 REM END OF DRAWING LINE 7220 I = I - DI 7240 GOTO 6200 7300 REM END OF RADIAN, PREPARE NEXT 7320 I = I - DI 7340 IF (I > I1) THEN 6300 7360 RETURN 7400 REM ==DISPLAY STATUS== 7420 REM HOME 7440 IF CHEET = 0 THEN 7520 7460 VTAB 21: HTAB 1: CALL -868: PRINT "* Pssst... the word is ";SECRET$;"." 7480 D = 2: GOSUB 800 7500 CHEET=0 7520 I = SW / 2 - LEN (HIDDEN$) / 2 7540 IF I < 1 THEN 7580 7560 VTAB 22: HTAB I 7580 PRINT HIDDEN$ 7600 RETURN 7620 : 7640 : 7700 REM ==GET A GUESS== 7720 OGUESS$ = "" 7740 FOR I = 0 TO 25 7760 IF (GZ%(I) > 0) THEN 7820 7780 OGUESS$ = OGUESS$ + CHR$ ( ASC ("A") + I) 7800 GOTO 7840 7820 OGUESS$ = OGUESS$ + "." 7840 NEXT I 7860 VTAB 23: CALL - 868 7880 VTAB 24: HTAB 1: PRINT "Guess? (";OGUESS$;") "; 7900 GOSUB 1800:GUESS$ = A$ 7920 IF (GZ%( ASC (A$) - ASC ("A")) = 0) THEN 7980 7940 GOSUB 14300: REM RING BELL ON DUPE GUESS 7960 GOTO 7880 7980 GZ%( ASC (A$) - ASC ("A")) = 1 8000 HTAB 1: CALL - 868 8020 L=ASC(A$) - ASC("A") + 1:FOR I=1 TO L:D=RND(1):NEXT I:REM TWEAK RANDOM 8025 RETURN 8040 : 8060 : 8100 REM ==CHECK GUESS== 8120 OK = 0:DUP = 0:TK = 0:NHIDDEN$ = "" 8140 FOR I = 1 TO LEN (SECRET$) 8160 IF I = 1 THEN 8200 8180 NHIDDEN$ = NHIDDEN$ + " " 8200 A$ = MID$ (HIDDEN$,2 * I - 1,1) 8220 IF (A$ = "_") THEN 8260 8240 TK = TK + 1 8260 IF ( MID$ (SECRET$,I,1) < > GUESS$) THEN 8340 8280 IF (A$ = GUESS$) THEN DUP = 1 8300 A$ = GUESS$ 8320 OK = OK + 1 8340 NHIDDEN$ = NHIDDEN$ + A$ 8360 NEXT I 8380 IF (DUP = 1) THEN 8900 8400 IF (OK = 0) THEN 9000 8420 TK = TK + OK 8440 IF TK = LEN (SECRET$) THEN 9400 8500 REM CORRECT GUESS 8520 IF (SND > 0) THEN POKE 768,32: POKE 769,12: CALL 770 8540 RARE$ = "QZXJ":FRARE = 0 8560 FOR I = 1 TO LEN (RARE$) 8580 IF ( MID$ (RARE$,I,1) = GUESS$) THEN FRARE = 1 8600 NEXT I 8620 IF FRARE = 0 THEN 8660 8640 PRINT "Glorious!!!";: GOTO 8780 8660 I = INT ( RND (1) * 3) + 1 8680 ON I GOTO 8720,8740,8760 8700 PRINT "Whaa? This wasn't supposed to happen.";: GOTO 8780 8720 PRINT "Bah! Lucky guess.";: GOTO 8780 8740 PRINT "Nice work!";: GOTO 8780 8760 PRINT "Good job!";: GOTO 8780 8780 HIDDEN$ = NHIDDEN$ 8800 D=2: GOSUB 800:HTAB 1: CALL -868:GOTO 9520 8900 REM DUPLICATE GUESS 8920 PRINT "You already guessed '";GUESS$;"'."; 8940 GOTO 9520 9000 REM WRONG GUESS 9020 I=20: GOSUB 14200: REM BZZZ 9040 PRINT "Wrong! The secret word has no '";GUESS$;"'."; 9060 NLIMBS = NLIMBS + 1 9080 GOSUB 4100: REM SHOW NEWLY ADDED LIMB ON THE GALLOWS 9100 IF (LIMBS$(NLIMBS + 1) = "***HANGMAN***") THEN 9200 9120 D=1: GOSUB 800:CALL -868:GOTO 9520 9200 REM YOU LOSE 9220 GAMEOVER = 1 9240 PRINT : HTAB 1: CALL -868: PRINT "You lose. The secret word was... " 9260 HTAB 1: CALL -868: PRINT " ";SECRET$;"." 9280 A$ = "48 ,27 ,57 ,54 ,72 ,54 ,114,255.": GOSUB 14000 9300 GOTO 9520 9400 REM YOU WIN 9420 HTAB 1: CALL -868: PRINT "You WIN! You solved the secret word, " 9440 HTAB 1: CALL -868: PRINT " ";SECRET$;"." 9460 A$ = "128,27 ,114,54 ,114,54 ,85 ,216.": GOSUB 14000 9480 GAMEOVER = 1 9500 GOSUB 5200 9520 RETURN 9540 : 9560 : 9600 REM ==SELECT WORD== 9620 HOME:VTAB 24:PRINT "Choosing word, please wait..."; 9640 NR = 0 9660 NR = NR + 1: IF (NR > 100) THEN ES$ = "COULD NOT LOAD A VALID WORD": GOTO 1620 9680 IF NW < = 0 THEN ES$ = "NO WORDS LOADED": GOTO 1620 9700 RESTORE 9720 WI = INT ( RND (1) * NW) + 1 9740 IF WI = WO THEN 9720: REM DON'T PICK SAME WORD 9760 FOR I = 1 TO WI 9780 READ SECRET$ 9800 NEXT I 9820 OK = 0:AA = ASC ("A"):AZ = ASC ("Z") 9840 FOR I = 1 TO LEN (SECRET$) 9860 C = ASC ( MID$ (SECRET$,I,1)) 9880 IF (C < AA) OR (C > AZ) THEN 9920 9900 OK = OK + 1 9920 NEXT I 9940 IF ( LEN (SECRET$) < 3) OR ( LEN (SECRET$) > 20) THEN OK = 0: GOTO 10200 10000 REM IF (EZ = 1) AND ( LEN (SECRET$) > 5) THEN OK = 0: GOTO 10200 10020 A$ = SECRET$: GOSUB 12100: REM SET WD=WORD DIFFICULTY 10100 REM HTAB 1:PRINT "___ ";SECRET$;" = ";WD 10120 IF (EZ = 1) AND (WD > 0.36) THEN OK = 0 10140 IF (EZ = 2) AND ((WD < = 0.36) OR (WD > 0.66)) THEN OK = 0 10160 IF (EZ = 3) AND (WD < = 0.66) THEN OK = 0 10180 IF (OK > 0) THEN 10320 10200 REM ==WORD NOT OK, PICK ANOTHER== 10220 WI = WI + 1 10240 IF (WI > NW) THEN GOTO 9660 10260 NR = NR + 1: IF (NR > 100) THEN ES$ = "COULD NOT LOAD A VALID WORD": GOTO 1620 10280 READ SECRET$ 10300 GOTO 9820 10320 WO = WI 10400 REM SECRET$="TYRANNOSAURUS REX" : REM FOR TESTING 10420 HIDDEN$ = "" 10440 FOR I = 1 TO LEN (SECRET$) 10460 IF I = 1 THEN 10500 10480 HIDDEN$ = HIDDEN$ + " " 10500 C = ASC ( MID$ (SECRET$,I,1)) 10520 IF (C < AA) OR (C > AZ) THEN 10560 10540 HIDDEN$ = HIDDEN$ + "_": GOTO 10580 10560 HIDDEN$ = HIDDEN$ + MID$ (SECRET$,I,1) 10580 NEXT I 10600 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE 10620 RETURN 10640 : 10660 : 10700 REM ==COUNT AVAILABLE WORDS== 10720 REM THE ARRAYS BELOW ARE USED TO CALCULATE LETTER FREQUENCIES, WHICH IN 10740 REM TURN ARE USED TO CATEGORIZE WORDS INTO EASY, MEDIUM, AND HARD LEVELS. 10760 REM THE FQ TABLE IS INITIALIZED TO THE FREQUENCIES CORRESPONDING TO 10780 REM OVERALL ENGLISH LANGUAGE USAGE. IF CQ<>0, THEN WE OVERWRITE THESE 10800 REM WITH THE FREQS DETERMINED FROM THE WORD LIST ITSELF, WHICH IS MORE 10820 REM MORE ACCURATE BUT TAKES A LOT OF TIME TO DO AT STARTUP. 10840 DIM FQ(27),FC(27) 10860 FQ(0) = 8.167: REM "A" 10880 FQ(1) = 1.492 10900 FQ(2) = 2.782 10920 FQ(3) = 4.253 10940 FQ(4) = 12.702 10960 FQ(5) = 2.228 10980 FQ(6) = 2.015 11000 FQ(7) = 6.094 11020 FQ(8) = 6.966 11040 FQ(9) = 0.153 11060 FQ(10) = 0.772 11080 FQ(11) = 4.025 11100 FQ(12) = 2.406 11120 FQ(13) = 6.749 11140 FQ(14) = 7.507 11160 FQ(15) = 1.929 11180 FQ(16) = 0.095 11200 FQ(17) = 5.987 11220 FQ(18) = 6.327 11240 FQ(19) = 9.056 11260 FQ(20) = 2.758 11280 FQ(21) = 0.978 11300 FQ(22) = 2.360 11320 FQ(23) = 0.150 11340 FQ(24) = 1.974 11360 FQ(25) = 0.074: REM "Z" 11380 CQ = 0 11400 FOR I = 0 TO 26:FC(I) = 0: NEXT I 11420 RESTORE :NW = 0:NB = 0 11440 READ SECRET$ 11460 IF SECRET$ = "*NO MORE WORDS*" THEN 11700 11480 IF (CQ = 0) THEN 11620 11500 L = LEN (SECRET$):AA = ASC ("A"):AZ = ASC ("Z") 11520 FOR I = 1 TO L 11540 C = ASC ( MID$ (SECRET$,I,1)) 11560 IF (C < AA) OR (C > AZ) THEN 11600 11580 C = C - AA:FC(C) = FC(C) + 1 11600 NEXT I 11620 NW = NW + 1 11640 IF NW > 10000 THEN ES$ = "INVALID WORD DATA": GOTO 1620 11660 IF ( LEN (SECRET$) < 3) OR ( LEN (SECRET$) > 20) THEN NB = NB + 1 11680 GOTO 11440 11700 IF (NW < 1) OR (NB > = NW) THEN ES$ = "INVALID WORD DATA": GOTO 1620 11800 REM COMPUTE ALPHABET FREQUENCIES 11820 FOR I = 0 TO 25:FC(26) = FC(26) + FC(I): NEXT I 11840 IF CQ = 0 THEN 11900 11860 FOR I = 0 TO 25:FQ(I) = FC(I) * 100 / FC(26): NEXT I 11900 REM GOSUB 12600 11920 REM GOSUB 12800 11940 REM A$="YAK": GOSUB 12100 11960 RETURN 11980 : 12000 : 12100 REM ==CALCULATE WORD DIFFICULTY== 12120 IF (FQ(0) < = 0) THEN 12440 12140 WD = 0:AA = ASC ("A"):AZ = ASC ("Z") 12160 L = LEN (A$) 12180 FOR I = 1 TO L 12200 C = ASC ( MID$ (A$,I,1)) 12220 IF (C < AA) OR (C > AZ) THEN 12280 12240 QC = FQ(C - AA) 12260 WD = WD + 1 / (QC * QC) 12280 NEXT I 12300 IF (WD < = 0) OR (L < = 0) THEN 12440 12400 REM WD = WD / L 12420 GOTO 12500 12440 WD = 0 12500 REM HTAB 1:PRINT:PRINT "DIFFICULTY FOR ";A$;" = ";WD;".":PRINT 12520 RETURN 12540 : 12560 : 12600 REM ==PRINT FREQUENCIES== 12620 HTAB 1: PRINT : PRINT 12640 AA = ASC ("A") 12660 FOR I = 1 TO 13 12680 PRINT CHR$ (AA + I - 1);": ";FQ(I - 1);" "; CHR$ (AA + I - 1 + 13);": ";FQ(I - 1 + 13) 12700 NEXT I 12720 PRINT : INPUT "PRESS RETURN TO CONTINUE...";A$ 12740 RETURN 12760 : 12780 : 12800 REM ==CALCULATE AVERAGE WORD DIFFICULTY== 12820 RESTORE 12840 NW = 0:TD = 0:D0 = 999999:D9 = - 1:W0$ = "":W9$ = "" 12860 READ SECRET$ 12880 IF SECRET$ = "*NO MORE WORDS*" THEN 13000 12900 A$ = SECRET$: GOSUB 12100 12920 NW = NW + 1:TD = TD + WD 12940 IF WD < D0 THEN D0 = WD:W0$ = A$ 12960 IF WD > D9 THEN D9 = WD:W9$ = A$ 12980 GOTO 12860 13000 IF NW < = 0 THEN 13140 13020 TD = TD / NW 13040 HTAB 1: PRINT : PRINT 13060 PRINT "AVG DIFFICULTY = ";TD 13080 PRINT "EASIEST WORD = ";D0;", ";W0$ 13100 PRINT "HARDEST WORD = ";D9;", ";W9$ 13120 PRINT : INPUT "PRESS RETURN TO CONTINUE...";A$ 13140 RETURN 13160 : 13180 : 13200 REM ================== 13220 REM DATA SECTION: 13240 REM SECRET WORDS ARE 13260 REM LISTED BELOW. 13280 REM ================== 13300 NW = 0: REM NUMBER OF WORDS LOADED 13320 SECRET$ = "" 13340 WI = - 1: REM SECRET WORD # 13360 WO = - 1: REM PREVIOUS SECRET WORD # 13380 DATA ALLIGATOR,ANT,APE,BAT,BEAR,BEE,BIRD,BOBCAT,CAT,CENTIPEDE,CHEETAH,CHICKEN,CHIMPANZEE,CLAM,COBRA 13400 DATA CONDOR,COUGAR,COW,CROCODILE,DEER,DINGO,DOG,DONKEY,DUCK,EAGLE,ELECTRIC EEL,ELEPHANT,ELK,EMU,FISH,FOX,FROG,GAZELLE 13420 DATA GIRAFFE,GOAT,GOOSE,GORILLA,GRIZZLY BEAR,HAWK,HEDGEHOG,HIPPOPOTAMUS,HORSE,HYENA,IGUANA,JAGUAR 13440 DATA JELLYFISH,KANGAROO,KRILL,LEMUR,LEOPARD,LION,LIZARD,LLAMA,LOBSTER,LYNX,MOLE,MONKEY,MOOSE,NEWT 13460 DATA OCTOPUS,OKAPI,OPOSSUM,ORANGUTAN,OTTER,OWL,PANDA,PENGUIN,PIG,POLAR BEAR,PORCUPINE,PUMA,QUAIL 13480 DATA RABBIT,RACCOON,REINDEER,RHINOCEROS,SCORPION,SEA LION,SEAL,SHARK,SHRIMP,SNAIL,SNAKE,SPIDER,SQUID 13500 DATA SQUIRREL,TIGER,TOAD,TORTOISE,TUNA,TURKEY,TURTLE,TYRANNOSAURUS REX,VOLE,VULTURE,WALRUS,WARTHOG,WASP,WHALE,WILDCAT,WILDEBEEST 13520 DATA WOLF,WORM,YAK,ZEBRA 13540 DATA "*NO MORE WORDS*" 13600 REM THIS VERSION OF THE PROGRAM 13620 REM HAS DATA BUILT-IN, RATHER 13640 REM THAN USING A DATAFILE. 13660 GOSUB 10700 13680 RETURN 13700 : 13720 : 13800 REM ==INSTALL TONE GENERATOR== 13820 IF (SND = 0) THEN 13880 13840 POKE 770, 173: POKE 771, 48: POKE 772, 192: POKE 773, 136: POKE 774, 208: POKE 775, 5: POKE 776, 206: POKE 777, 1: POKE 778, 3: POKE 779, 240 13860 POKE 780, 9: POKE 781, 202: POKE 782, 208: POKE 783, 245: POKE 784, 174: POKE 785, 0: POKE 786, 3: POKE 787, 76: POKE 788, 2: POKE 789, 3: POKE 790, 96 13880 RETURN 13900 : 13920 : 14000 REM ==PLAY TUNE== 14020 REM A$ = "128,27 ,114,54 ,114,54 ,85 ,216." 14040 IF (SND = 0) THEN 14140 14060 L=LEN(A$) 14080 I=1 14100 IF (I+7 > L) THEN 14140 14120 POKE 768,VAL(MID$(A$,I,3)): POKE 769,VAL(MID$(A$,I+4,3)): CALL 770: I = I + 8: GOTO 14100 14140 RETURN 14160 : 14180 : 14200 REM ==BUZZ SPEAKER== 14220 L=PEEK(-16336):I=I-1:IF (I > 0) THEN 14220 14240 RETURN 14260 : 14280 : 14300 REM ==RING BELL== 14320 IF (SND = 0) THEN 14360 14340 CALL -198: REM COULD ALSO JUST PRINT CHR$(7) 14360 RETURN