452 lines
16 KiB
Plaintext
452 lines
16 KiB
Plaintext
100 REM ***HANGMAN**
|
|
120 REM BY MIKE GLEASON, 1986, 2011
|
|
130 REM MODIFIED BY ALAN RATLIFF, 2020
|
|
140 REM
|
|
160 REM ==WELCOME SCREEN==
|
|
180 TEXT : PR#0 : HOME :SW = PEEK (33):ES$ = "": GG = 1: DD = 0.040: JY = 0
|
|
188 DD = 0.0010 : SND = 0: REM Hack to work in the JavaScript emulator
|
|
|
|
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$) / 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
|
|
|
|
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
|
|
|
|
1100 REM ==INITIALIZE PROGRAM==
|
|
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 KEYBD 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
|
|
1470 D = 53909/((EZ=2)*13+EZ*3+28)
|
|
1480 PRINT "Play again? (";: GU$ = "Yes/": GOSUB 1750: GU$ = "No": GOSUB 1750
|
|
1490 REM WHEN OFFERING NEW GAME, ALLOW PLAYER TO CHANGE DIFFICULTY LEVEL IF DESIRED
|
|
1500 FOR I = 1 TO 3: IF I<>EZ THEN PRINT "/";: GU$ = MID$("EasyMediumHard",(I=3)*2+I*4-3,I*2+2): GOSUB 1750
|
|
1510 NEXT: PRINT ") ";
|
|
1520 GOSUB 1800: A = ASC(A$)*2-107: I = D/A
|
|
1530 I = INT(I)=I: IF I THEN EZ = (A>31)+(A=37)+1
|
|
1540 IF A$ = "Y" OR I GOTO 1400
|
|
1550 ES$ = "": IF A$ <> "N" GOTO 1520
|
|
|
|
1600 REM ==CLEANUP AND EXIT==
|
|
1620 TEXT
|
|
1640 IF ES$ = "" THEN HOME: PRINT "GOOD BYE.": END
|
|
1660 GOSUB 14300: REM RING BELL
|
|
1680 PRINT : PRINT "* ERROR: ";ES$;"."
|
|
1700 END
|
|
|
|
1740 REM PRINT FIRST CHAR OF STRING GU$ INVERSE, THE REST NORMAL
|
|
1750 INVERSE: PRINT LEFT$(GU$,1);: NORMAL: PRINT MID$(GU$,2);: RETURN
|
|
|
|
1800 REM ==GET 1 UPPERCASE CHAR==
|
|
1820 GET A$
|
|
1840 IF A$ = CHR$ (1) THEN CHEET = 1
|
|
1860 IF A$ = CHR$ (27) OR A$ = CHR$ (3) THEN POP: GOTO 1600
|
|
1880 IF A$ > "_" THEN A$ = CHR$(ASC(A$) - 32)
|
|
1900 IF A$ < "A" OR A$ > "Z" THEN GOSUB 14300: GOTO 1820: REM RING BELL, TRY AGAIN
|
|
2020 RETURN
|
|
|
|
2100 REM ==GAME SUBROUTINE==
|
|
2120 GOSUB 9600: REM CHOOSE A SECRET WORD
|
|
2130 GOSUB 3600: REM SETUP GRAPHICS
|
|
2140 REM R=0:GOTO 7370 - WOULD DISPLAY TABLE OF WORDS AND THEIR DIFFICULTY SCORES
|
|
2150 OGUESS$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ": REM FULL ALPHABET AVAILABLE
|
|
2160 POKE 49168,0: REM CLEAR KEYB BUFFER
|
|
2180 NLIMBS = 0:GAMEOVER = 0
|
|
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 NOT GAMEOVER THEN 2300
|
|
2400 RETURN
|
|
|
|
2500 REM ==SETUP SCREEN==
|
|
2520 TEXT : CB$ = "an" : CA$ = "ANIMAL"
|
|
2525 VTAB 12:HTAB 14: INVERSE : PRINT "H A N G M A N": NORMAL:VTAB 24
|
|
2530 FOR I=1 TO 11:PRINT:FOR D=1 TO 90:NEXT D,I:VTAB 5
|
|
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
|
|
2850 GET A$
|
|
2860 I=RND(-PEEK(79)*999-PEEK(78))
|
|
2880 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE
|
|
2900 RETURN
|
|
|
|
3000 REM ==PRINT CENTERED==
|
|
3020 HTAB 20 - LEN (A$) / 2
|
|
3040 PRINT A$;
|
|
3060 RETURN
|
|
|
|
3500 REM ==DRAW SMILEY FACE==
|
|
3510 IF NOT GG THEN RETURN
|
|
3520 Z=0: HCOLOR=1: GOSUB 3880: REM ERASE GALLOWS
|
|
3530 ON NLIMBS<>4 GOSUB 4020: REM ERASE BODY, DRAW HEAD & FACE, AS NECESSARY
|
|
3540 HCOLOR=5: HPLOT 138,58 TO 143,62 TO 149,62 TO 154,58: REM DRAW SMILE
|
|
3550 RETURN
|
|
|
|
3600 REM ==SET UP GRAPHICS==
|
|
3620 IF NOT GG THEN RETURN
|
|
3640 HGR : GW=280 : GH=160 : Z=1 : REM THIS IS ALL FOR NOW
|
|
|
|
3800 REM ==DRAW GALLOWS==
|
|
3820 IF NOT GG THEN RETURN
|
|
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:HCOLOR=Z*3:NEXT I
|
|
3900 FOR I=80 TO 88:HPLOT I,10 TO I,147: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=145 TO 147:HPLOT I,18 TO I,29:NEXT I
|
|
3980 RETURN
|
|
|
|
4000 REM ==DRAW BODY PART==
|
|
4020 ON (NLIMBS<4 AND NOT Z)+NLIMBS GOTO 4300, 4500, 4700, 4900, 5500, 5400, 5300, 5200, 5100, 5000
|
|
|
|
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.
|
|
4370 REM N.B.: LESS CODE USED, REAL GEOMETRY LESSON NOT WASTED - SIN AND COS NOT NEEDED
|
|
4380 REM HCOLOR=2: HPLOT 126,30 TO 166,30 TO 166,70 TO 126,70 TO 126,30
|
|
4420 RADIUS=20: CX=146: CY=50: FILL=0: HC=2: GOSUB 6000
|
|
4430 IF Z THEN RETURN
|
|
|
|
4500 REM ==DRAW RIGHT EYE==
|
|
4510 REM (REMEMBER THAT THEIR RIGHT EYE WE SEE ON THE LEFT)
|
|
4520 HCOLOR=6:HPLOT 137,43 TO 140,43
|
|
4540 HPLOT 136,44 TO 141,44
|
|
4560 HPLOT 137,45 TO 140,45
|
|
4580 IF Z THEN RETURN
|
|
|
|
4700 REM ==DRAW LEFT 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 IF Z THEN RETURN
|
|
|
|
4900 REM ==DRAW NOSE==
|
|
4920 HCOLOR=(FILL<1)*3
|
|
4980 HPLOT 146,48 TO 143,52 TO 146,52
|
|
4990 RETURN
|
|
|
|
5000 REM ==DRAW LEFT LEG==
|
|
5020 HPLOT 146,106 TO 176,140 TO 188,133
|
|
5040 RETURN
|
|
|
|
5100 REM ==DRAW RIGHT LEG==
|
|
5120 HPLOT 146,106 TO 116,140 TO 104,133
|
|
5140 IF Z THEN RETURN
|
|
|
|
5200 REM ==DRAW LEFT ARM==
|
|
5220 HPLOT 146,88 TO 176,58
|
|
5240 IF Z THEN RETURN
|
|
|
|
5300 REM ==DRAW RIGHT ARM==
|
|
5320 HPLOT 146,88 TO 116,58
|
|
5340 IF Z THEN RETURN
|
|
|
|
5400 REM ==DRAW TORSO==
|
|
5420 IF Z THEN HCOLOR= 2
|
|
5430 HPLOT 146,70 TO 146,106
|
|
5440 IF Z THEN RETURN
|
|
|
|
5500 REM ==DRAW SAD MOUTH==
|
|
5520 HCOLOR=5*Z
|
|
5530 HPLOT 140,60 TO 143,56 TO 149,56 TO 152,60
|
|
5540 RETURN
|
|
|
|
6000 REM *** SUBROUTINE: CIRCLE2 (REWRITTEN SIMPLIFIED)
|
|
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 * IN: HC (HCOLOR)
|
|
6110 A=.06: F=.9982: HCOLOR=HC: R=1: REM R = ASPECT RATIO; CAN BE CHANGED TO DRAW ORTHOGONAL ELLIPSES
|
|
6120 FOR D=0 TO NOT FILL STEP .5
|
|
6130 X=RADIUS-D: Y=0: HPLOT X+CX,CY
|
|
6140 FOR I=1 TO 6.3/A: H=Y*A*R+X: Y=(Y-A*X/R)*F: X=F*H: HPLOT TO X+CX,Y+CY
|
|
6150 NEXT: NEXT: IF NOT FILL THEN RETURN
|
|
6160 REM FILL IN CIRCLE, IF SPECIFIED (NEVER USED)
|
|
6170 Y=0: FOR X=1-RADIUS TO 0
|
|
6180 FOR I=0 TO 1: I=HSCRN(CX+X,CY+Y): Y=Y+NOT I: NEXT
|
|
6190 HPLOT CX-X,CY-Y TO CX-X,CY+Y: HPLOT CX+X,CY-Y-1 TO CX+X,CY+Y
|
|
7290 NEXT: RETURN
|
|
|
|
7300 REM DISPLAY TABLE OF WORDS AND THEIR DIFFICULTY SCORES (NOT USED)
|
|
7320 TEXT:PR#3:H=1:X=0:Y=0:Z=0
|
|
7330 IF NOT R THEN RESTORE : FOR D = 1 TO 105: READ A$: REM ORIGINAL VERSION
|
|
7340 IF R THEN FOR D=1 TO 105:A$=W$(ASC(MID$(L$,D,1))): REM REVISED VERSION
|
|
7350 GOSUB 12120:IF PEEK(37)>20 THEN H=H+16:VTAB 1
|
|
7360 I=(WD<=.36)-(WD>.66):X=(I=1)+X:Y=Y+NOT I:Z=(I<0)+Z:WD=INT(WD*100+.5)/100+.003:HTAB (WD<10)+H:
|
|
7370 PRINT LEFT$(STR$(WD),5-(WD<10)) SPC(1) LEFT$(A$,9):NEXT:PRINT:PRINT "X=" X " Y=" Y " Z=" Z;
|
|
7380 IF R THEN PRINT SPC(1) C(1) "," C(2) "," C(3) SPC(1) S(1) "-" S(2) "-" S(3)
|
|
7390 END
|
|
|
|
7400 REM ==DISPLAY STATUS==
|
|
7420 REM HOME
|
|
7440 IF NOT CHEET 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 - LEN (HIDDEN$)) / 2
|
|
7540 IF I >= 1 THEN VTAB 22: HTAB I
|
|
7580 PRINT HIDDEN$
|
|
7600 RETURN
|
|
|
|
7700 REM ==GET A GUESS==
|
|
7880 VTAB 24: HTAB 1: PRINT "Guess? (";OGUESS$;") ";
|
|
7900 GOSUB 1800: L=ASC(A$) - 64
|
|
7920 IF MID$(OGUESS$,L,1) = "." THEN GOSUB 14300: GOTO 8900: REM RING BELL ON DUPE GUESS
|
|
7940 OGUESS$ = MID$(OGUESS$,1,L - 1) + "." + MID$(OGUESS$,L + 1): REMOVE FROM OGUESS$
|
|
7980 GUESS$ = A$
|
|
8000 HTAB 1: CALL - 868
|
|
8020 REM FOR I=0 TO L:D=RND(1):NEXT I:REM TWEAK RANDOM
|
|
8025 RETURN
|
|
|
|
8100 REM ==CHECK GUESS==
|
|
8120 OK = 0:TK = 1:NHIDDEN$ = "": VTAB 22
|
|
8140 A = LEN (SECRET$): FOR I = 1 TO A
|
|
8160 IF I > 1 THEN NHIDDEN$ = NHIDDEN$ + " "
|
|
8200 A$ = MID$ (HIDDEN$,2 * I - 1,1)
|
|
8220 TK = (A$ < "_") + TK
|
|
8260 D = MID$ (SECRET$,I,1) = GUESS$: IF D THEN A$ = GUESS$: OK = OK + 1
|
|
8340 NHIDDEN$ = NHIDDEN$ + A$
|
|
8360 IF D THEN HTAB 20 - A: PRINT NHIDDEN$; CHR$(7);: GOSUB 800
|
|
8380 NEXT I: PRINT: PRINT
|
|
8400 IF NOT OK THEN 9000
|
|
8440 IF TK + OK = I THEN 9400: REM WORD IS COMPLETE
|
|
8500 REM CORRECT GUESS
|
|
8620 D = 3518034/(127 - ASC(GUESS$)): I = INT ( RND (1) * 3)
|
|
8660 IF INT(D)=D THEN PRINT MID$("AwesomeGloriousEpic",I*8+NOT I,I+7) "!!!";: GOTO 8780: REM JUST FOR JQXZ
|
|
8680 ON I GOTO 8740,8760
|
|
8720 PRINT "Bah! Lucky guess.";: GOTO 8780
|
|
8740 PRINT "Nice work!";: GOTO 8780
|
|
8760 PRINT "Good job!";
|
|
8780 HIDDEN$ = NHIDDEN$
|
|
8800 HTAB 1: GOTO 9100
|
|
|
|
8900 REM DUPLICATE GUESS
|
|
8920 VTAB 24: HTAB 1: PRINT "You already guessed '";A$;"'.";
|
|
8940 CALL -868: D=2: HTAB 1: GOSUB 800: CALL -868: GOTO 7880
|
|
|
|
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 4000: REM SHOW NEWLY ADDED BODY PART ON THE GALLOWS
|
|
9100 D=2: IF NLIMBS<10 THEN GOSUB 800:CALL -868:RETURN
|
|
|
|
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 REM A$ = "48 ,27 ,57 ,54 ,72 ,54 ,114,255.": GOSUB 14000
|
|
9300 RETURN
|
|
|
|
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 REM A$ = "128,27 ,114,54 ,114,54 ,85 ,216.": GOSUB 14000
|
|
9480 GAMEOVER = 1
|
|
9500 GOTO 3500: REM DRAW SMILEY FACE
|
|
|
|
9600 REM ==SELECT WORD==
|
|
9620 HOME:VTAB 24:REM 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
|
|
|
|
9690 REM NEW SIMPLIFIED ALGORITHM (WITH ALL WORDS NOW ALREADY GROUPED BY DIFFICULTY)
|
|
9700 REM GOES THROUGH ALL WORDS IN GROUP ONCE; AFTERWARD PICKS FROM GROUP'S 9 WORDS LEAST RECENTLY SEEN
|
|
9710 WI = INT((C(EZ)+9*NOT C(EZ))*RND(1))+S(EZ)
|
|
9720 C(EZ) = C(EZ)-(C(EZ)>0)
|
|
9730 SECRET$ = W$(ASC(MID$(L$,WI,1))): REM FIND WORD IN INDEXED ARRAY
|
|
9740 REM MOVE CHOSEN WORD TO THE END OF ITS GROUP SO IT WON'T BE PICKED AGAIN FOR A LONG TIME
|
|
9750 IF WI+1<S(EZ+1) THEN L$ = MID$(L$,1,WI-1)+MID$(L$,WI+1,S(EZ+1)-WI-1)+MID$(L$,WI,1)+MID$(L$,S(EZ+1))
|
|
|
|
10320 WO = WI
|
|
10420 HIDDEN$ = ""
|
|
10440 FOR I = 1 TO LEN (SECRET$)
|
|
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: HIDDEN$ = MID$(HIDDEN$,2)
|
|
10600 HTAB 1: CALL - 868: REM ERASE STATUS MESSAGE
|
|
10620 RETURN
|
|
|
|
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
|
|
10820 REM MORE ACCURATE BUT TAKES A LOT OF TIME TO DO AT STARTUP.
|
|
10840 DIM W$(105),S(4),C(3),FQ(27),FC(27)
|
|
10860 DATA 8.167,1.492,2.782,4.253,12.702,2.228,2.015,6.094,6.966
|
|
11040 DATA .153,.772,4.025,2.406,6.749,7.507,1.929,.095,5.987
|
|
11220 DATA 6.327,9.056,2.758,.978,2.360,.150,1.974,.074,0
|
|
11380 CQ = 0
|
|
11400 NW = 0:NB = 0:L$ = ""
|
|
11420 FOR I = 0 TO 26: READ FQ(I): FC(I) = 0: NEXT I
|
|
11440 READ SECRET$
|
|
11460 IF SECRET$ = "*NO MORE WORDS*" THEN 11700
|
|
11480 L = LEN (SECRET$): IF CQ = 0 THEN 11620
|
|
11500 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: L$ = L$ + CHR$(NW): W$(NW) = SECRET$: REM STORE WORDS IN AN INDEXED ARRAY
|
|
11640 IF NW > 10000 THEN ES$ = "INVALID WORD DATA": GOTO 1620
|
|
11660 IF L < 3 OR L > 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 THEN 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
|
|
11942 VTAB 22:PRINT:CALL -958
|
|
11943 REM GROUP WORDS INTO EASY, MEDIUM, AND HARD BY REARRANGING INDEX STRING L$
|
|
11944 S(1)=1:S(2)=1:S(3)=1:S(4)=NW+1:J=1:FOR R=1 TO NW:A$=W$(R):GOSUB 12120
|
|
11946 D = (WD > .66)-(WD <= .36): C(D+2)=C(D+2)+1: S(2)=(D<0)+S(2): S(3)=(D<1)+S(3)
|
|
11948 IF D<0 AND R>1 THEN L$ = MID$(L$,J,1)+LEFT$(L$,J-1)+MID$(L$,J+1)
|
|
11950 IF D=1 THEN L$ = MID$(L$,1,J-1)+MID$(L$,J+1)+MID$(L$,J,1)
|
|
11952 J=(D<1)+J:NEXT:L$=L$+"X":REM R=1:GOTO 7370
|
|
11960 RETURN
|
|
|
|
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 WD = 0
|
|
12345 REM IF A SHORT WORD AND A LONG WORD SCORED THE SAME, THE SHORT WORD MUST HAVE 'HARDER' LETTERS
|
|
12400 WD = WD * 2.25 / SQR(L): REM
|
|
12500 REM HTAB 1:PRINT:PRINT "DIFFICULTY FOR ";A$;" = ";WD;".":PRINT
|
|
12520 RETURN
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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 (= 105)
|
|
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
|
|
13520 DATA WILDEBEEST,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 GOTO 10700
|
|
|
|
13800 REM ==INSTALL TONE GENERATOR== (REMOVED)
|
|
13820 RETURN
|
|
|
|
14000 REM ==PLAY TUNE== (REMOVED)
|
|
14020 REM A$ = "128,27 ,114,54 ,114,54 ,85 ,216."
|
|
14040 RETURN
|
|
|
|
14200 REM ==BUZZ SPEAKER==
|
|
14220 L=PEEK(-16336):I=I-1:IF I > 0 THEN 14220
|
|
14240 RETURN
|
|
|
|
14300 REM ==RING BELL==
|
|
14340 PRINT CHR$(7);
|
|
14360 RETURN
|