1000 !-------------------! 1010 ! ALPHA SCRABBLE ! 1020 !-------------------! 1030 ! MODIFIED FOR MULTI-PLAYERS JUNE 1984, RIC WEINSTEIN,PRESTON MACON 1040 REM ...... COPYRIGHT JAN 1983, BOB FOWLER 1050 1060 !-------------------! 1070 ! MAP DEFINITIONS ! 1080 !-------------------! 1090 MAP1 INLINE,S,100 1100 REM ...... LETTERS (98 LETTERS + 2 WILDCARDS) 1110 MAP1 L1 1120 MAP2 L11$,S,50,"AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHIIIIIIIIIJKLLL" 1130 MAP2 L12$,S,50,"LMMNNNNNNOOOOOOOOPPQRRRRRRSSSSTTTTTTUUUUVVWWXYYZ**" 1140 MAP1 L2, @L1 1150 MAP2 ALLTILES$,S,100 1160 MAP1 TILES$,S,100 1170 1180 REM ...... ARRAY OF BOARD LETTERS (ALPHA) 1190 MAP1 B1 1200 MAP2 BOARDL$(15,15),S,1 ! Actual letters in board (or blanks) 1210 MAP1 B2, @B1 1220 MAP2 BOARDL$,S,225 ! Used for whole-board searches 1230 1240 REM ...... ARRAY OF BOARD SCORES 1250 MAP1 B3 1260 MAP2 BOARDS(15,15),B,1 ! 0=blank or wildcard , 1-10=letter score 1270 MAP1 B4, @B3 1280 MAP2 B5$,S,225 ! Used to initialize BOARDS array 1290 1300 REM ...... ARRAY OF PREMIUMS 1310 MAP1 P1 1320 MAP2 PREMIUM(15,15),S,1 ! 0=none , 1=DL , 2=TL , 3=DW , 4=TW 1330 MAP1 P2, @P1 1340 MAP2 P301$,S,15,"400100040001004" 1350 MAP2 P302$,S,15,"030002000200030" 1360 MAP2 P303$,S,15,"003000101000300" 1370 MAP2 P304$,S,15,"100300010003001" 1380 MAP2 P305$,S,15,"000030000030000" 1390 MAP2 P306$,S,15,"020002000200020" 1400 MAP2 P307$,S,15,"001000101000100" 1410 MAP2 P308$,S,15,"400100030001004" 1420 MAP2 P309$,S,15,"001000101000100" 1430 MAP2 P310$,S,15,"020002000200020" 1440 MAP2 P311$,S,15,"000030000030000" 1450 MAP2 P312$,S,15,"100300010003001" 1460 MAP2 P313$,S,15,"003000101000300" 1470 MAP2 P314$,S,15,"030002000200030" 1480 MAP2 P315$,S,15,"400100040001004" 1490 1500 REM ...... TEST PLAY DATA ARRAYS 1510 REM ...... MULTIPLAY STORES ALL POSSIBLE PLAYS FROM 1 TABLE ENTRY 1520 REM # OF MULTIPLAYS RARELY EXCEEDS 10, BUT CAN ! 1530 MAP1 MULTIPLAY(20) 1540 MAP2 MPROW,B,1 1550 MAP2 MPCOL,B,1 1560 MAP2 MPDIR,B,1 ! 0,1 FOR HORIZONTAL/VERTICAL 1570 MAP2 MPSCORE,B,2 1580 MAP1 MMP,F,6,20 ! MAXIMUM # OF WORDS IN MULTI-PLAY SCAN 1590 1600 REM ...... TABLEPLAYS STORES THE WORD TABLE DISPLAYED ON CRT 1610 MAP1 TABLEPLAY'ALL(11) ! ARRAY SIZE MUST = MTP+1 (SEE BELOW) 1620 MAP2 TABLEPLAY ! THIS ARRAY MATCHES MULTIPLAY ARRAY ABOVE 1630 MAP3 TPROW,B,1 1640 MAP3 TPCOL,B,1 1650 MAP3 TPDIR,B,1 ! 0,1 FOR HORIZONTAL/VERTICAL 1660 MAP3 TPSCORE,B,2 1670 MAP2 TPWORD$,S,15 1680 MAP1 MTP,F,6,10 ! MAXIMUM # OF WORDS IN TABLE OF PLAYS 1690 1700 REM ...... ACTUALPLAY STORES THE POSITIONS PLAYED (IN CASE OF ERASURE) 1710 MAP1 ACTUAL'PLAY(7) 1720 MAP2 PROW,B,1 1730 MAP2 PCOL,B,1 1740 MAP2 PCHAR$,S,1 1750 MAP1 NPTILES,F,6 ! NUMBER OF TILES PLAYED 1760 1770 REM ...... MISCELLANEOUS MAPS 1780 REM --------------- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1790 MAP1 LVAL$,S,52," 1 3 3 2 1 4 2 4 1 8 5 1 3 1 1 310 1 1 1 1 4 4 8 410" 1800 MAP1 RACK$(4),S,7 ! LETTERS IN PLAYERS' RACKS 1810 MAP1 LRACK$(4),S,7 ! PLAYER'S LAST RACK 1820 MAP1 NRACK$(4),S,7 ! NEW RACK (DURING REARRANGE) 1830 MAP1 WORKRACK$(4),S,7 ! WORK RACK AREA 1840 MAP1 PLAY$,S,15 ! WORD "PLAYED" ON BOARD 1850 MAP1 PLAYUCS$,S,15 ! PLAY IN UP CASE 1860 MAP1 PLAYWILD$,S,15 ! PLAY IN UPPER CASE + WILDCARDS 1870 MAP1 P3 1880 MAP2 PLAYSCR(15),B,1 ! LETTER VALUES IN PLAY 1890 MAP1 P4 1900 MAP2 PLAYWSCR(15),B,1 ! LETTER VALUES IN PLAY + WILDCARD CHANGES 1910 MAP1 CROSS'WORD$,S,15 ! CROSS WORD (PERPENDICULAR TO PLAY) WORK AREA 1920 MAP1 CWORD'SAVES(10) ! EXTRA WORDS DATA 1930 MAP2 CROSS'WORDS$,S,15 1940 MAP2 CROSS'WORD'SCORES,B,2 1950 MAP1 HOLES$,S,15 ! (INTERSECTION) HOLES IN PLAY WORD 1960 MAP1 FHOLE,F,6 ! FIRST HOLE IN PLAY WORD 1970 MAP1 CHAR$,S,1 ! 1-LETTER WORK AREA 1980 MAP1 NPLAYERS,B,4,1 ! NUMBER OF PLAYERS 1990 MAP1 ME(4),B,1 ! USER'S PLAYER NUMBER 2000 ME(1)=1:ME(2)=2:ME(3)=3:ME(4)=4 2010 MAP1 REPLACE$,S,7 ! REPLACEMENT TILES 2020 MAP1 SCORES(4),F,6 ! ALL PLAYERS' SCORES 2030 MAP1 VOWELS$,S,10,"AEIOUY*" ! ALL WORDS MUST HAVE >0 OF THESE 2040 MAP1 NOYES$,S,1 ! QUERY (Y,N,Q) 2050 MAP1 TEMP'FIELDS 2060 MAP2 WAIT,F,6 2070 MAP2 SEED,F,6 2080 MAP2 NOPLAYS,F,6 2090 MAP2 SCORE(4),F,6 2100 MAP2 LSCORE,F,6 2110 MAP2 NTP,F,6 2120 MAP2 YYY,F,6 2130 MAP2 SELECT,F,6 2140 MAP2 I,F,6 2150 MAP2 LP,F,6 2160 MAP2 NERROR,F,6 2170 MAP2 NHOLES,F,6 2180 MAP2 NMP,F,6 2190 MAP2 NVOWEL,F,6 2200 MAP2 LVALAN,F,6 2210 MAP2 NOLD,F,6 2220 MAP2 NNEW,F,6 2230 MAP2 MROW,F,6 2240 MAP2 MCOL,F,6 2250 MAP2 DROW,F,6 2260 MAP2 DCOL,F,6 2270 MAP2 PL,F,6 2280 MAP2 LMATCH,F,6 2290 MAP2 NMATCH,F,6 2300 MAP2 WN,F,6 2310 MAP2 CASE,F,6 2320 MAP2 R,F,6 2330 MAP2 L,F,6 2340 MAP2 FILEN,F,6 2350 MAP2 FNAME$,S,10 2360 MAP2 THERE,F,6 2370 MAP2 DTP,F,6 2380 MAP2 ITP,F,6 2390 MAP2 LTIME,F,6 2400 MAP2 ROW,F,6 2410 MAP2 COL,F,6 2420 MAP2 CLEAR,F,6 2430 MAP2 DUMMY,F,6 2440 MAP2 LVALA,F,6 2450 MAP2 P,F,6 2460 MAP2 WORD'SCORE,F,6 2470 MAP2 MULTIPLIER,F,6 2480 MAP2 PLAY'SCORE,F,6 2490 MAP2 IROW,F,6 2500 MAP2 ICOL,F,6 2510 MAP2 NCROSS,F,6 2520 MAP2 NINTERSECT,F,6 2530 MAP2 CROSS'FLAG,F,6 2540 MAP2 CROSS'WORD'SCORE,F,6 2550 MAP2 CROSS'MULTIPLIER,F,6 2560 MAP2 CWDIR,F,6 2570 MAP2 C1$,S,10 2580 MAP2 C2$,S,10 2590 MAP2 DUP,F,6 2600 MAP2 LVALN,F,6 2610 MAP2 LVALA$,S,10 2620 MAP2 FROW,F,6 2630 MAP2 CROW,F,6 2640 MAP2 FCOL,F,6 2650 MAP2 CCOL,F,6 2660 MAP2 CDROW,F,6 2670 MAP2 CDCOL,F,6 2680 MAP2 ROWX,F,6 2690 MAP2 COLX,F,6 2700 MAP2 AA,X,1 2710 MAP2 INITIALS(4),S,10 2720 !-------------! 2730 ! NEXT GAME ! 2740 !-------------! 2750 2760 NEXT'GAME: 2770 WAIT=0 2780 !ON ERROR GO TO ABORT'GAME 2790 SEED=0 ! DELETE 2800 PRINT TAB(-1,0); 2810 INPUT "DO YOU WISH TO RESTART A PREVIOUS GAME ? ";YN$ 2820 IF YN$[1,1] = "Y" THEN GOTO RESTART 2830 INPUT "ENTER RND SEED (DEFAULTS TO RANDOM SEED) : ",SEED ! ****** DELETE 2840 IF(SEED=0) THEN RANDOMIZE ELSE DUMMY=RND(-SEED) ! DELETE 2850 ENTER'PLAYERS: 2860 PRINT 2870 INPUT "ENTER THE NUMBER OF PLAYERS (FROM 1 TO 4) ";NPLAYERS 2880 IF (NPLAYERS <1) OR (NPLAYERS > 4) THEN PRINT TAB(24,1); "INVALID NUMBER... PLEASE RE-ENTER" : GOTO ENTER'PLAYERS 2890 PRINT 2900 FOR X = 1 TO NPLAYERS 2910 PRINT "ENTER PLAYER #";STR(X);"'S NAME "; : INPUT "";INITIALS(X) 2920 PRINT 2930 NEXT X 2940 PRINT TAB(-1,0); TAB(-1,12); 2950 REM ...... ASK FOR INITIALS ? USE INITIALS & STORE FINAL SCORES ? 2935 REM ...... PICK RANDOM NUMBER TO DECIDE WHO GOES FIRST 2960 REM ...... CLEAR BOARD OF LETTERS 2970 B5$="" ! initialize BOARDS values 2980 BOARDL$=SPACE(225) ! initialize BOARDL$ and BOARDL$(n,n) 2990 3000 REM ...... SHUFFLE LETTER "TILES" 3010 ! RANDOMIZE ! ****** REMOVE "!" AFTER DEBUGGING 3020 TILES$=ALLTILES$ ! START OFF WITH FULL 100 TILES 3030 GOSUB SHUFFLE'LETTERS 3040 GOSUB DISPLAY'BOARD 3050 GOSUB DISPLAY'MENU 3060 NOPLAYS=1 ! =0 AFTER FIRST PLAY 3070 FOR I = 1 TO 4 : SCORE(I)=0 : NEXT I 3080 LSCORE=0 ! SCORE BEFORE LAST MOVE 3090 3100 NEXT'TURN: 3110 NTP=0 : WILDCARD'LETTER$ = "" 3120 YYY = YYY + 1 3130 IF YYY = (NPLAYERS+1) THEN YYY = 1 3140 IF YYY = SKIP THEN PRINT TAB(23,1);TAB(-1,9);CHR$(7);"Player # ";& STR(YYY);" lost turn because of challenge. CR to Continue"; : & INPUT "";AAA :PRINT TAB(23,1);TAB(-1,9); SKIP = 0 :& GOTO NEXT'TURN 3150 NEXT'TILE: 3160 IF(LEN(RACK$(YYY))=7 OR LEN(TILES$)=0) THEN GO TO DISPLAY'RACKS 3170 RACK$(YYY)=RACK$(YYY)+TILES$[1,1] ! PICK A TILE, ANY TILE 3180 TILES$=TILES$[2,LEN(TILES$)] ! REMOVE FROM PILE 3190 GO TO NEXT'TILE 3200 3210 DISPLAY'RACKS: 3220 LRACK$(YYY)=RACK$(YYY) 3230 LSCORE=SCORE(YYY) 3240 GOSUB DISPLAY'ALL'RACKS 3250 IF(LEN(RACK$(YYY)) > 0) THEN GO TO MENU 3260 3270 REM ...... WE HAVE USED UP ALL THE REMAINING TILES ! 3280 REM GAME IS OVER & THIS PLAYER GETS EXTRA POINTS 3255 REM (= SUM OF ALL UNPLAYED TILES IN OTHER PLAYERS' RACKS) 3290 GO TO END'GAME 3300 3310 !-------------! 3320 ! MAIN MENU ! 3330 !-------------! 3340 3350 MENU: 3360 SELECT=0 3370 PRINT TAB(16,50);SPACE(28);TAB(-1,12);TAB(16,50);"What next ? : ";CHR(7); 3380 INPUT "" SELECT 3390 PRINT TAB(24,1); TAB(-1,9); 3400 GOSUB WAIT 3410 ON SELECT GO TO REARRANGE'RACK,TRY'WORD,MAKE'PLAY,REPLACE'LETTERS 3420 ON SELECT-04 GO TO MENU2,QUIT,DELETE'PLAY 3430 ON SELECT-90 GO TO DISPLAY'TILES,SET'WAIT,REDO'DISPLAY,MEMORY 3440 ON SELECT-94 GO TO CONVENTION,TRAIL 3450 PRINT "Error --- illegal selection"; CHR(7); 3460 GO TO MENU 3470 3480 REARRANGE'RACK: 3490 PRINT TAB(16,50);TAB(-1,9);TAB(-1,12);"Enter letters";CHR(7); 3500 PLAY$="" 3510 NRACK$(YYY)="" 3520 3530 REARRANGE: 3540 IF(PLAY$="") THEN GO TO DISPLAY'ARR 3550 CHAR$=PLAY$[1,1] 3560 I=INSTR(1,RACK$(YYY),CHAR$) 3570 IF(I <> 0) THEN GO TO OK'ARR 3580 PRINT "Error---"; CHAR$; " not in rack"; CHR(7); 3590 GO TO DISPLAY'ARR 3600 3610 OK'ARR: 3620 NRACK$(YYY)=NRACK$(YYY)+CHAR$ 3630 PLAY$=PLAY$[2,LEN(PLAY$)] 3640 IF(I=1) THEN RACK$(YYY)=RACK$(YYY)[2,LEN(RACK$(YYY))] : GO TO REARRANGE 3650 RACK$(YYY)=RACK$(YYY)[1,I-1]+RACK$(YYY)[I+1,LEN(RACK$(YYY))] : GO TO REARRANGE 3660 3670 DISPLAY'ARR: 3680 PRINT TAB(ME(YYY)+18,18); NRACK$(YYY); SPACE(8); TAB(ME(YYY)+18,26); RACK$(YYY);!SPACE(8); 3690 IF(LEN(RACK$(YYY))=0) THEN RACK$(YYY)=NRACK$(YYY) : & GOSUB DISPLAY'RACK : GO TO MENU 3700 PRINT TAB(ME(YYY)+18,18+LEN(NRACK$(YYY))); 3710 PLAY$="" 3720 INPUT "" PLAY$ 3730 PRINT TAB(24,1); TAB(-1,9); 3740 IF(LEN(PLAY$)=0) THEN PLAY$=RACK$(YYY) 3750 GO TO REARRANGE 3760 3770 TRY'WORD: 3780 IF(NTP=MTP) THEN PRINT CHR(7); : GO TO MENU 3790 IF(NTP=0) THEN GOSUB DISPLAY'TABLE'TITLE 3800 PRINT TAB(16,50);SPACE(29);TAB(16,50);TAB(-1,12); "If no more words, hit return"; 3810 PRINT TAB(-1,11); TAB(NTP+1+4,49); NTP+1 USING "#Z"; " ";SPACE(27);TAB(-1,30);TAB(NTP+1+4,52); 3820 INPUT LINE "" PLAY$ 3830 LP=LEN(PLAY$) 3840 GOSUB WAIT 3850 3860 REM ....... CHECK FOR RETURN (USER HAS NO MORE WORDS TO TRY) 3870 IF(LP > 0) THEN GO TO CHECK'ONE 3880 PRINT TAB(NTP+1+4,49);SPACE(30);TAB(NTP+1+4,49); 3890 IF(NTP=0) THEN GOSUB ERASE'TABLE 3900 GO TO MENU 3910 3920 CHECK'ONE: 3930 PRINT TAB(24,1); TAB(-1,9); 3940 IF(LP=1) THEN PRINT "Error --- need > 1 letters"; CHR(7); : GO TO TRY'WORD 3950 PLAYUCS$=UCS(PLAY$) 3960 NERROR=0 3970 NHOLES=0 3980 NMP=0 3990 NVOWEL=0 4000 4010 REM ...... SCAN PLAY WORD 4020 FOR I=1 TO LP 4030 CHAR$=PLAYUCS$[I,I] 4040 IF(CHAR$ <> PLAY$[I,I]) THEN NHOLES=NHOLES+1 : GO TO SCRL 4050 IF(CHAR$ >="A" AND CHAR$ <= "Z") THEN GO TO SCRL 4060 IF(CHAR$ <> "*") THEN NERROR=NERROR+1 ELSE PLAYSCR(I)=0 4070 GO TO ENDL1 4080 SCRL: 4090 GOSUB LETTER'SCORE 4100 PLAYSCR(I)=LVALN 4110 NVOWEL=NVOWEL+INSTR(1,VOWELS$,CHAR$) 4120 ENDL1: 4130 NEXT I 4140 4150 REM ...... ANY VOWELS ? 4160 IF(NVOWEL=0) THEN PRINT "Error---no vowels"; CHR(7); : GO TO TRY'WORD 4170 IF(NERROR=0) THEN GO TO DO'TRY 4180 PRINT "Error ---"; NERROR; "illegal letters (use A-Z,a-z,*)"; CHR(7); 4190 GO TO TRY'WORD 4200 4210 DO'TRY: 4220 REM ...... IF THERE ARE >0 HOLES, WE MAY SAFELY SCAN BOARD 4230 IF(NHOLES > 0) THEN GO TO SCAN'BOARD 4240 REM ...... IF NO HOLES, ASK FOR ROW,COLUMN,DIRECTION & BYPASS SCAN 4215 NOLD=0 : NNEW=0 4250 PRINT TAB(-1,12); 4260 FOR I=1 TO 15 : PRINT TAB(I+2,46); I USING "#Z"; : NEXT I 4270 ENTER'ROW: 4280 PRINT TAB(16,50); TAB(-1,9); TAB(-1,12); 4290 PRINT "Hit return to scan whole board"; 4300 GOSUB WAIT 4310 MROW=0 4320 PRINT TAB(NTP+1+4,67);SPACE(13);TAB(-1,30);TAB(-1,11);TAB(NTP+1+4,67); 4330 INPUT "" MROW 4340 PRINT TAB(24,1); TAB(-1,9); 4350 IF(MROW=0) THEN GO TO HELP'COLUMN 4360 IF(MROW >= 1 AND MROW <= 15) THEN GO TO HELP'COLUMN 4370 PRINT "Error --- must be 1 to 15"; CHR(7); 4380 GO TO ENTER'ROW 4390 4400 HELP'COLUMN: 4410 FOR I=1 TO 15 : PRINT TAB(I+2,46); " "; : NEXT I 4420 IF(MROW=0) THEN GO TO SCAN'BOARD 4430 PRINT TAB(-1,12); 4440 PRINT TAB(18,1); "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15"; 4450 ENTER'COLUMN: 4460 PRINT TAB(16,50); TAB(-1,9); 4470 MCOL=0 4480 PRINT TAB(NTP+1+4,71); SPACE(8); TAB(-1,11);TAB(NTP+1+4,71); 4490 INPUT "" MCOL 4500 PRINT TAB(24,1); TAB(-1,9); 4510 IF(MCOL >= 1 AND MCOL <= 15) THEN GO TO HELP'DIRECTION 4520 PRINT "Error --- must be 1 to 15"; CHR(7); 4530 GO TO ENTER'COLUMN 4540 4550 HELP'DIRECTION: 4560 PRINT TAB(18,1); SPACE(44); 4570 ENTER'DIRECTION: 4580 CHAR$="" 4590 PRINT TAB(16,50); TAB(-1,9); TAB(-1,12); 4600 PRINT "Enter H(orizontal),V(ertical)"; 4610 PRINT TAB(NTP+1+4,75); TAB(-1,11); 4620 INPUT "" CHAR$ 4630 PRINT TAB(16,50); TAB(-1,9); 4640 PRINT TAB(24,1); TAB(-1,9); 4650 CHAR$=UCS(CHAR$) 4660 IF(CHAR$="H") THEN DROW=0 : DCOL=1 : GO TO CHECK'8'8 4670 IF(CHAR$="V") THEN DROW=1 : DCOL=0 : GO TO CHECK'8'8 4680 PRINT CHR(7); 4690 GO TO ENTER'DIRECTION 4700 4710 CHECK'8'8: 4720 IF (BOARDL$(8,8) <> "") THEN GOTO GOOD'INPUT 4730! IF(BOARDL$ <> "") THEN GO TO GOOD'INPUT ! CHECK FOR FIRST PLAY OF GAME 4740 IF(MROW > 8 OR (MROW+((LP-1)*DROW)) < 8) THEN GO TO BAD'INPUT 4750 IF(NOT(MCOL > 8 OR MCOL+(LP-1)*DCOL < 8)) THEN GO TO GOOD'INPUT 4760 4770 BAD'INPUT: 4780 PRINT "Error --- first play must cover center (8,8)"; CHR(7); 4790 GO TO ENTER'ROW 4800 GOOD'INPUT: 4810 PL=1 4820 GOSUB TEST'PLAY 4830 4840 CHECK'OLD'NEW: 4850 IF(NNEW > 0) THEN GO TO TRY'WORD 4860 PRINT "Warning --- no new plays possible"; 4870 IF(NOLD > 0) THEN PRINT " ("; STR$(NOLD); " moves already in table)"; 4880 GO TO TRY'WORD 4890 4900 SCAN'BOARD: 4910 IF(BOARDL$="") THEN GO TO FIRST'PLAY 4920 PL=0 ! PLAY LETTER BEING SCANNED 4930 NEXT'PL: 4940 IF(PL=LP) THEN GO TO END'SCAN 4950 PL=PL+1 4960 IF(NHOLES > 0 AND PLAYUCS$[PL,PL]=PLAY$[PL,PL]) THEN GO TO NEXT'PL 4970 LMATCH=0 4980 4990 NEXT'MATCH: 5000 NMATCH=INSTR(LMATCH+1,BOARDL$,PLAYUCS$[PL,PL]) 5010 IF(NMATCH=0) THEN GO TO NEXT'PL 5020 MROW=INT((NMATCH-1)/15)+1 : MCOL=NMATCH-15*(MROW-1) 5030 DROW=0 : DCOL=1 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD 5040 DROW=1 : DCOL=0 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD 5050 LMATCH=NMATCH 5060 GO TO NEXT'MATCH 5070 5080 FIRST'PLAY: 5090 MROW=8 : MCOL=8 5100 PL=0 5110 FP1: 5120 PL=PL+1 5130 DROW=0 : DCOL=1 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD 5140 DROW=1 : DCOL=0 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD 5150 IF(PLTPSCORE(WN)) THEN WN=I 5250 NEXT I 5260 PRINT TAB(16,50); TAB(-1,9); TAB(-1,12); "Which word # ? :"; WN; 5270 PRINT TAB(16,67); 5280 INPUT "" WN 5290 GOSUB WAIT 5300 PRINT TAB(24,1); TAB(-1,9); 5310 IF(WN >= 1 AND WN <= NTP) THEN GO TO DO'PLAY 5320 PRINT "Error --- not in table"; CHR(7); 5330 GO TO MENU 5340 5350 DO'PLAY: 5360 NTP=WN 5370 CASE=1 5380 GOSUB PLAY'WORD 5390 GOSUB ERASE'TABLE 5400 SCORE(YYY)=SCORE(YYY)+TPSCORE(NTP) 5410 IF(EOF(1)=-1) THEN GO TO CHALLENGE 5420 PRINT #1,TPWORD$(NTP);TAB(15); 5430 PRINT #1, USING " #Z #Z !", TPROW(NTP),TPCOL(NTP),("HV")[TPDIR(NTP)+1,1]; 5440 PRINT #1, USING " #ZZZ #ZZZ", TPSCORE(NTP),SCORE(NTP); 5450 PRINT #1,YYY; 5460 PRINT #1,WILDCARD'LETTER$ 5470 5480 CHALLENGE: 5490 ! IF CHALLENGE SUCCEEDS ===> PLAYER LOSES TURN 5500 ! IF CHALLENGE FAILS ===> CHALLENGER LOSES NEXT TURN (FUTURE) 5510 ! AFTER CHALLENGE TIME, PLAYER IS IMMUNE TO FURTHER CHALLENGE 5520 CHAL = 1 : CALL DISPLAY'ALL'RACKS : CHAL = 0 5530 PRINT TAB(8,50);"Last word played was ";TPWORD$(NTP) 5540 PRINT TAB(10,50); 5550 INPUT "Challenge ?";CHAL$ 5560 IF CHAL$[1,1] <> "Y" THEN PRINT TAB(8,50);SPACE(29);TAB(10,50);& SPACE(29); : GOTO NEXT'TURN1 5570 PRINT TAB(10,50); 5580 INPUT "Player # that is challenging ";NUM 5590 SUCCEED: 5600 PRINT TAB(12,48); 5610 INPUT "Did challenge succeed ?";YESNO1$ 5620 FOR X = 8 TO 12 : PRINT TAB(X,48);SPACE(31); : NEXT X 5630 IF YESNO1$[1,1] = "Y" THEN SKIP = 0 : CALL UNPLAY'WORD : GOTO NEXT'TURN1 5640 IF YESNO1$[1,1] = "N" THEN SKIP = NUM : GOTO NEXT'TURN1 5650 GOTO SUCCEED 5660 NEXT'TURN1: 5670 REM ...... END 5680 IF LEN(RACK$(YYY)) = 0 AND TILES$ = SPACE(100) THEN GOTO END'GAME 5690 GO TO NEXT'TURN 5700 5710 REPLACE'LETTERS: 5720 REPLACE$="" 5730 PRINT TAB(16,50); TAB(-1,9); "Which letters ? : "; 5740 INPUT "" REPLACE$ 5750 PRINT TAB(24,1); TAB(-1,9); 5760 R=LEN(REPLACE$) 5770 IF(R=0) THEN PRINT CHR(7); : GO TO MENU 5780 IF(R > 7) THEN PRINT CHR(7); : GO TO REPLACE'LETTERS 5790 WORKRACK$(YYY)=RACK$(YYY) 5800 IF(LEN(TILES$) >= R) THEN GO TO REPLACE'CHECK 5810 PRINT "Error --- only"; LEN(TILES$); "tiles left"; CHR(7); 5820 GO TO REPLACE'LETTERS 5830 5840 REPLACE'CHECK: 5850 NERROR=0 5860 FOR L=1 TO R 5870 I=INSTR(1,WORKRACK$(YYY),REPLACE$[L,L]) 5880 IF(I=0) THEN NERROR=NERROR+1 : GO TO ENDL3 5890 IF(I=1) THEN WORKRACK$(YYY)=WORKRACK$(YYY)[I+1,LEN(WORKRACK$(YYY))] : GO TO ENDL3 5900 WORKRACK$(YYY)=WORKRACK$(YYY)[1,I-1]+WORKRACK$(YYY)[I+1,LEN(WORKRACK$(YYY))] 5910 ENDL3: 5920 NEXT L 5930 5940 IF(NERROR=0) THEN GO TO DO'REPLACE 5950 PRINT "Error --- mismatches rack"; CHR(7); 5960 GO TO REPLACE'LETTERS 5970 5980 DO'REPLACE: 5990 RACK$(YYY)=WORKRACK$(YYY)+TILES$[1,R] 6000 GOSUB DISPLAY'RACK 6010 TILES$=TILES$[R+1,LEN(TILES$)]+REPLACE$ 6020 GOSUB SHUFFLE'LETTERS 6030 IF(NTP > 0) THEN GOSUB ERASE'TABLE 6040 GO TO NEXT'TURN 6050 6060 QUIT: 6070 REM ------ CHANGE THIS FOR MULTIUSERS 6080 PRINT #1,"//" 6090 PRINT #1,BOARDL$ 6095 PRINT #1,B5$ 6100 PRINT #1,NPLAYERS 6110 FOR X = 1 TO NPLAYERS : PRINT #1,RACK$(X) : NEXT X 6120 FOR X = 1 TO NPLAYERS : PRINT #1,SCORE(X) : NEXT X 6130 FOR X = 1 TO NPLAYERS : PRINT #1,INITIALS(X) : NEXT X 6140 PRINT #1,TILES$ : PRINT #1,YYY 6150 GO TO END'GAME 6160 6170 MENU2: 6180 PRINT "5=this,6=quit,7=delete,"; 6190 PRINT "91=tiles,92=wait,93=crt,94=mem,95=demo,96=trail"; 6200 GO TO MENU 6210 6220 DISPLAY'TILES: 6230 L=LEN(TILES$) 6240 PRINT "Tiles left : "; 6250 FOR I=0 TO 5 : PRINT TILES$[10*I+1;10]; " "; : NEXT I 6260 ! IF(L > 60) THEN PRINT TAB(23,79-(L-60)); TILES$[61,L]; 6270 GO TO MENU 6280 6290 SET'WAIT: 6300 PRINT TAB(16,50); TAB(-1,9); "Seconds to wait : "; 6310 INPUT "" WAIT 6320 GO TO MENU 6330 6340 REDO'DISPLAY: 6350 PRINT TAB(-1,0); TAB(1,15); TAB(-1,12); "ALPHA SCRABBLE"; 6360 GOSUB DISPLAY'BOARD 6370 GOSUB DISPLAY'MENU 6380 GOSUB DISPLAY'ALL'RACKS 6390 GOSUB DISPLAY'TABLE 6400 GO TO MENU 6410 6420 MEMORY: 6430 PRINT "Memory left ="; MEM; "bytes"; 6440 GO TO MENU 6450 6460 CONVENTION: 6470 TILES$[ 1, 50]="NAEEIRLEFASSROOINEJPSTTIVOAEGADTWHANLEAEEIEGUMIQYV" 6480 TILES$[51,100]="SONPKEMFRXEGBIIBRNRU*IYTDLHTZWAOCOOLNOIDTUDUCAREA*" 6490 RACK$(YYY)="" 6500 GO TO NEXT'TURN 6510 6520 TRAIL: 6530 IF(EOF(1)=0) THEN GO TO MENU 6540 FILEN=0 6550 LOOKUP: 6560 FILEN=FILEN+1 6570 FNAME$="TRAIL."+STR(FILEN) 6580 LOOKUP FNAME$,THERE 6590 IF(THERE <> 0) THEN GO TO LOOKUP 6600 6610 REM ...... NAME FOUND 6620 OPEN #1, FNAME$, OUTPUT 6630 PRINT "Trail kept in file "; FNAME$; 6640 PRINT #1, "TRAIL OF SCRABBLE GAME FROM SEED"; SEED 6650 PRINT #1 6660 PRINT #1, "WORD----------- RW CL D SCOR TSCR P WL" 6670 GO TO MENU 6680 6690 REM ...... PUT OTHER SECRET COMMANDS HERE 6700 6710 DELETE'PLAY: 6720 IF(NTP=0) THEN PRINT "Error---no plays"; CHR(7); : GO TO MENU 6730 PRINT TAB(16,50); "Delete which # : "; 6740 DTP=0 6750 INPUT "" DTP 6760 PRINT TAB(24,1); TAB(-1,9); 6770 IF(DTP > 0 AND DTP <= NTP) THEN GO TO DO'DELETE 6780 PRINT "Error---out of range"; CHR(7); : GO TO MENU 6790 6800 DO'DELETE: 6810 NTP=NTP-1 6820 FOR ITP=DTP TO NTP+1 6830 IF(ITP <= NTP) THEN TABLEPLAY'ALL(ITP)=TABLEPLAY'ALL(ITP+1) 6840 NEXT ITP 6850 GOSUB DISPLAY'TABLE 6860 GO TO MENU 6870 6880 REM ...... STORE FINAL SCORES IN DATA FILE ? 6890 6900 WAIT: 6910 LTIME=TIME 6920 WAIT'LOOP: 6930 IF( (TIME-LTIME)/60 < WAIT) THEN GO TO WAIT'LOOP 6940 RETURN 6950 6960 END'GAME: 6970 ABORT'GAME: 6980 SAVE'YYY = YYY 6990! GOSUB DISPLAY'ALL'RACKS 7000 IF LEN(RACK$(YYY))<>0 THEN GOTO FINISH 7010 NEXT'END: 7020 YYY = YYY + 1 7030 IF YYY > NPLAYERS THEN YYY = 1 7040 IF YYY = SAVE'YYY THEN GOTO DETERMINE'WINNER 7050 CALL DISPLAY'RACK 7060 FOR I=1 TO LEN(RACK$(YYY)) 7070 CHAR$=RACK$(YYY)[I,I] 7080 GOSUB LETTER'SCORE 7090 TEMP'SCORE = TEMP'SCORE + LVALN 7100 NEXT I 7110 SCORE(YYY) = SCORE(YYY)-TEMP'SCORE 7120 SCORE(SAVE'YYY) = SCORE(SAVE'YYY)+TEMP'SCORE 7130 GOTO NEXT'END 7140 DETERMINE'WINNER: 7150 YYY = SAVE'YYY 7160 CALL DISPLAY'RACK 7170 WINNER = SCORE(1) : PLAYER = 1 7180 FOR X = 2 TO NPLAYERS 7190 IF WINNER < SCORE(X) THEN WINNER = SCORE(X) : PLAYER = X 7200 NEXT X 7210 PRINT TAB(10,50);"THE GAME IS OVER THE " 7220 PRINT TAB(12,50);"WINNER IS PLAYER #";STR(PLAYER);" ";INITIALS(PLAYER); 7230 PRINT TAB(14,50);"CONGRATULATIONS !" 7240 IF EOF(1) = 0 THEN CLOSE #1 7250 END 7260 FINISH: 7270 IF(NTP > 0) THEN GOSUB ERASE'TABLE 7280 PRINT TAB(-1,12); TAB(24,1); TAB(-1,9); 7290 IF(EOF(1)=0) THEN CLOSE #1 7300 END 7310 7320 !---------------------------! 7330 ! VARIOUS SCREEN DISPLAYS ! 7340 !---------------------------! 7350 7360 DISPLAY'BOARD: 7370 PRINT TAB(-1,36); 7380 PRINT TAB(1,15); "ALPHA SCRABBLE"; 7390 FOR ROW=1 TO 15 7400 FOR COL=1 TO 15 7410 GOSUB DISPLAY'LETTER 7420 NEXT COL 7430 NEXT ROW 7440 PRINT TAB(-1,11); 7450 FOR ROWX = 2 TO 15 7460 PRINT TAB(ROWX,80);TAB(-1,30);TAB(ROWX+1,45);TAB(-1,31); 7470 NEXT ROWX 7480 PRINT TAB(-1,23); 7490 FOR COLX = 3 TO 42 STEP 3 7500 FOR ROWX = 3 TO 17 7510 PRINT TAB(ROWX,COLX);TAB(-1,47); 7520 NEXT ROWX 7530 NEXT COLX 7540 PRINT TAB(-1,24); 7550 FOR X = 1 TO NPLAYERS : PRINT TAB(X+18,35); INITIALS(X); : NEXT X 7560 PRINT TAB(-1,37); 7570 RETURN 7580 7590 DISPLAY'MENU: 7600 PRINT TAB(16,50); "What next ? : "; 7610 PRINT TAB(18,50); "(1) Rearrange letters"; 7620 PRINT TAB(19,50); "(2) Try word"; 7630 PRINT TAB(20,50); "(3) Make play"; 7640 PRINT TAB(21,50); "(4) Replace letters"; 7650 PRINT TAB(22,50); "(5) 2nd Menu"; 7660 RETURN 7670 7680 ERASE'MENU: 7690 FOR I=16 TO 22 7700 PRINT TAB(I,50); TAB(-1,9); 7710 NEXT I 7720 RETURN 7730 7740 DISPLAY'ALL'RACKS: 7750 CLEAR=1 ! # OF SPACES TO CLEAR RACK DISPLAY 7760 PRINT TAB(-1,11); 7770 FOR I=1 TO NPLAYERS 7780 PRINT TAB(I+18,1);"Player #";STR$(I);" : ";SCORE(I) USING "#ZZZ";" "; 7790 REM ...... DISPLAY A "#" FOR EACH LETTER IN A PLAYER'S RACK AND LETTER VALUE 7800 PRINT ("####### #######")[1,15]; SPACE$(CLEAR); 7810 NEXT I 7820 IF CHAL = 1 THEN RETURN 7830 DISPLAY'RACK: 7840 PRINT TAB(23,1);:INPUT "CR TO CONTINUE ";AA:PRINT TAB(23,1);SPACE(17); 7850 PRINT TAB(-1,12); 7860 P